diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1995-10-17 09:53:53 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1995-10-17 09:53:53 -0200 |
commit | 15f40fddca66301a53f8b0adf41958c7e9add945 (patch) | |
tree | c3fa93174286f0ce55b43e49610bd9ffffe60408 | |
parent | 970995c3f258101ae90be4bcb762b6d38bb2b2fd (diff) | |
download | lua-15f40fddca66301a53f8b0adf41958c7e9add945.tar.gz lua-15f40fddca66301a53f8b0adf41958c7e9add945.tar.bz2 lua-15f40fddca66301a53f8b0adf41958c7e9add945.zip |
'nextvar' now traverses the symbol array, instead of the constant tree.
-rw-r--r-- | tree.c | 42 | ||||
-rw-r--r-- | tree.h | 4 |
2 files changed, 14 insertions, 32 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.12 1994/12/20 21:20:36 roberto Exp roberto $"; | 6 | char *rcs_tree="$Id: tree.c,v 1.13 1995/01/12 14:19:04 roberto Exp roberto $"; |
7 | 7 | ||
8 | 8 | ||
9 | #include <string.h> | 9 | #include <string.h> |
@@ -102,40 +102,22 @@ Long lua_strcollector (void) | |||
102 | return counter; | 102 | return counter; |
103 | } | 103 | } |
104 | 104 | ||
105 | |||
105 | /* | 106 | /* |
106 | ** Return next variable. | 107 | ** Traverse the constant tree looking for a specific symbol number |
107 | */ | 108 | */ |
108 | static TreeNode *tree_next (TreeNode *node, char *str) | 109 | static TreeNode *nodebysymbol (TreeNode *root, Word symbol) |
109 | { | 110 | { |
110 | if (node == NULL) return NULL; | 111 | TreeNode *t; |
111 | else if (str == NULL) return node; | 112 | if (root == NULL) return NULL; |
112 | else | 113 | if (root->varindex == symbol) return root; |
113 | { | 114 | t = nodebysymbol(root->left, symbol); |
114 | int c = lua_strcmp(str, node->ts.str); | 115 | if (t) return t; |
115 | if (c == 0) | 116 | return nodebysymbol(root->right, symbol); |
116 | return node->left != NULL ? node->left : node->right; | ||
117 | else if (c < 0) | ||
118 | { | ||
119 | TreeNode *result = tree_next(node->left, str); | ||
120 | return result != NULL ? result : node->right; | ||
121 | } | ||
122 | else | ||
123 | return tree_next(node->right, str); | ||
124 | } | ||
125 | } | 117 | } |
126 | 118 | ||
127 | TreeNode *lua_varnext (char *n) | 119 | TreeNode *luaI_nodebysymbol (Word symbol) |
128 | { | 120 | { |
129 | TreeNode *result; | 121 | return nodebysymbol(constant_root, symbol); |
130 | char *name = n; | ||
131 | while (1) | ||
132 | { /* repeat until a valid (non nil) variable */ | ||
133 | result = tree_next(constant_root, name); | ||
134 | if (result == NULL) return NULL; | ||
135 | if (result->varindex != NOT_USED && | ||
136 | s_tag(result->varindex) != LUA_T_NIL) | ||
137 | return result; | ||
138 | name = result->ts.str; | ||
139 | } | ||
140 | } | 122 | } |
141 | 123 | ||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | ** tree.h | 2 | ** tree.h |
3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
4 | ** $Id: tree.h,v 1.8 1994/12/20 21:20:36 roberto Exp roberto $ | 4 | ** $Id: tree.h,v 1.9 1995/01/12 14:19:04 roberto Exp roberto $ |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #ifndef tree_h | 7 | #ifndef tree_h |
@@ -32,6 +32,6 @@ typedef struct TreeNode | |||
32 | TaggedString *lua_createstring (char *str); | 32 | TaggedString *lua_createstring (char *str); |
33 | TreeNode *lua_constcreate (char *str); | 33 | TreeNode *lua_constcreate (char *str); |
34 | Long lua_strcollector (void); | 34 | Long lua_strcollector (void); |
35 | TreeNode *lua_varnext (char *n); | 35 | TreeNode *luaI_nodebysymbol (Word symbol); |
36 | 36 | ||
37 | #endif | 37 | #endif |