aboutsummaryrefslogtreecommitdiff
path: root/strlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-02-21 12:21:34 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-02-21 12:21:34 -0300
commit8b7f271ea2045ec698f994c1f141a38c6eb71a9f (patch)
treea44f032b7ccd30278a95c1d534e19a9102931fca /strlib.c
parentbc323435ee2fdf2a6bb7e6d22e1fbc3ea2aecd76 (diff)
downloadlua-8b7f271ea2045ec698f994c1f141a38c6eb71a9f.tar.gz
lua-8b7f271ea2045ec698f994c1f141a38c6eb71a9f.tar.bz2
lua-8b7f271ea2045ec698f994c1f141a38c6eb71a9f.zip
new pattern item ".-";
empty patterns may be used in gsub.
Diffstat (limited to 'strlib.c')
-rw-r--r--strlib.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/strlib.c b/strlib.c
index 776e3e37..fef0e1ef 100644
--- a/strlib.c
+++ b/strlib.c
@@ -3,7 +3,7 @@
3** String library to LUA 3** String library to LUA
4*/ 4*/
5 5
6char *rcs_strlib="$Id: strlib.c,v 1.33 1996/11/20 13:47:59 roberto Exp roberto $"; 6char *rcs_strlib="$Id: strlib.c,v 1.34 1996/11/22 13:08:02 roberto Exp roberto $";
7 7
8#include <string.h> 8#include <string.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -195,7 +195,7 @@ static void str_ascii (void)
195/* pattern matching */ 195/* pattern matching */
196 196
197#define ESC '%' 197#define ESC '%'
198#define SPECIALS "^$*?.([%" 198#define SPECIALS "^$*?.([%-"
199 199
200static char *bracket_end (char *p) 200static char *bracket_end (char *p)
201{ 201{
@@ -367,6 +367,17 @@ static char *match (char *s, char *p, int level)
367 return res; 367 return res;
368 p=ep+1; goto init; /* else return match(s, ep+1, level); */ 368 p=ep+1; goto init; /* else return match(s, ep+1, level); */
369 } 369 }
370 case '-': { /* repetition */
371 char *res;
372 if ((res = match(s, ep+1, level)) != 0)
373 return res;
374 else if (m) {
375 s++;
376 goto init; /* return match(s+1, p, level); */
377 }
378 else
379 return NULL;
380 }
370 case '?': { /* optional */ 381 case '?': { /* optional */
371 char *res; 382 char *res;
372 if (m && (res = match(s+1, ep+1, level))) 383 if (m && (res = match(s+1, ep+1, level)))
@@ -447,20 +458,21 @@ static void str_gsub (void)
447 char *src = lua_check_string(1, "gsub"); 458 char *src = lua_check_string(1, "gsub");
448 char *p = lua_check_string(2, "gsub"); 459 char *p = lua_check_string(2, "gsub");
449 lua_Object newp = lua_getparam(3); 460 lua_Object newp = lua_getparam(3);
450 int max_s = lua_opt_number(4, strlen(src), "gsub"); 461 int max_s = lua_opt_number(4, strlen(src)+1, "gsub");
451 int anchor = (*p == '^') ? (p++, 1) : 0; 462 int anchor = (*p == '^') ? (p++, 1) : 0;
452 int n = 0; 463 int n = 0;
453 luaI_addchar(0); 464 luaI_addchar(0);
454 while (*src && n < max_s) { 465 while (n < max_s) {
455 char *e; 466 char *e = match(src, p, 0);
456 if ((e=match(src, p, 0)) == NULL) 467 if (e) {
457 luaI_addchar(*src++);
458 else {
459 if (e == src) lua_error("empty pattern in substitution");
460 add_s(newp); 468 add_s(newp);
461 src = e;
462 n++; 469 n++;
463 } 470 }
471 if (e && e>src) /* non empty match? */
472 src = e; /* skip it */
473 else if (*src)
474 luaI_addchar(*src++);
475 else break;
464 if (anchor) break; 476 if (anchor) break;
465 } 477 }
466 addstr(src); 478 addstr(src);