int __cache_init(DOMAINNODE_T * node) { node->urlDict = rb_dict_new((void *) key_cmp, NULL, NULL); assert(node->urlDict); node->updateItor = rb_itor_new(node->urlDict); assert(node->updateItor); return 0; }
int main(int argc, char *argv[]) { if (argc != 2) { printf("Expected filename argument.\n"); exit(1); } FILE *fp = fopen(argv[1], "r"); if (!fp) { printf("Unable to open file '%s'.\n", argv[1]); exit(1); } rb_tree *tree = rb_tree_new(dict_str_cmp, NULL); char buf[512]; while (fgets(buf, sizeof(buf), fp)) { if (isupper(buf[0])) /* Disregard proper nouns. */ continue; strtok(buf, "\r\n"); int freq[256] = { 0 }; memset(freq, 0, sizeof(freq)); ASSERT(buf[0] != '\0'); for (char *p = buf; *p; p++) freq[tolower(*p)]++; char name[1024]; char *p = name; for (int i=1; i<256; i++) { if (freq[i]) { ASSERT(freq[i] < 10); *p++ = (char) i; *p++ = '0' + (char) freq[i]; } } *p = 0; WordList* word = xmalloc(sizeof(*word)); word->word = xstrdup(buf); WordList** wordp = (WordList**)rb_tree_insert(tree, xstrdup(name), NULL); word->next = *wordp; *wordp = word; } rb_itor *itor = rb_itor_new(tree); for (rb_itor_first(itor); rb_itor_valid(itor); rb_itor_next(itor)) { WordList *word = *rb_itor_data(itor); ASSERT(word != NULL); if (word->next) { int count = 1; while (word->next) count++, word = word->next; printf("%2d:[", count); word = *rb_itor_data(itor); while (word) { printf("%s%c", word->word, word->next ? ',' : ']'); word = word->next; } printf("\n"); } word = *rb_itor_data(itor); while (word) { WordList *next = word->next; free(word->word); free(word); word = next; } } while (rb_itor_next(itor)); rb_itor_free(itor); rb_tree_free(tree); return 0; }