| 976 | } |
| 977 | |
| 978 | void* fxCharSetParseEscape(txPatternParser* parser, txBoolean punctuator, txInteger* kind) |
| 979 | { |
| 980 | void* result = NULL; |
| 981 | txInteger flag = 1; |
| 982 | switch(parser->character) { |
| 983 | case C_EOF: |
| 984 | break; |
| 985 | // character classes |
| 986 | case 'd': |
| 987 | result = fxCharSetDigits(parser); |
| 988 | fxPatternParserNext(parser); |
| 989 | break; |
| 990 | case 'D': |
| 991 | result = fxCharSetNot(parser, fxCharSetDigits(parser)); |
| 992 | fxPatternParserNext(parser); |
| 993 | break; |
| 994 | case 's': |
| 995 | result = fxCharSetSpaces(parser); |
| 996 | fxPatternParserNext(parser); |
| 997 | break; |
| 998 | case 'S': |
| 999 | result = fxCharSetNot(parser, fxCharSetSpaces(parser)); |
| 1000 | fxPatternParserNext(parser); |
| 1001 | break; |
| 1002 | case 'w': |
| 1003 | result = fxCharSetWords(parser); |
| 1004 | fxPatternParserNext(parser); |
| 1005 | break; |
| 1006 | case 'W': |
| 1007 | result = fxCharSetNot(parser, fxCharSetWords(parser)); |
| 1008 | fxPatternParserNext(parser); |
| 1009 | break; |
| 1010 | case 'p': |
| 1011 | result = fxCharSetUnicodeProperty(parser); |
| 1012 | fxPatternParserNext(parser); |
| 1013 | break; |
| 1014 | case 'P': |
| 1015 | result = fxCharSetNot(parser, fxCharSetUnicodeProperty(parser)); |
| 1016 | fxPatternParserNext(parser); |
| 1017 | break; |
| 1018 | default: |
| 1019 | fxPatternParserEscape(parser, punctuator); |
| 1020 | result = fxCharSetSingle(parser, parser->character); |
| 1021 | fxPatternParserNext(parser); |
| 1022 | flag = 0; |
| 1023 | break; |
| 1024 | } |
| 1025 | if (result == NULL) |
| 1026 | fxPatternParserError(parser, gxErrors[mxInvalidEscape]); |
| 1027 | if (kind) |
| 1028 | *kind = flag; |
| 1029 | return result; |
| 1030 | } |
| 1031 | |
| 1032 | void* fxCharSetParseItem(txPatternParser* parser) |
| 1033 | { |
no test coverage detected