aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Celes <celes@tecgraf.puc-rio.br>1994-10-18 15:36:11 -0200
committerWaldemar Celes <celes@tecgraf.puc-rio.br>1994-10-18 15:36:11 -0200
commitd7cb47fadf182e812f1f9db837dbeae0171ddbb9 (patch)
tree3881f2006d1787542655473306f416065f35592f
parentf84abc6799b9e58244480527386f78560ee2feb2 (diff)
downloadlua-d7cb47fadf182e812f1f9db837dbeae0171ddbb9.tar.gz
lua-d7cb47fadf182e812f1f9db837dbeae0171ddbb9.tar.bz2
lua-d7cb47fadf182e812f1f9db837dbeae0171ddbb9.zip
new parameter in function 'tree_create'. Maybe we will return to
version 1.1
-rw-r--r--tree.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/tree.c b/tree.c
index a1a0ac83..89e875d3 100644
--- a/tree.c
+++ b/tree.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_tree="$Id: $"; 6char *rcs_tree="$Id: tree.c,v 1.1 1994/07/19 21:24:17 celes Exp $";
7 7
8 8
9#include <stdlib.h> 9#include <stdlib.h>
@@ -11,6 +11,7 @@ char *rcs_tree="$Id: $";
11 11
12#include "lua.h" 12#include "lua.h"
13#include "tree.h" 13#include "tree.h"
14#include "table.h"
14 15
15 16
16#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)))
@@ -31,7 +32,7 @@ static TreeNode *variable_root = NULL;
31/* 32/*
32** Insert a new string/constant/variable at the tree. 33** Insert a new string/constant/variable at the tree.
33*/ 34*/
34static char *tree_create (TreeNode **node, char *str) 35static char *tree_create (TreeNode **node, char *str, int *created)
35{ 36{
36 if (*node == NULL) 37 if (*node == NULL)
37 { 38 {
@@ -41,15 +42,16 @@ static char *tree_create (TreeNode **node, char *str)
41 (*node)->left = (*node)->right = NULL; 42 (*node)->left = (*node)->right = NULL;
42 strcpy((*node)->str, str); 43 strcpy((*node)->str, str);
43 (*node)->index = UNMARKED_STRING; 44 (*node)->index = UNMARKED_STRING;
45 *created = 1;
44 return (*node)->str; 46 return (*node)->str;
45 } 47 }
46 else 48 else
47 { 49 {
48 int c = lua_strcmp(str, (*node)->str); 50 int c = lua_strcmp(str, (*node)->str);
49 if (c < 0) 51 if (c < 0)
50 return tree_create(&(*node)->left, str); 52 return tree_create(&(*node)->left, str, created);
51 else if (c > 0) 53 else if (c > 0)
52 return tree_create(&(*node)->right, str); 54 return tree_create(&(*node)->right, str, created);
53 else 55 else
54 return (*node)->str; 56 return (*node)->str;
55 } 57 }
@@ -57,17 +59,26 @@ static char *tree_create (TreeNode **node, char *str)
57 59
58char *lua_strcreate (char *str) 60char *lua_strcreate (char *str)
59{ 61{
60 return tree_create(&string_root, str); 62 int created=0;
63 char *s = tree_create(&string_root, str, &created);
64 if (created)
65 {
66 if (lua_nentity == lua_block) lua_pack ();
67 lua_nentity++;
68 }
69 return s;
61} 70}
62 71
63char *lua_constcreate (char *str) 72char *lua_constcreate (char *str)
64{ 73{
65 return tree_create(&constant_root, str); 74 int created;
75 return tree_create(&constant_root, str, &created);
66} 76}
67 77
68char *lua_varcreate (char *str) 78char *lua_varcreate (char *str)
69{ 79{
70 return tree_create(&variable_root, str); 80 int created;
81 return tree_create(&variable_root, str, &created);
71} 82}
72 83
73 84
@@ -131,7 +142,10 @@ static TreeNode *lua_travcollector (TreeNode *r)
131 r->right = lua_travcollector(r->right); 142 r->right = lua_travcollector(r->right);
132 r->left = lua_travcollector(r->left); 143 r->left = lua_travcollector(r->left);
133 if (r->index == UNMARKED_STRING) 144 if (r->index == UNMARKED_STRING)
145 {
146 ++lua_recovered;
134 return lua_strfree(r); 147 return lua_strfree(r);
148 }
135 else 149 else
136 { 150 {
137 r->index = UNMARKED_STRING; 151 r->index = UNMARKED_STRING;