lua

A copy of the Lua development repository
Log | Files | Refs | README

commit 36dd1af92dc0455684b997c15e736b0c56ef3f7c
parent 25b6dae7c06a61d2f6d8890f4c071cc3fffee889
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Fri,  9 Aug 1996 10:13:51 -0300

"[^]]" must mean "not ]".

Diffstat:
Mstrlib.c | 21+++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/strlib.c b/strlib.c @@ -3,7 +3,7 @@ ** String library to LUA */ -char *rcs_strlib="$Id: strlib.c,v 1.25 1996/08/01 14:55:33 roberto Exp roberto $"; +char *rcs_strlib="$Id: strlib.c,v 1.26 1996/08/05 20:55:24 roberto Exp roberto $"; #include <string.h> #include <stdio.h> @@ -178,20 +178,25 @@ static void str_ascii (void) #define ESC '%' #define SPECIALS "^$*?.([%" +static char *bracket_end (char *p) +{ + return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']'); +} + char *item_end (char *p) { - switch (*p) { - case '\0': return p; + switch (*p++) { + case '\0': return p-1; case ESC: - if (*(p+1) == 0) lua_error("incorrect pattern"); - return p+2; + if (*p == 0) lua_error("incorrect pattern"); + return p+1; case '[': { - char *end = (*(p+1) == 0) ? NULL : strchr(p+2, ']'); + char *end = bracket_end(p); if (end == NULL) lua_error("incorrect pattern"); return end+1; } default: - return p+1; + return p; } } @@ -219,7 +224,7 @@ int singlematch (int c, char *p) case '.': return 1; case ESC: return matchclass(c, *(p+1)); case '[': { - char *end = strchr(p+2, ']'); + char *end = bracket_end(p+1); int sig = *(p+1) == '^' ? (p++, 0) : 1; while (++p < end) { if (*p == ESC) {