From 8b7f271ea2045ec698f994c1f141a38c6eb71a9f Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 21 Feb 1997 12:21:34 -0300 Subject: [PATCH] new pattern item ".-"; empty patterns may be used in gsub. --- strlib.c | 32 ++++++++++++++++++++++---------- 1 file 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 @@ ** String library to LUA */ -char *rcs_strlib="$Id: strlib.c,v 1.33 1996/11/20 13:47:59 roberto Exp roberto $"; +char *rcs_strlib="$Id: strlib.c,v 1.34 1996/11/22 13:08:02 roberto Exp roberto $"; #include #include @@ -195,7 +195,7 @@ static void str_ascii (void) /* pattern matching */ #define ESC '%' -#define SPECIALS "^$*?.([%" +#define SPECIALS "^$*?.([%-" static char *bracket_end (char *p) { @@ -367,6 +367,17 @@ static char *match (char *s, char *p, int level) return res; p=ep+1; goto init; /* else return match(s, ep+1, level); */ } + case '-': { /* repetition */ + char *res; + if ((res = match(s, ep+1, level)) != 0) + return res; + else if (m) { + s++; + goto init; /* return match(s+1, p, level); */ + } + else + return NULL; + } case '?': { /* optional */ char *res; if (m && (res = match(s+1, ep+1, level))) @@ -447,20 +458,21 @@ static void str_gsub (void) char *src = lua_check_string(1, "gsub"); char *p = lua_check_string(2, "gsub"); lua_Object newp = lua_getparam(3); - int max_s = lua_opt_number(4, strlen(src), "gsub"); + int max_s = lua_opt_number(4, strlen(src)+1, "gsub"); int anchor = (*p == '^') ? (p++, 1) : 0; int n = 0; luaI_addchar(0); - while (*src && n < max_s) { - char *e; - if ((e=match(src, p, 0)) == NULL) - luaI_addchar(*src++); - else { - if (e == src) lua_error("empty pattern in substitution"); + while (n < max_s) { + char *e = match(src, p, 0); + if (e) { add_s(newp); - src = e; n++; } + if (e && e>src) /* non empty match? */ + src = e; /* skip it */ + else if (*src) + luaI_addchar(*src++); + else break; if (anchor) break; } addstr(src);