return nodes;
}
+// ------------------------------- trie --------------------------------------
+
+void trie_put(trie_t**t, unsigned const char*id)
+{
+ if(!*t) {
+ (*t) = rfx_calloc(sizeof(trie_t));
+ (*t)->rest = (unsigned char*)strdup(id);
+ return;
+ }
+ if((*t)->rest && (*t)->rest[0]) {
+ // shift whatever's currently in here one node down
+ trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1);
+ (*t)->rest = 0;
+ }
+ if(id[0]) {
+ trie_put(&(*t)->row[id[0]], id+1);
+ } else {
+ (*t)->rest = "";
+ }
+}
+
+int trie_lookup(trie_t*t, unsigned const char*id)
+{
+ while(t) {
+ if(t->rest && !strcmp(t->rest, id))
+ return 1;
+ t = t->row[id[0]];
+ if(!*id)
+ return 0;
+ id++;
+ }
+ return 0;
+}
+
// ------------------------------- crc32 --------------------------------------
static unsigned int*crc32 = 0;
static void crc32_init(void)
int(*compare)(const void *, const void *);
} heap_t;
+typedef struct _trie {
+ struct _trie*row[256];
+ unsigned char*rest;
+} trie_t;
+
+
char* strdup_n(const char*str, int size);
unsigned int crc32_add_byte(unsigned int crc32, unsigned char b);
void heap_dump(heap_t*h, FILE*fi);
void** heap_flatten(heap_t*h);
+void trie_put(trie_t**t, unsigned const char*id);
+int trie_lookup(trie_t*t, unsigned const char*id);
+
array_t* array_new();
array_t* array_new2(type_t*type);
void array_free(array_t*array);