00001 /* 00002 * kmap.h 00003 * 00004 * Keyword Trie based Map Table 00005 * 00006 * Copyright(C) 2002 Marc A Norton 00007 * 00008 */ 00009 00010 #ifndef KTRIE_H 00011 #define KTRIE_H 00012 00013 #define ALPHABET_SIZE 256 00014 00015 00016 #ifdef WIN32 00017 00018 #ifndef inline 00019 #define inline __inline 00020 #endif 00021 00022 #else 00023 00024 #define inline 00025 00026 #endif 00027 00028 /* 00029 * 00030 */ 00031 typedef struct _keynode { 00032 00033 struct _keynode * next; 00034 00035 unsigned char * key; 00036 int nkey; 00037 void * userdata; /* data associated with this pattern */ 00038 00039 } KEYNODE; 00040 00041 /* 00042 * 00043 */ 00044 typedef struct _kmapnode { 00045 00046 int nodechar; /* node character */ 00047 00048 struct _kmapnode * sibling; 00049 struct _kmapnode * child; 00050 00051 KEYNODE * knode; 00052 00053 } KMAPNODE; 00054 00055 /* 00056 * 00057 */ 00058 typedef struct _kmap { 00059 00060 KMAPNODE * root[256]; /* KTrie nodes */ 00061 00062 KEYNODE * keylist; // list of key+data pairs 00063 KEYNODE * keynext; // findfirst/findnext node 00064 00065 void (*userfree)(void*p); // fcn to free user data 00066 00067 int nchars; // # character nodes 00068 00069 int nocase; 00070 00071 } KMAP; 00072 00073 /* 00074 * PROTOTYPES 00075 */ 00076 KMAP * KMapNew ( void (*userfree)(void*p) ); 00077 void KMapSetNoCase( KMAP * km, int flag ); 00078 int KMapAdd ( KMAP * km, void * key, int ksize, void * userdata ); 00079 void * KMapFind( KMAP * km, void * key, int ksize ); 00080 void * KMapFindFirst( KMAP * km ); 00081 void * KMapFindNext ( KMAP * km ); 00082 KEYNODE * KMapFindFirstKey( KMAP * km ); 00083 KEYNODE * KMapFindNextKey ( KMAP * km ); 00084 void KMapDelete(KMAP *km); 00085 00086 #endif 00087 00088