| 2314 | } |
| 2315 | |
| 2316 | void fxPatternParserEscape(txPatternParser* parser, txBoolean punctuator) |
| 2317 | { |
| 2318 | switch(parser->character) { |
| 2319 | case C_EOF: |
| 2320 | break; |
| 2321 | // control escapes |
| 2322 | case 'f': |
| 2323 | parser->character = '\f'; |
| 2324 | break; |
| 2325 | case 'n': |
| 2326 | parser->character = '\n'; |
| 2327 | break; |
| 2328 | case 'r': |
| 2329 | parser->character = '\r'; |
| 2330 | break; |
| 2331 | case 't': |
| 2332 | parser->character = '\t'; |
| 2333 | break; |
| 2334 | case 'v': |
| 2335 | parser->character = '\v'; |
| 2336 | break; |
| 2337 | // control letters |
| 2338 | case 'c': { |
| 2339 | txInteger value; |
| 2340 | fxPatternParserNext(parser); |
| 2341 | value = parser->character; |
| 2342 | if ((('a' <= value) && (value <= 'z')) || (('A' <= value) && (value <= 'Z'))) |
| 2343 | parser->character = value % 32; |
| 2344 | else |
| 2345 | fxPatternParserError(parser, gxErrors[mxInvalidEscape]); |
| 2346 | } break; |
| 2347 | // null |
| 2348 | case '0': { |
| 2349 | txString p = parser->pattern + parser->offset; |
| 2350 | if ((*p < '0') || ('9' < *p)) |
| 2351 | parser->character = 0; |
| 2352 | else |
| 2353 | fxPatternParserError(parser, gxErrors[mxInvalidEscape]); |
| 2354 | } break; |
| 2355 | case 'x': { |
| 2356 | txString p = parser->pattern + parser->offset; |
| 2357 | if (fxParseHexEscape(&p, &parser->character)) |
| 2358 | parser->offset = mxPtrDiff(p - parser->pattern); |
| 2359 | else if (parser->flags & XS_REGEXP_UV) |
| 2360 | fxPatternParserError(parser, gxErrors[mxInvalidEscape]); |
| 2361 | } break; |
| 2362 | case 'u': { |
| 2363 | txString p = parser->pattern + parser->offset; |
| 2364 | if (fxParseUnicodeEscape(&p, &parser->character, (parser->flags & XS_REGEXP_UV) ? 1 : 0, (parser->flags & XS_REGEXP_UV) ? '\\' : 0)) |
| 2365 | parser->offset = mxPtrDiff(p - parser->pattern); |
| 2366 | else if (parser->flags & XS_REGEXP_UV) |
| 2367 | fxPatternParserError(parser, gxErrors[mxInvalidEscape]); |
| 2368 | } break; |
| 2369 | case '^': |
| 2370 | case '$': |
| 2371 | case '\\': |
| 2372 | case '.': |
| 2373 | case '*': |
no test coverage detected