diff options
Diffstat (limited to '')
| -rw-r--r-- | lstring.c | 46 |
1 files changed, 20 insertions, 26 deletions
| @@ -39,14 +39,14 @@ | |||
| 39 | 39 | ||
| 40 | 40 | ||
| 41 | /* | 41 | /* |
| 42 | ** equality for long strings | 42 | ** generic equality for strings |
| 43 | */ | 43 | */ |
| 44 | int luaS_eqlngstr (TString *a, TString *b) { | 44 | int luaS_eqstr (TString *a, TString *b) { |
| 45 | size_t len = a->u.lnglen; | 45 | size_t len1, len2; |
| 46 | lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR); | 46 | const char *s1 = getlstr(a, len1); |
| 47 | return (a == b) || /* same instance or... */ | 47 | const char *s2 = getlstr(b, len2); |
| 48 | ((len == b->u.lnglen) && /* equal length and ... */ | 48 | return ((len1 == len2) && /* equal length and ... */ |
| 49 | (memcmp(getlngstr(a), getlngstr(b), len) == 0)); /* equal contents */ | 49 | (memcmp(s1, s2, len1) == 0)); /* equal contents */ |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | 52 | ||
| @@ -315,28 +315,9 @@ static void f_newext (lua_State *L, void *ud) { | |||
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | 317 | ||
| 318 | static void f_pintern (lua_State *L, void *ud) { | ||
| 319 | struct NewExt *ne = cast(struct NewExt *, ud); | ||
| 320 | ne->ts = internshrstr(L, ne->s, ne->len); | ||
| 321 | } | ||
| 322 | |||
| 323 | |||
| 324 | TString *luaS_newextlstr (lua_State *L, | 318 | TString *luaS_newextlstr (lua_State *L, |
| 325 | const char *s, size_t len, lua_Alloc falloc, void *ud) { | 319 | const char *s, size_t len, lua_Alloc falloc, void *ud) { |
| 326 | struct NewExt ne; | 320 | struct NewExt ne; |
| 327 | if (len <= LUAI_MAXSHORTLEN) { /* short string? */ | ||
| 328 | ne.s = s; ne.len = len; | ||
| 329 | if (!falloc) | ||
| 330 | f_pintern(L, &ne); /* just internalize string */ | ||
| 331 | else { | ||
| 332 | TStatus status = luaD_rawrunprotected(L, f_pintern, &ne); | ||
| 333 | (*falloc)(ud, cast_voidp(s), len + 1, 0); /* free external string */ | ||
| 334 | if (status != LUA_OK) /* memory error? */ | ||
| 335 | luaM_error(L); /* re-raise memory error */ | ||
| 336 | } | ||
| 337 | return ne.ts; | ||
| 338 | } | ||
| 339 | /* "normal" case: long strings */ | ||
| 340 | if (!falloc) { | 321 | if (!falloc) { |
| 341 | ne.kind = LSTRFIX; | 322 | ne.kind = LSTRFIX; |
| 342 | f_newext(L, &ne); /* just create header */ | 323 | f_newext(L, &ne); /* just create header */ |
| @@ -357,3 +338,16 @@ TString *luaS_newextlstr (lua_State *L, | |||
| 357 | } | 338 | } |
| 358 | 339 | ||
| 359 | 340 | ||
| 341 | /* | ||
| 342 | ** Normalize an external string: If it is short, internalize it. | ||
| 343 | */ | ||
| 344 | TString *luaS_normstr (lua_State *L, TString *ts) { | ||
| 345 | size_t len = ts->u.lnglen; | ||
| 346 | if (len > LUAI_MAXSHORTLEN) | ||
| 347 | return ts; /* long string; keep the original */ | ||
| 348 | else { | ||
| 349 | const char *str = getlngstr(ts); | ||
| 350 | return internshrstr(L, str, len); | ||
| 351 | } | ||
| 352 | } | ||
| 353 | |||
