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.2 by greg, Thu Jun 23 07:48:35 1994 UTC vs.
Revision 1.12 by schorsch, Sat Nov 15 17:54:06 2003 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines