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 | } | ||