rbtree
annotate test/rbshell/sym.c @ 15:1b77b72688fe
- fixed bug in rb_init making it ignore comparison functions other than the builtin
- fixed rb_find and rb_findi return type, which should be struct rbnode*, not void*
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 02 Nov 2014 11:00:27 +0200 |
parents | |
children |
rev | line source |
---|---|
nuclear@6 | 1 #include <stdio.h> |
nuclear@6 | 2 #include <stdlib.h> |
nuclear@6 | 3 #include <string.h> |
nuclear@6 | 4 #include "sym.h" |
nuclear@6 | 5 #include "rbtree.h" |
nuclear@6 | 6 |
nuclear@6 | 7 struct symbol { |
nuclear@6 | 8 char *name; |
nuclear@6 | 9 int id, arity; |
nuclear@6 | 10 }; |
nuclear@6 | 11 |
nuclear@6 | 12 static void del_func(struct rbnode *node, void *cls); |
nuclear@6 | 13 |
nuclear@6 | 14 struct rbtree *symbols; |
nuclear@6 | 15 |
nuclear@6 | 16 int init_sym(void) |
nuclear@6 | 17 { |
nuclear@6 | 18 if(!(symbols = rb_create(RB_KEY_STRING))) { |
nuclear@6 | 19 fprintf(stderr, "failed to create symbol table\n"); |
nuclear@6 | 20 return -1; |
nuclear@6 | 21 } |
nuclear@6 | 22 rb_set_delete_func(symbols, del_func, 0); |
nuclear@6 | 23 return 0; |
nuclear@6 | 24 } |
nuclear@6 | 25 |
nuclear@6 | 26 void destroy_sym(void) |
nuclear@6 | 27 { |
nuclear@6 | 28 rb_free(symbols); |
nuclear@6 | 29 } |
nuclear@6 | 30 |
nuclear@6 | 31 int add_sym(const char *name, int id, int arity) |
nuclear@6 | 32 { |
nuclear@6 | 33 struct symbol *sym; |
nuclear@6 | 34 |
nuclear@6 | 35 if(!(sym = malloc(sizeof *sym)) || !(sym->name = malloc(strlen(name) + 1))) { |
nuclear@6 | 36 perror("failed to allocate symbol"); |
nuclear@6 | 37 free(sym); |
nuclear@6 | 38 return -1; |
nuclear@6 | 39 } |
nuclear@6 | 40 strcpy(sym->name, name); |
nuclear@6 | 41 sym->id = id; |
nuclear@6 | 42 sym->arity = arity; |
nuclear@6 | 43 |
nuclear@6 | 44 return rb_insert(symbols, sym->name, sym); |
nuclear@6 | 45 } |
nuclear@6 | 46 |
nuclear@6 | 47 int sym_lookup(const char *str) |
nuclear@6 | 48 { |
nuclear@6 | 49 struct rbnode *node; |
nuclear@6 | 50 |
nuclear@6 | 51 if(!(node = rb_find(symbols, (char*)str))) { |
nuclear@6 | 52 fprintf(stderr, "undefined symbol: %s\n", str); |
nuclear@6 | 53 return -1; |
nuclear@6 | 54 } |
nuclear@6 | 55 return ((struct symbol*)node->data)->id; |
nuclear@6 | 56 } |
nuclear@6 | 57 |
nuclear@6 | 58 int sym_arity(const char *str) |
nuclear@6 | 59 { |
nuclear@6 | 60 struct rbnode *node; |
nuclear@6 | 61 |
nuclear@6 | 62 if(!(node = rb_find(symbols, (char*)str))) { |
nuclear@6 | 63 fprintf(stderr, "undefined symbol: %s\n", str); |
nuclear@6 | 64 return -1; |
nuclear@6 | 65 } |
nuclear@6 | 66 return ((struct symbol*)node->data)->arity; |
nuclear@6 | 67 } |
nuclear@6 | 68 |
nuclear@6 | 69 static void del_func(struct rbnode *node, void *cls) |
nuclear@6 | 70 { |
nuclear@6 | 71 free(((struct symbol*)node->data)->name); |
nuclear@6 | 72 free(node->data); |
nuclear@6 | 73 } |