diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-08-09 10:14:11 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-08-09 10:14:11 -0300 |
commit | 36dd1af92dc0455684b997c15e736b0c56ef3f7c (patch) | |
tree | c527a56cbbc18456dcad13c117efc2ba08737dbc /strlib.c | |
parent | 25b6dae7c06a61d2f6d8890f4c071cc3fffee889 (diff) | |
download | lua-36dd1af92dc0455684b997c15e736b0c56ef3f7c.tar.gz lua-36dd1af92dc0455684b997c15e736b0c56ef3f7c.tar.bz2 lua-36dd1af92dc0455684b997c15e736b0c56ef3f7c.zip |
"[^]]" must mean "not ]".
Diffstat (limited to 'strlib.c')
-rw-r--r-- | strlib.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -3,7 +3,7 @@ | |||
3 | ** String library to LUA | 3 | ** String library to LUA |
4 | */ | 4 | */ |
5 | 5 | ||
6 | char *rcs_strlib="$Id: strlib.c,v 1.25 1996/08/01 14:55:33 roberto Exp roberto $"; | 6 | char *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 | ||
181 | static char *bracket_end (char *p) | ||
182 | { | ||
183 | return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']'); | ||
184 | } | ||
185 | |||
181 | char *item_end (char *p) | 186 | char *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) { |