diff options
Diffstat (limited to '')
| -rw-r--r-- | lstring.c | 42 |
1 files changed, 23 insertions, 19 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstring.c,v 1.62 2001/03/26 14:31:49 roberto Exp roberto $ | 2 | ** $Id: lstring.c,v 1.63 2001/06/06 18:00:19 roberto Exp roberto $ |
| 3 | ** String table (keeps all strings handled by Lua) | 3 | ** String table (keeps all strings handled by Lua) |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -47,6 +47,27 @@ void luaS_resize (lua_State *L, int newsize) { | |||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | static TString *newlstr (lua_State *L, const l_char *str, size_t l, lu_hash h) { | ||
| 51 | TString *ts = (TString *)luaM_malloc(L, sizestring(l)); | ||
| 52 | stringtable *tb; | ||
| 53 | ts->nexthash = NULL; | ||
| 54 | ts->len = l; | ||
| 55 | ts->hash = h; | ||
| 56 | ts->marked = 0; | ||
| 57 | ts->constindex = 0; | ||
| 58 | memcpy(getstr(ts), str, l*sizeof(l_char)); | ||
| 59 | getstr(ts)[l] = l_c('\0'); /* ending 0 */ | ||
| 60 | tb = &G(L)->strt; | ||
| 61 | h = lmod(h, tb->size); | ||
| 62 | ts->nexthash = tb->hash[h]; /* chain new entry */ | ||
| 63 | tb->hash[h] = ts; | ||
| 64 | tb->nuse++; | ||
| 65 | if (tb->nuse > (ls_nstr)tb->size && tb->size <= MAX_INT/2) | ||
| 66 | luaS_resize(L, tb->size*2); /* too crowded */ | ||
| 67 | return ts; | ||
| 68 | } | ||
| 69 | |||
| 70 | |||
| 50 | TString *luaS_newlstr (lua_State *L, const l_char *str, size_t l) { | 71 | TString *luaS_newlstr (lua_State *L, const l_char *str, size_t l) { |
| 51 | TString *ts; | 72 | TString *ts; |
| 52 | lu_hash h = l; /* seed */ | 73 | lu_hash h = l; /* seed */ |
| @@ -58,29 +79,12 @@ TString *luaS_newlstr (lua_State *L, const l_char *str, size_t l) { | |||
| 58 | if (ts->len == l && (memcmp(str, getstr(ts), l) == 0)) | 79 | if (ts->len == l && (memcmp(str, getstr(ts), l) == 0)) |
| 59 | return ts; | 80 | return ts; |
| 60 | } | 81 | } |
| 61 | /* not found */ | 82 | return newlstr(L, str, l, h); /* not found */ |
| 62 | ts = (TString *)luaM_malloc(L, sizestring(l)); | ||
| 63 | ts->marked = 0; | ||
| 64 | ts->nexthash = NULL; | ||
| 65 | ts->len = l; | ||
| 66 | ts->hash = h; | ||
| 67 | ts->constindex = 0; | ||
| 68 | memcpy(getstr(ts), str, l*sizeof(l_char)); | ||
| 69 | getstr(ts)[l] = 0; /* ending 0 */ | ||
| 70 | h = lmod(h, G(L)->strt.size); | ||
| 71 | ts->nexthash = G(L)->strt.hash[h]; /* chain new entry */ | ||
| 72 | G(L)->strt.hash[h] = ts; | ||
| 73 | G(L)->strt.nuse++; | ||
| 74 | if (G(L)->strt.nuse > (ls_nstr)G(L)->strt.size && | ||
| 75 | G(L)->strt.size <= MAX_INT/2) | ||
| 76 | luaS_resize(L, G(L)->strt.size*2); /* too crowded */ | ||
| 77 | return ts; | ||
| 78 | } | 83 | } |
| 79 | 84 | ||
| 80 | 85 | ||
| 81 | Udata *luaS_newudata (lua_State *L, size_t s) { | 86 | Udata *luaS_newudata (lua_State *L, size_t s) { |
| 82 | Udata *u = (Udata *)luaM_malloc(L, sizeudata(s)); | 87 | Udata *u = (Udata *)luaM_malloc(L, sizeudata(s)); |
| 83 | u->marked = 0; | ||
| 84 | u->len = s; | 88 | u->len = s; |
| 85 | u->tag = 0; | 89 | u->tag = 0; |
| 86 | u->value = ((union L_UUdata *)(u) + 1); | 90 | u->value = ((union L_UUdata *)(u) + 1); |
