summaryrefslogtreecommitdiff
path: root/strlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-08-09 10:14:11 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-08-09 10:14:11 -0300
commit36dd1af92dc0455684b997c15e736b0c56ef3f7c (patch)
treec527a56cbbc18456dcad13c117efc2ba08737dbc /strlib.c
parent25b6dae7c06a61d2f6d8890f4c071cc3fffee889 (diff)
downloadlua-36dd1af92dc0455684b997c15e736b0c56ef3f7c.tar.gz
lua-36dd1af92dc0455684b997c15e736b0c56ef3f7c.tar.bz2
lua-36dd1af92dc0455684b997c15e736b0c56ef3f7c.zip
"[^]]" must mean "not ]".
Diffstat (limited to 'strlib.c')
-rw-r--r--strlib.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/strlib.c b/strlib.c
index bd471f7a..2063c9c6 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.25 1996/08/01 14:55:33 roberto Exp roberto $"; 6char *rcs_strlib="$Id: strlib.c,v 1.26 1996/08/05 20:55:24 roberto Exp roberto $";
7 7
8#include <string.h> 8#include <string.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -178,20 +178,25 @@ static void str_ascii (void)
178#define ESC '%' 178#define ESC '%'
179#define SPECIALS "^$*?.([%" 179#define SPECIALS "^$*?.([%"
180 180
181static char *bracket_end (char *p)
182{
183 return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']');
184}
185
181char *item_end (char *p) 186char *item_end (char *p)
182{ 187{
183 switch (*p) { 188 switch (*p++) {
184 case '\0': return p; 189 case '\0': return p-1;
185 case ESC: 190 case ESC:
186 if (*(p+1) == 0) lua_error("incorrect pattern"); 191 if (*p == 0) lua_error("incorrect pattern");
187 return p+2; 192 return p+1;
188 case '[': { 193 case '[': {
189 char *end = (*(p+1) == 0) ? NULL : strchr(p+2, ']'); 194 char *end = bracket_end(p);
190 if (end == NULL) lua_error("incorrect pattern"); 195 if (end == NULL) lua_error("incorrect pattern");
191 return end+1; 196 return end+1;
192 } 197 }
193 default: 198 default:
194 return p+1; 199 return p;
195 } 200 }
196} 201}
197 202
@@ -219,7 +224,7 @@ int singlematch (int c, char *p)
219 case '.': return 1; 224 case '.': return 1;
220 case ESC: return matchclass(c, *(p+1)); 225 case ESC: return matchclass(c, *(p+1));
221 case '[': { 226 case '[': {
222 char *end = strchr(p+2, ']'); 227 char *end = bracket_end(p+1);
223 int sig = *(p+1) == '^' ? (p++, 0) : 1; 228 int sig = *(p+1) == '^' ? (p++, 0) : 1;
224 while (++p < end) { 229 while (++p < end) {
225 if (*p == ESC) { 230 if (*p == ESC) {