3 * $Id: key-fetch.c,v 1.1 2000/06/17 10:42:54 mdw Exp $
5 * Higher-level key unpacking
7 * (c) 2000 Straylight/Edgeware
10 /*----- Licensing notice --------------------------------------------------*
12 * This file is part of Catacomb.
14 * Catacomb is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Library General Public License as
16 * published by the Free Software Foundation; either version 2 of the
17 * License, or (at your option) any later version.
19 * Catacomb is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Library General Public License for more details.
24 * You should have received a copy of the GNU Library General Public
25 * License along with Catacomb; if not, write to the Free
26 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
30 /*----- Revision history --------------------------------------------------*
32 * $Log: key-fetch.c,v $
33 * Revision 1.1 2000/06/17 10:42:54 mdw
34 * Convenient table-driven extraction of structured keys.
38 /*----- Header files ------------------------------------------------------*/
40 #include <mLib/dstr.h>
45 /*----- Main code ---------------------------------------------------------*/
47 /* --- @key_fetchinit@ --- *
49 * Arguments: @const key_fetchdef *kf@ = pointer to base definition
50 * @key_packstruct *kps@ = pointer to destination packing def
51 * @void *p@ = pointer to destination block
53 * Returns: Pointer to packing definition.
55 * Use: Initializes a packing definition (@key_packdef@ structure).
56 * If @kps@ is null on entry, an appropriately sized block is
57 * allocated automatically. Otherwise it must be large enough.
60 static size_t kfcount(const key_fetchdef
*kf
)
72 key_packdef
*key_fetchinit(const key_fetchdef
*kf
,
73 key_packstruct
*kp
, void *p
)
75 size_t n
= 1 + kfcount(kf
);
80 /* --- If @kps@ is null, count the entries and allocate --- */
85 kp
= xmalloc(n
* sizeof(*kp
));
86 kp
->name
= (char *)kp
;
89 /* --- Fill in the top part --- */
91 kp
->kp
.kd
.e
= KENC_STRUCT
;
95 /* --- Initialize for the main loop --- */
101 /* --- Iterate over the entries in the table --- *
103 * The end of the target block is used as a stack to record where
104 * substructure is meant to occur. The integer @n@ is the depth of the
105 * stack; @kps@ is a full descending stack pointer. The @kp.p@ member of a
106 * stack element points back to an entry with substructure, the @kp.p@
107 * member of which refers to the @kf@ table for the substructure.
109 * This should all be about as clear as mud.
114 /* --- Blat out a level's worth --- */
119 if ((kf
->e
& KF_ENCMASK
) != KENC_STRUCT
)
120 kp
->kp
.p
= cp
+ kf
->off
;
123 kp
->kp
.p
= (void *)kf
->kf
;
133 /* --- Pop an entry from the stack --- */
136 key_packstruct
*kkp
= (kps
++)->kp
.p
;
143 /* --- We're done --- */
148 /* --- @key_fetch@ --- *
150 * Arguments: @key_packdef *kp@ = pointer to packing structure
151 * @key *k@ = key file containing desired key
153 * Returns: Error code, or zero.
155 * Use: Fetches an unpacked key from a packed one.
158 int key_fetch(key_packdef
*kp
, key
*k
)
164 e
= key_unpack(kp
, &k
->k
, &d
);
169 /* --- @key_fetchbyname@ --- *
171 * Arguments: @key_packdef *kp@ = pointer to packing structure
172 * @key_file *kf@ = key file containing desired key
173 * @const char *tag@ = user's tag describing the key
175 * Returns: Error code, or zero.
177 * Use: Fetches a named key from a key file and unpacks it
181 int key_fetchbyname(key_packdef
*kp
, key_file
*kf
, const char *tag
)
187 if (key_qtag(kf
, tag
, &d
, 0, &kd
))
190 e
= key_unpack(kp
, kd
, &d
);
195 /* --- @key_fetchdone@ --- *
197 * Arguments: @key_packdef *kp@ = pointer to packing structure
201 * Use: Frees a packing structure. If the structure was allocated by
202 * @key_fetchinit@ then it is freed.
205 void key_fetchdone(key_packdef
*kp
)
207 key_packstruct
*kps
= (key_packstruct
*)(((char *)kp
) -
208 offsetof(key_packstruct
, kp
));
214 /*----- That's all, folks -------------------------------------------------*/