| 1094 | } |
| 1095 | |
| 1096 | void* fxCharSetRange(txPatternParser* parser, txCharSet* set1, txCharSet* set2) |
| 1097 | { |
| 1098 | if ((set1->strings == C_NULL) && (set2->strings == C_NULL)) { |
| 1099 | txCharSet* result; |
| 1100 | if (set1->characters[0] == 0) |
| 1101 | return set2; |
| 1102 | if (set2->characters[0] == 0) |
| 1103 | return set1; |
| 1104 | if ((set1->characters[0] != 2) || (set2->characters[0] != 2)) |
| 1105 | fxPatternParserError(parser, gxErrors[mxInvalidRange]); |
| 1106 | if ((set1->characters[1] + 1 != set1->characters[2]) || (set2->characters[1] + 1 != set2->characters[2])) |
| 1107 | fxPatternParserError(parser, gxErrors[mxInvalidRange]); |
| 1108 | if ((set1->characters[1] > set2->characters[1])) |
| 1109 | fxPatternParserError(parser, gxErrors[mxInvalidRange]); |
| 1110 | if (parser->flags & XS_REGEXP_I) { |
| 1111 | txBoolean flag = (parser->flags & XS_REGEXP_UV) ? 1 : 0; |
| 1112 | txInteger begin = set1->characters[1]; |
| 1113 | txInteger end = set2->characters[1]; |
| 1114 | struct { |
| 1115 | txTermPart; |
| 1116 | txInteger stringCount; |
| 1117 | txString* strings; |
| 1118 | txInteger characters[3]; |
| 1119 | } _set; |
| 1120 | txCharSet* set = (txCharSet*)&_set; |
| 1121 | set->next = C_NULL; |
| 1122 | set->dispatch.code = fxCharSetCode; |
| 1123 | set->stringCount = 0; |
| 1124 | set->strings = C_NULL; |
| 1125 | set->characters[0] = 2; |
| 1126 | result = fxCharSetEmpty(parser); |
| 1127 | while (begin <= end) { |
| 1128 | set->characters[1] = fxCharCaseCanonicalize(begin, flag); |
| 1129 | set->characters[2] = set->characters[1] + 1; |
| 1130 | result = fxCharSetCombine(parser, result, set, mxCharSetUnionOp); |
| 1131 | begin++; |
| 1132 | } |
| 1133 | } |
| 1134 | else { |
| 1135 | result = fxPatternParserCreateTerm(parser, sizeof(txCharSet) + (2 * sizeof(txInteger)), fxCharSetMeasure); |
| 1136 | result->stringCount = 0; |
| 1137 | result->strings = C_NULL; |
| 1138 | result->characters[0] = 2; |
| 1139 | result->characters[1] = set1->characters[1]; |
| 1140 | result->characters[2] = set2->characters[2]; |
| 1141 | } |
| 1142 | return result; |
| 1143 | } |
| 1144 | fxPatternParserError(parser, gxErrors[mxInvalidPattern]); |
| 1145 | return C_NULL; |
| 1146 | } |
| 1147 | |
| 1148 | void* fxCharSetSingle(txPatternParser* parser, txInteger character) |
| 1149 | { |
no test coverage detected