diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-14 19:40:14 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-14 19:40:14 -0200 |
| commit | 86b35cf4f6a824880239069d0afe282e95806aaa (patch) | |
| tree | 78352c354fc6befe1af900606cb84b23a40235e0 /tree.c | |
| parent | 3b7a36653b5da227502ec5a3c677b6a351af67be (diff) | |
| download | lua-86b35cf4f6a824880239069d0afe282e95806aaa.tar.gz lua-86b35cf4f6a824880239069d0afe282e95806aaa.tar.bz2 lua-86b35cf4f6a824880239069d0afe282e95806aaa.zip | |
unification of symbol tree and constant tree
Diffstat (limited to 'tree.c')
| -rw-r--r-- | tree.c | 69 |
1 files changed, 11 insertions, 58 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_tree="$Id: tree.c,v 1.2 1994/10/18 17:36:11 celes Exp roberto $"; | 6 | char *rcs_tree="$Id: tree.c,v 1.3 1994/11/10 20:41:37 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| @@ -17,22 +17,13 @@ char *rcs_tree="$Id: tree.c,v 1.2 1994/10/18 17:36:11 celes Exp roberto $"; | |||
| 17 | #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) | 17 | #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | typedef struct TreeNode | ||
| 21 | { | ||
| 22 | struct TreeNode *right; | ||
| 23 | struct TreeNode *left; | ||
| 24 | Word index; | ||
| 25 | char str[1]; /* \0 byte already reserved */ | ||
| 26 | } TreeNode; | ||
| 27 | |||
| 28 | static TreeNode *string_root = NULL; | 20 | static TreeNode *string_root = NULL; |
| 29 | static TreeNode *constant_root = NULL; | 21 | static TreeNode *constant_root = NULL; |
| 30 | static TreeNode *variable_root = NULL; | ||
| 31 | 22 | ||
| 32 | /* | 23 | /* |
| 33 | ** Insert a new string/constant/variable at the tree. | 24 | ** Insert a new string/constant/variable at the tree. |
| 34 | */ | 25 | */ |
| 35 | static char *tree_create (TreeNode **node, char *str, int *created) | 26 | static TreeNode *tree_create (TreeNode **node, char *str, int *created) |
| 36 | { | 27 | { |
| 37 | if (*node == NULL) | 28 | if (*node == NULL) |
| 38 | { | 29 | { |
| @@ -41,9 +32,9 @@ static char *tree_create (TreeNode **node, char *str, int *created) | |||
| 41 | lua_error("not enough memory"); | 32 | lua_error("not enough memory"); |
| 42 | (*node)->left = (*node)->right = NULL; | 33 | (*node)->left = (*node)->right = NULL; |
| 43 | strcpy((*node)->str, str); | 34 | strcpy((*node)->str, str); |
| 44 | (*node)->index = UNMARKED_STRING; | 35 | (*node)->varindex = (*node)->constindex = UNMARKED_STRING; |
| 45 | *created = 1; | 36 | *created = 1; |
| 46 | return (*node)->str; | 37 | return *node; |
| 47 | } | 38 | } |
| 48 | else | 39 | else |
| 49 | { | 40 | { |
| @@ -53,35 +44,28 @@ static char *tree_create (TreeNode **node, char *str, int *created) | |||
| 53 | else if (c > 0) | 44 | else if (c > 0) |
| 54 | return tree_create(&(*node)->right, str, created); | 45 | return tree_create(&(*node)->right, str, created); |
| 55 | else | 46 | else |
| 56 | return (*node)->str; | 47 | return *node; |
| 57 | } | 48 | } |
| 58 | } | 49 | } |
| 59 | 50 | ||
| 60 | char *lua_strcreate (char *str) | 51 | char *lua_strcreate (char *str) |
| 61 | { | 52 | { |
| 62 | int created=0; | 53 | int created=0; |
| 63 | char *s = tree_create(&string_root, str, &created); | 54 | TreeNode *t = tree_create(&string_root, str, &created); |
| 64 | if (created) | 55 | if (created) |
| 65 | { | 56 | { |
| 66 | if (lua_nentity == lua_block) lua_pack (); | 57 | if (lua_nentity == lua_block) lua_pack (); |
| 67 | lua_nentity++; | 58 | lua_nentity++; |
| 68 | } | 59 | } |
| 69 | return s; | 60 | return t->str; |
| 70 | } | 61 | } |
| 71 | 62 | ||
| 72 | char *lua_constcreate (char *str) | 63 | TreeNode *lua_constcreate (char *str) |
| 73 | { | 64 | { |
| 74 | int created; | 65 | int created; |
| 75 | return tree_create(&constant_root, str, &created); | 66 | return tree_create(&constant_root, str, &created); |
| 76 | } | 67 | } |
| 77 | 68 | ||
| 78 | char *lua_varcreate (char *str) | ||
| 79 | { | ||
| 80 | int created; | ||
| 81 | return tree_create(&variable_root, str, &created); | ||
| 82 | } | ||
| 83 | |||
| 84 | |||
| 85 | 69 | ||
| 86 | /* | 70 | /* |
| 87 | ** Free a node of the tree | 71 | ** Free a node of the tree |
| @@ -141,14 +125,14 @@ static TreeNode *lua_travcollector (TreeNode *r) | |||
| 141 | if (r == NULL) return NULL; | 125 | if (r == NULL) return NULL; |
| 142 | r->right = lua_travcollector(r->right); | 126 | r->right = lua_travcollector(r->right); |
| 143 | r->left = lua_travcollector(r->left); | 127 | r->left = lua_travcollector(r->left); |
| 144 | if (r->index == UNMARKED_STRING) | 128 | if (r->constindex == UNMARKED_STRING) |
| 145 | { | 129 | { |
| 146 | ++lua_recovered; | 130 | ++lua_recovered; |
| 147 | return lua_strfree(r); | 131 | return lua_strfree(r); |
| 148 | } | 132 | } |
| 149 | else | 133 | else |
| 150 | { | 134 | { |
| 151 | r->index = UNMARKED_STRING; | 135 | r->constindex = UNMARKED_STRING; |
| 152 | return r; | 136 | return r; |
| 153 | } | 137 | } |
| 154 | } | 138 | } |
| @@ -168,18 +152,6 @@ void lua_strcollector (void) | |||
| 168 | */ | 152 | */ |
| 169 | static TreeNode *tree_next (TreeNode *node, char *str) | 153 | static TreeNode *tree_next (TreeNode *node, char *str) |
| 170 | { | 154 | { |
| 171 | #if 0 | ||
| 172 | if (node == NULL) return NULL; | ||
| 173 | if (str == NULL || lua_strcmp(str, node->str) < 0) | ||
| 174 | { | ||
| 175 | TreeNode *result = tree_next(node->left, str); | ||
| 176 | return result == NULL ? node : result; | ||
| 177 | } | ||
| 178 | else | ||
| 179 | { | ||
| 180 | return tree_next(node->right, str); | ||
| 181 | } | ||
| 182 | #else | ||
| 183 | if (node == NULL) return NULL; | 155 | if (node == NULL) return NULL; |
| 184 | else if (str == NULL) return node; | 156 | else if (str == NULL) return node; |
| 185 | else | 157 | else |
| @@ -195,30 +167,11 @@ static TreeNode *tree_next (TreeNode *node, char *str) | |||
| 195 | else | 167 | else |
| 196 | return tree_next(node->right, str); | 168 | return tree_next(node->right, str); |
| 197 | } | 169 | } |
| 198 | #endif | ||
| 199 | } | 170 | } |
| 200 | 171 | ||
| 201 | char *lua_varnext (char *n) | 172 | char *lua_varnext (char *n) |
| 202 | { | 173 | { |
| 203 | TreeNode *result = tree_next(variable_root, n); | 174 | TreeNode *result = tree_next(constant_root, n); |
| 204 | return result != NULL ? result->str : NULL; | 175 | return result != NULL ? result->str : NULL; |
| 205 | } | 176 | } |
| 206 | 177 | ||
| 207 | |||
| 208 | /* | ||
| 209 | ** Given an id, find the string with exaustive search | ||
| 210 | */ | ||
| 211 | static char *tree_name (TreeNode *node, Word index) | ||
| 212 | { | ||
| 213 | if (node == NULL) return NULL; | ||
| 214 | if (node->index == index) return node->str; | ||
| 215 | else | ||
| 216 | { | ||
| 217 | char *result = tree_name(node->left, index); | ||
| 218 | return result != NULL ? result : tree_name(node->right, index); | ||
| 219 | } | ||
| 220 | } | ||
| 221 | char *lua_varname (Word index) | ||
| 222 | { | ||
| 223 | return tree_name(variable_root, index); | ||
| 224 | } | ||
