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:
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) {