aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-07-05 11:30:38 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-07-05 11:30:38 -0300
commit8efb44b5e046fd1ba671f489b3b996ff97386165 (patch)
tree6eb6c3a88b3388f7b560e5d94a752295af94928d
parentf7720bebe31f3523ef91a68fde5a1e3ff1768be9 (diff)
downloadlua-8efb44b5e046fd1ba671f489b3b996ff97386165.tar.gz
lua-8efb44b5e046fd1ba671f489b3b996ff97386165.tar.bz2
lua-8efb44b5e046fd1ba671f489b3b996ff97386165.zip
changes in 'string.find' and 'string.gfind' (new 'string.match' and
'string.gmatch')
-rw-r--r--lstrlib.c55
1 files changed, 43 insertions, 12 deletions
diff --git a/lstrlib.c b/lstrlib.c
index 963469b9..149db248 100644
--- a/lstrlib.c
+++ b/lstrlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstrlib.c,v 1.116 2005/05/20 15:53:42 roberto Exp roberto $ 2** $Id: lstrlib.c,v 1.117 2005/05/31 14:25:18 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*/
@@ -485,15 +485,15 @@ static int push_captures (MatchState *ms, const char *s, const char *e) {
485} 485}
486 486
487 487
488static int str_find (lua_State *L) { 488static int str_find_aux (lua_State *L, int find) {
489 size_t l1, l2; 489 size_t l1, l2;
490 const char *s = luaL_checklstring(L, 1, &l1); 490 const char *s = luaL_checklstring(L, 1, &l1);
491 const char *p = luaL_checklstring(L, 2, &l2); 491 const char *p = luaL_checklstring(L, 2, &l2);
492 ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; 492 ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1;
493 if (init < 0) init = 0; 493 if (init < 0) init = 0;
494 else if ((size_t)(init) > l1) init = (ptrdiff_t)l1; 494 else if ((size_t)(init) > l1) init = (ptrdiff_t)l1;
495 if (lua_toboolean(L, 4) || /* explicit request? */ 495 if (find && (lua_toboolean(L, 4) || /* explicit request? */
496 strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */ 496 strpbrk(p, SPECIALS) == NULL)) { /* or no special characters? */
497 /* do a plain search */ 497 /* do a plain search */
498 const char *s2 = lmemfind(s+init, l1-init, p, l2); 498 const char *s2 = lmemfind(s+init, l1-init, p, l2);
499 if (s2) { 499 if (s2) {
@@ -513,18 +513,37 @@ static int str_find (lua_State *L) {
513 const char *res; 513 const char *res;
514 ms.level = 0; 514 ms.level = 0;
515 if ((res=match(&ms, s1, p)) != NULL) { 515 if ((res=match(&ms, s1, p)) != NULL) {
516 lua_pushinteger(L, s1-s+1); /* start */ 516 if (find) {
517 lua_pushinteger(L, res-s); /* end */ 517 lua_pushinteger(L, s1-s+1); /* start */
518 return push_captures(&ms, NULL, 0) + 2; 518 lua_pushinteger(L, res-s); /* end */
519#if defined(LUA_COMPAT_FIND)
520 return push_captures(&ms, NULL, 0) + 2;
521#else
522 return 2;
523#endif
524
525 }
526 else
527 return push_captures(&ms, s1, res);
519 } 528 }
520 } while (s1++<ms.src_end && !anchor); 529 } while (s1++ < ms.src_end && !anchor);
521 } 530 }
522 lua_pushnil(L); /* not found */ 531 lua_pushnil(L); /* not found */
523 return 1; 532 return 1;
524} 533}
525 534
526 535
527static int gfind_aux (lua_State *L) { 536static int str_find (lua_State *L) {
537 return str_find_aux(L, 1);
538}
539
540
541static int str_match (lua_State *L) {
542 return str_find_aux(L, 0);
543}
544
545
546static int gmatch_aux (lua_State *L) {
528 MatchState ms; 547 MatchState ms;
529 size_t ls; 548 size_t ls;
530 const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); 549 const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls);
@@ -550,16 +569,22 @@ static int gfind_aux (lua_State *L) {
550} 569}
551 570
552 571
553static int gfind (lua_State *L) { 572static int gmatch (lua_State *L) {
554 luaL_checkstring(L, 1); 573 luaL_checkstring(L, 1);
555 luaL_checkstring(L, 2); 574 luaL_checkstring(L, 2);
556 lua_settop(L, 2); 575 lua_settop(L, 2);
557 lua_pushinteger(L, 0); 576 lua_pushinteger(L, 0);
558 lua_pushcclosure(L, gfind_aux, 3); 577 lua_pushcclosure(L, gmatch_aux, 3);
559 return 1; 578 return 1;
560} 579}
561 580
562 581
582static int gfind_nodef (lua_State *L) {
583 return luaL_error(L, LUA_QL("string.gfind") " was renamed to "
584 LUA_QL("string.gmatch"));
585}
586
587
563static void add_s (MatchState *ms, luaL_Buffer *b, 588static void add_s (MatchState *ms, luaL_Buffer *b,
564 const char *s, const char *e) { 589 const char *s, const char *e) {
565 lua_State *L = ms->L; 590 lua_State *L = ms->L;
@@ -765,8 +790,10 @@ static const luaL_reg strlib[] = {
765 {"format", str_format}, 790 {"format", str_format},
766 {"dump", str_dump}, 791 {"dump", str_dump},
767 {"find", str_find}, 792 {"find", str_find},
768 {"gfind", gfind}, 793 {"gfind", gfind_nodef},
794 {"gmatch", gmatch},
769 {"gsub", str_gsub}, 795 {"gsub", str_gsub},
796 {"match", str_match},
770 {NULL, NULL} 797 {NULL, NULL}
771}; 798};
772 799
@@ -790,6 +817,10 @@ static void createmetatable (lua_State *L) {
790*/ 817*/
791LUALIB_API int luaopen_string (lua_State *L) { 818LUALIB_API int luaopen_string (lua_State *L) {
792 luaL_openlib(L, LUA_STRLIBNAME, strlib, 0); 819 luaL_openlib(L, LUA_STRLIBNAME, strlib, 0);
820#if defined(LUA_COMPAT_GFIND)
821 lua_getfield(L, -1, "gmatch");
822 lua_setfield(L, -2, "gfind");
823#endif
793 createmetatable(L); 824 createmetatable(L);
794 return 1; 825 return 1;
795} 826}