diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-05-24 10:54:49 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-05-24 10:54:49 -0300 |
| commit | ef62b340e0a6b7b18931000dcbb19c4703bfe0e8 (patch) | |
| tree | d9d995116a8a686b798d1b625b06ead26f28ba58 /lstrlib.c | |
| parent | 5c2dd7a9e0a5b871a71ba66c4683cd88fe4f5aa4 (diff) | |
| download | lua-ef62b340e0a6b7b18931000dcbb19c4703bfe0e8.tar.gz lua-ef62b340e0a6b7b18931000dcbb19c4703bfe0e8.tar.bz2 lua-ef62b340e0a6b7b18931000dcbb19c4703bfe0e8.zip | |
code cleaner for 16 bits.
Diffstat (limited to 'lstrlib.c')
| -rw-r--r-- | lstrlib.c | 67 |
1 files changed, 35 insertions, 32 deletions
| @@ -1,11 +1,12 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstrlib.c,v 1.41 2000/03/03 14:58:26 roberto Exp roberto $ | 2 | ** $Id: lstrlib.c,v 1.42 2000/05/02 18:32:22 roberto Exp roberto $ |
| 3 | ** Standard library for string operations and pattern-matching | 3 | ** Standard library for string operations and pattern-matching |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | #include <ctype.h> | 8 | #include <ctype.h> |
| 9 | #include <stddef.h> | ||
| 9 | #include <stdio.h> | 10 | #include <stdio.h> |
| 10 | #include <stdlib.h> | 11 | #include <stdlib.h> |
| 11 | #include <string.h> | 12 | #include <string.h> |
| @@ -18,7 +19,7 @@ | |||
| 18 | 19 | ||
| 19 | 20 | ||
| 20 | 21 | ||
| 21 | static void addnchar (lua_State *L, const char *s, int n) { | 22 | static void addnchar (lua_State *L, const char *s, size_t n) { |
| 22 | char *b = luaL_openspace(L, n); | 23 | char *b = luaL_openspace(L, n); |
| 23 | memcpy(b, s, n); | 24 | memcpy(b, s, n); |
| 24 | luaL_addsize(L, n); | 25 | luaL_addsize(L, n); |
| @@ -26,7 +27,7 @@ static void addnchar (lua_State *L, const char *s, int n) { | |||
| 26 | 27 | ||
| 27 | 28 | ||
| 28 | static void str_len (lua_State *L) { | 29 | static void str_len (lua_State *L) { |
| 29 | long l; | 30 | size_t l; |
| 30 | luaL_check_lstr(L, 1, &l); | 31 | luaL_check_lstr(L, 1, &l); |
| 31 | lua_pushnumber(L, l); | 32 | lua_pushnumber(L, l); |
| 32 | } | 33 | } |
| @@ -37,19 +38,19 @@ static void closeandpush (lua_State *L) { | |||
| 37 | } | 38 | } |
| 38 | 39 | ||
| 39 | 40 | ||
| 40 | static long posrelat (long pos, long len) { | 41 | static long posrelat (long pos, size_t len) { |
| 41 | /* relative string position: negative means back from end */ | 42 | /* relative string position: negative means back from end */ |
| 42 | return (pos>=0) ? pos : len+pos+1; | 43 | return (pos>=0) ? pos : (long)len+pos+1; |
| 43 | } | 44 | } |
| 44 | 45 | ||
| 45 | 46 | ||
| 46 | static void str_sub (lua_State *L) { | 47 | static void str_sub (lua_State *L) { |
| 47 | long l; | 48 | size_t l; |
| 48 | const char *s = luaL_check_lstr(L, 1, &l); | 49 | const char *s = luaL_check_lstr(L, 1, &l); |
| 49 | long start = posrelat(luaL_check_long(L, 2), l); | 50 | long start = posrelat(luaL_check_long(L, 2), l); |
| 50 | long end = posrelat(luaL_opt_long(L, 3, -1), l); | 51 | long end = posrelat(luaL_opt_long(L, 3, -1), l); |
| 51 | if (start < 1) start = 1; | 52 | if (start < 1) start = 1; |
| 52 | if (end > l) end = l; | 53 | if (end > (long)l) end = l; |
| 53 | if (start <= end) | 54 | if (start <= end) |
| 54 | lua_pushlstring(L, s+start-1, end-start+1); | 55 | lua_pushlstring(L, s+start-1, end-start+1); |
| 55 | else lua_pushstring(L, ""); | 56 | else lua_pushstring(L, ""); |
| @@ -57,8 +58,8 @@ static void str_sub (lua_State *L) { | |||
| 57 | 58 | ||
| 58 | 59 | ||
| 59 | static void str_lower (lua_State *L) { | 60 | static void str_lower (lua_State *L) { |
| 60 | long l; | 61 | size_t l; |
| 61 | int i; | 62 | size_t i; |
| 62 | const char *s = luaL_check_lstr(L, 1, &l); | 63 | const char *s = luaL_check_lstr(L, 1, &l); |
| 63 | luaL_resetbuffer(L); | 64 | luaL_resetbuffer(L); |
| 64 | for (i=0; i<l; i++) | 65 | for (i=0; i<l; i++) |
| @@ -68,8 +69,8 @@ static void str_lower (lua_State *L) { | |||
| 68 | 69 | ||
| 69 | 70 | ||
| 70 | static void str_upper (lua_State *L) { | 71 | static void str_upper (lua_State *L) { |
| 71 | long l; | 72 | size_t l; |
| 72 | int i; | 73 | size_t i; |
| 73 | const char *s = luaL_check_lstr(L, 1, &l); | 74 | const char *s = luaL_check_lstr(L, 1, &l); |
| 74 | luaL_resetbuffer(L); | 75 | luaL_resetbuffer(L); |
| 75 | for (i=0; i<l; i++) | 76 | for (i=0; i<l; i++) |
| @@ -78,7 +79,7 @@ static void str_upper (lua_State *L) { | |||
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | static void str_rep (lua_State *L) { | 81 | static void str_rep (lua_State *L) { |
| 81 | long l; | 82 | size_t l; |
| 82 | const char *s = luaL_check_lstr(L, 1, &l); | 83 | const char *s = luaL_check_lstr(L, 1, &l); |
| 83 | int n = luaL_check_int(L, 2); | 84 | int n = luaL_check_int(L, 2); |
| 84 | luaL_resetbuffer(L); | 85 | luaL_resetbuffer(L); |
| @@ -89,10 +90,10 @@ static void str_rep (lua_State *L) { | |||
| 89 | 90 | ||
| 90 | 91 | ||
| 91 | static void str_byte (lua_State *L) { | 92 | static void str_byte (lua_State *L) { |
| 92 | long l; | 93 | size_t l; |
| 93 | const char *s = luaL_check_lstr(L, 1, &l); | 94 | const char *s = luaL_check_lstr(L, 1, &l); |
| 94 | long pos = posrelat(luaL_opt_long(L, 2, 1), l); | 95 | long pos = posrelat(luaL_opt_long(L, 2, 1), l); |
| 95 | luaL_arg_check(L, 0<pos && pos<=l, 2, "out of range"); | 96 | luaL_arg_check(L, 0<pos && (size_t)pos<=l, 2, "out of range"); |
| 96 | lua_pushnumber(L, (unsigned char)s[pos-1]); | 97 | lua_pushnumber(L, (unsigned char)s[pos-1]); |
| 97 | } | 98 | } |
| 98 | 99 | ||
| @@ -126,7 +127,7 @@ struct Capture { | |||
| 126 | int level; /* total number of captures (finished or unfinished) */ | 127 | int level; /* total number of captures (finished or unfinished) */ |
| 127 | struct { | 128 | struct { |
| 128 | const char *init; | 129 | const char *init; |
| 129 | int len; /* -1 signals unfinished capture */ | 130 | long len; /* -1 signals unfinished capture */ |
| 130 | } capture[MAX_CAPTURES]; | 131 | } capture[MAX_CAPTURES]; |
| 131 | }; | 132 | }; |
| 132 | 133 | ||
| @@ -238,7 +239,8 @@ int luaI_singlematch (int c, const char *p, const char *ep) { | |||
| 238 | } | 239 | } |
| 239 | 240 | ||
| 240 | 241 | ||
| 241 | static const char *match (lua_State *L, const char *s, const char *p, struct Capture *cap); | 242 | static const char *match (lua_State *L, const char *s, const char *p, |
| 243 | struct Capture *cap); | ||
| 242 | 244 | ||
| 243 | 245 | ||
| 244 | static const char *matchbalance (lua_State *L, const char *s, const char *p, | 246 | static const char *matchbalance (lua_State *L, const char *s, const char *p, |
| @@ -261,9 +263,9 @@ static const char *matchbalance (lua_State *L, const char *s, const char *p, | |||
| 261 | } | 263 | } |
| 262 | 264 | ||
| 263 | 265 | ||
| 264 | static const char *max_expand (lua_State *L, const char *s, const char *p, const char *ep, | 266 | static const char *max_expand (lua_State *L, const char *s, const char *p, |
| 265 | struct Capture *cap) { | 267 | const char *ep, struct Capture *cap) { |
| 266 | int i = 0; /* counts maximum expand for item */ | 268 | long i = 0; /* counts maximum expand for item */ |
| 267 | while ((s+i)<cap->src_end && luaI_singlematch((unsigned char)*(s+i), p, ep)) | 269 | while ((s+i)<cap->src_end && luaI_singlematch((unsigned char)*(s+i), p, ep)) |
| 268 | i++; | 270 | i++; |
| 269 | /* keeps trying to match mith the maximum repetitions */ | 271 | /* keeps trying to match mith the maximum repetitions */ |
| @@ -276,8 +278,8 @@ static const char *max_expand (lua_State *L, const char *s, const char *p, const | |||
| 276 | } | 278 | } |
| 277 | 279 | ||
| 278 | 280 | ||
| 279 | static const char *min_expand (lua_State *L, const char *s, const char *p, const char *ep, | 281 | static const char *min_expand (lua_State *L, const char *s, const char *p, |
| 280 | struct Capture *cap) { | 282 | const char *ep, struct Capture *cap) { |
| 281 | for (;;) { | 283 | for (;;) { |
| 282 | const char *res = match(L, s, ep+1, cap); | 284 | const char *res = match(L, s, ep+1, cap); |
| 283 | if (res != NULL) | 285 | if (res != NULL) |
| @@ -317,15 +319,16 @@ static const char *end_capture (lua_State *L, const char *s, const char *p, | |||
| 317 | static const char *match_capture (lua_State *L, const char *s, int level, | 319 | static const char *match_capture (lua_State *L, const char *s, int level, |
| 318 | struct Capture *cap) { | 320 | struct Capture *cap) { |
| 319 | int l = check_capture(L, level, cap); | 321 | int l = check_capture(L, level, cap); |
| 320 | int len = cap->capture[l].len; | 322 | size_t len = cap->capture[l].len; |
| 321 | if (cap->src_end-s >= len && | 323 | if ((size_t)(cap->src_end-s) >= len && |
| 322 | memcmp(cap->capture[l].init, s, len) == 0) | 324 | memcmp(cap->capture[l].init, s, len) == 0) |
| 323 | return s+len; | 325 | return s+len; |
| 324 | else return NULL; | 326 | else return NULL; |
| 325 | } | 327 | } |
| 326 | 328 | ||
| 327 | 329 | ||
| 328 | static const char *match (lua_State *L, const char *s, const char *p, struct Capture *cap) { | 330 | static const char *match (lua_State *L, const char *s, const char *p, |
| 331 | struct Capture *cap) { | ||
| 329 | init: /* using goto's to optimize tail recursion */ | 332 | init: /* using goto's to optimize tail recursion */ |
| 330 | switch (*p) { | 333 | switch (*p) { |
| 331 | case '(': /* start capture */ | 334 | case '(': /* start capture */ |
| @@ -397,12 +400,12 @@ static const char *memfind (const char *s1, long l1, const char *s2, long l2) { | |||
| 397 | 400 | ||
| 398 | 401 | ||
| 399 | static void str_find (lua_State *L) { | 402 | static void str_find (lua_State *L) { |
| 400 | long l1, l2; | 403 | size_t l1, l2; |
| 401 | const char *s = luaL_check_lstr(L, 1, &l1); | 404 | const char *s = luaL_check_lstr(L, 1, &l1); |
| 402 | const char *p = luaL_check_lstr(L, 2, &l2); | 405 | const char *p = luaL_check_lstr(L, 2, &l2); |
| 403 | long init = posrelat(luaL_opt_long(L, 3, 1), l1) - 1; | 406 | long init = posrelat(luaL_opt_long(L, 3, 1), l1) - 1; |
| 404 | struct Capture cap; | 407 | struct Capture cap; |
| 405 | luaL_arg_check(L, 0 <= init && init <= l1, 3, "out of range"); | 408 | luaL_arg_check(L, 0 <= init && (size_t)init <= l1, 3, "out of range"); |
| 406 | if (lua_getparam(L, 4) != LUA_NOOBJECT || | 409 | if (lua_getparam(L, 4) != LUA_NOOBJECT || |
| 407 | strpbrk(p, SPECIALS) == NULL) { /* no special characters? */ | 410 | strpbrk(p, SPECIALS) == NULL) { /* no special characters? */ |
| 408 | const char *s2 = memfind(s+init, l1-init, p, l2); | 411 | const char *s2 = memfind(s+init, l1-init, p, l2); |
| @@ -434,8 +437,8 @@ static void str_find (lua_State *L) { | |||
| 434 | static void add_s (lua_State *L, lua_Object newp, struct Capture *cap) { | 437 | static void add_s (lua_State *L, lua_Object newp, struct Capture *cap) { |
| 435 | if (lua_isstring(L, newp)) { | 438 | if (lua_isstring(L, newp)) { |
| 436 | const char *news = lua_getstring(L, newp); | 439 | const char *news = lua_getstring(L, newp); |
| 437 | int l = lua_strlen(L, newp); | 440 | size_t l = lua_strlen(L, newp); |
| 438 | int i; | 441 | size_t i; |
| 439 | for (i=0; i<l; i++) { | 442 | for (i=0; i<l; i++) { |
| 440 | if (news[i] != ESC) | 443 | if (news[i] != ESC) |
| 441 | luaL_addchar(L, news[i]); | 444 | luaL_addchar(L, news[i]); |
| @@ -453,7 +456,7 @@ static void add_s (lua_State *L, lua_Object newp, struct Capture *cap) { | |||
| 453 | else { /* is a function */ | 456 | else { /* is a function */ |
| 454 | lua_Object res; | 457 | lua_Object res; |
| 455 | int status; | 458 | int status; |
| 456 | int oldbuff; | 459 | size_t oldbuff; |
| 457 | lua_beginblock(L); | 460 | lua_beginblock(L); |
| 458 | push_captures(L, cap); | 461 | push_captures(L, cap); |
| 459 | /* function may use buffer, so save it and create a new one */ | 462 | /* function may use buffer, so save it and create a new one */ |
| @@ -474,7 +477,7 @@ static void add_s (lua_State *L, lua_Object newp, struct Capture *cap) { | |||
| 474 | 477 | ||
| 475 | 478 | ||
| 476 | static void str_gsub (lua_State *L) { | 479 | static void str_gsub (lua_State *L) { |
| 477 | long srcl; | 480 | size_t srcl; |
| 478 | const char *src = luaL_check_lstr(L, 1, &srcl); | 481 | const char *src = luaL_check_lstr(L, 1, &srcl); |
| 479 | const char *p = luaL_check_string(L, 2); | 482 | const char *p = luaL_check_string(L, 2); |
| 480 | lua_Object newp = lua_getparam(L, 3); | 483 | lua_Object newp = lua_getparam(L, 3); |
| @@ -510,7 +513,7 @@ static void str_gsub (lua_State *L) { | |||
| 510 | 513 | ||
| 511 | 514 | ||
| 512 | static void luaI_addquoted (lua_State *L, int arg) { | 515 | static void luaI_addquoted (lua_State *L, int arg) { |
| 513 | long l; | 516 | size_t l; |
| 514 | const char *s = luaL_check_lstr(L, arg, &l); | 517 | const char *s = luaL_check_lstr(L, arg, &l); |
| 515 | luaL_addchar(L, '"'); | 518 | luaL_addchar(L, '"'); |
| 516 | while (l--) { | 519 | while (l--) { |
| @@ -573,7 +576,7 @@ static void str_format (lua_State *L) { | |||
| 573 | luaI_addquoted(L, arg); | 576 | luaI_addquoted(L, arg); |
| 574 | continue; /* skip the "addsize" at the end */ | 577 | continue; /* skip the "addsize" at the end */ |
| 575 | case 's': { | 578 | case 's': { |
| 576 | long l; | 579 | size_t l; |
| 577 | const char *s = luaL_check_lstr(L, arg, &l); | 580 | const char *s = luaL_check_lstr(L, arg, &l); |
| 578 | if (cap.capture[1].len == 0 && l >= 100) { | 581 | if (cap.capture[1].len == 0 && l >= 100) { |
| 579 | /* no precision and string is too long to be formatted; | 582 | /* no precision and string is too long to be formatted; |
