ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/mgflib/lookup.h
(Generate patch)

Comparing ray/src/cv/mgflib/lookup.h (file contents):
Revision 1.1 by greg, Tue Jun 21 14:45:40 1994 UTC vs.
Revision 1.9 by gwlarson, Fri Sep 4 09:05:09 1998 UTC

# Line 3 | Line 3
3   /* SCCSid "$SunId$ LBL" */
4  
5   /*
6 < * Header file for table lookup routines
6 > * Header file for general associative table lookup routines
7   */
8  
9   typedef struct {
10 <        char    *key;           /* key name (dynamically allocated) */
10 >        char    *key;           /* key name */
11 >        long    hval;           /* key hash value (for efficiency) */
12          char    *data;          /* pointer to client data */
13   } LUENT;
14  
15 + #ifdef NOPROTO
16   typedef struct {
17 +        unsigned long   (*hashf)();     /* key hash function */
18 +        int     (*keycmp)();    /* key comparison function */
19 +        void    (*freek)();     /* free a key */
20 +        void    (*freed)();     /* free the data */
21          int     tsiz;           /* current table size */
22          LUENT   *tabl;          /* table, if allocated */
23 +        int     ndel;           /* number of deleted entries */
24   } LUTAB;
25 + #else
26 + typedef struct {
27 +        unsigned long   (*hashf)(char *);       /* key hash function */
28 +        int     (*keycmp)(const char *, const char *);  /* key comparison function */
29 +        void    (*freek)(char *);       /* free a key */
30 +        void    (*freed)(char *);       /* free the data */
31 +        int     tsiz;           /* current table size */
32 +        LUENT   *tabl;          /* table, if allocated */
33 +        int     ndel;           /* number of deleted entries */
34 + } LUTAB;
35 + #endif
36  
37 + #define LU_SINIT(fk,fd)         {lu_shash,strcmp,(void (*)())(fk),\
38 +                                (void (*)())(fd),0,NULL,0}
39 +
40   /*
41   * The lu_init routine is called to initialize a table.  The number of
42   * elements passed is not a limiting factor, as a table can grow to
# Line 24 | Line 45 | typedef struct {
45   * and the expected (minimum) table size.  The value returned is the
46   * actual allocated table size (or zero if there was insufficient memory).
47   *
48 < * It isn't fully necessary to initialize the LUTAB structure.  If it
49 < * is cleared (tsiz = 0, tabl = NULL), then the first call to lu_find
50 < * will allocate a minimal table.
48 > * The hashf, keycmp, freek and freed member functions must be assigned
49 > * separately.  If the hash value is sufficient to guarantee equality
50 > * between keys, then the keycmp pointer may be NULL.  Otherwise, it
51 > * should return 0 if the two passed keys match.  If it is not necessary
52 > * (or possible) to free the key and/or data values, then the freek and/or
53 > * freed member functions may be NULL.
54   *
55 + * It isn't fully necessary to call lu_init to initialize the LUTAB structure.
56 + * If tsiz is 0, then the first call to lu_find will allocate a minimal table.
57 + * The LU_SINIT macro provides a convenient static declaration for character
58 + * string keys.
59 + *
60   * The lu_find routine returns the entry corresponding to the given
61 < * key (any nul-terminated string).  If the entry does not exist, the
62 < * corresponding key field will be NULL.  It is the caller's responsibility
63 < * to (allocate and) assign the key field when creating a new entry.
64 < * If an entry exists, the corresponding data field indicates whether
65 < * or not it contains data, and this, too, is subject to user control
66 < * and interpretation.  The only case where lu_find returns NULL is
38 < * when the system has run out of memory.
61 > * key.  If the entry does not exist, the corresponding key field will
62 > * be NULL.  If the entry has been previously deleted but not yet freed,
63 > * then only the data field will be NULL.  It is the caller's
64 > * responsibility to (allocate and) assign the key and data fields when
65 > * creating a new entry.  The only case where lu_find returns NULL is when
66 > * the system has run out of memory.
67   *
68 + * The lu_delete routine frees an entry's data (if any) by calling
69 + * the freed member function, but does not free the key field.  This
70 + * will be freed later during (or instead of) table reallocation.
71 + * It is therefore an error to reuse or do anything with the key
72 + * field after calling lu_delete.
73 + *
74   * The lu_done routine calls the given free function once for each
75   * assigned table entry (i.e. each entry with an assigned key value).
76 < * The user must define this routine to free the key and the data
77 < * as appropriate.  The final action of lu_done is to free the
76 > * The user must define these routines to free the key and the data
77 > * in the LU_TAB structure.  The final action of lu_done is to free the
78   * allocated table itself.
79   */
80  
81   #ifdef NOPROTO
82   extern int      lu_init();
83   extern LUENT    *lu_find();
84 + extern void     lu_delete();
85   extern void     lu_done();
86 + extern unsigned long    lu_shash();
87   #else
88   extern int      lu_init(LUTAB *, int);
89   extern LUENT    *lu_find(LUTAB *, char *);
90 < extern void     lu_done(LUTAB *, void (*)(LUENT *));
90 > extern void     lu_delete(LUTAB *, char *);
91 > extern void     lu_done(LUTAB *);
92 > extern unsigned long    lu_shash(char *);
93   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines