/* * Print subtree of root i */ static void recur_print_tree(rbtree_t *tree, uint32_t i) { if (i > 0) { recur_print_tree(tree, rbtree_node_left_child(tree, i)); printf(" %"PRIu32, rbtree_node_value(tree, i)); recur_print_tree(tree, rbtree_node_right_child(tree, i)); } }
int main(int argc, char **argv) { void *rbtree; unsigned i = 0; int c; char buf[256]; if (parse_args(argc, argv) == -1) { usage(); exit(1); } FILE *fp = NULL; if (!infile) { fp = stdin; } else { fp = fopen(infile, "r"); if (!fp) { fprintf(stderr, "Can't open file: %s\n", infile); exit(1); } } rbtree = rbtree_new(key_cmp, free, free); while ((c = fgetc(fp)) != EOF) { if (c == '\n') { buf[i] = '\0'; rbtree_insert(rbtree, strdup(buf), strdup(buf)); memset(buf, 0, sizeof buf); i = 0; } else { buf[i++] = c; } } if (infile) fclose(fp); if (export) { fp = fopen(export, "w"); rbtree_dump(fp, rbtree, key_string); fclose(fp); } if (interactive) { void *node; while (1) { i = 0; memset(buf, 0, sizeof buf); printf("\n> "); while ((c = getc(stdin))) { if (c == EOF || c == '\n') break; if (i >= 256) { printf("buffer exceeded\n"); goto done; } buf[i++] = c; } if (c == EOF) break; if (!*buf) continue; buf[i] = '\0'; char *op = buf; while (*op && *op != ' ') op++; if (*op) { *op = '\0'; op++; } if (strncasecmp(buf, "successor", strlen("successor")) == 0) { node = rbtree_get(rbtree, op); if (node) { void *n2 = rbtree_successor(rbtree, node); if (n2) printf("successor: %s => %s\n", key_string(rbtree_node_key(n2)), (char *)rbtree_node_value(n2)); else printf("no successor\n"); } else { printf("%s (not found)\n", op); } } else if (strncasecmp(buf, "predecessor", strlen("predecessor")) == 0) { node = rbtree_get(rbtree, op); if (node) { void *n2 = rbtree_predecessor(rbtree, node); if (n2) printf("predecessor: %s => %s\n", key_string(rbtree_node_key(n2)), (char *)rbtree_node_value(n2)); else printf("no predecessor\n"); } else { printf("%s (not found)\n", op); } } else { node = rbtree_get(rbtree, buf); if (node) printf("%s => %s\n", key_string(rbtree_node_key(node)), (char *)rbtree_node_value(node)); else printf("%s (not found)\n", buf); } } } done: rbtree_free(rbtree); if (infile) free(infile); if (export) free(export); return 0; }