| --- pcre_compile.c 2006-10-10 12:00:00.000000000 +0200 |
| +++ pcre_compile.c 2006-10-10 12:00:00.000000000 +0200 |
| @@ -129,10 +129,21 @@ |
| terminated by a zero length entry. The first three must be alpha, lower, upper, |
| as this is assumed for handling case independence. */ |
| |
| -static const char *const posix_names[] = { |
| - "alpha", "lower", "upper", |
| - "alnum", "ascii", "blank", "cntrl", "digit", "graph", |
| - "print", "punct", "space", "word", "xdigit" }; |
| +static const char posix_names[] = |
| + "alpha\0" |
| + "lower\0" |
| + "upper\0" |
| + "alnum\0" |
| + "ascii\0" |
| + "blank\0" |
| + "cntrl\0" |
| + "digit\0" |
| + "graph\0" |
| + "print\0" |
| + "punct\0" |
| + "space\0" |
| + "word\0" |
| + "xdigit"; |
| |
| static const uschar posix_name_lengths[] = { |
| 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; |
| @@ -173,76 +184,138 @@ |
| they are documented. Always add a new error instead. Messages marked DEAD below |
| are no longer used. */ |
| |
| -static const char *error_texts[] = { |
| - "no error", |
| - "\\ at end of pattern", |
| - "\\c at end of pattern", |
| - "unrecognized character follows \\", |
| - "numbers out of order in {} quantifier", |
| +#define DEAD(s) "\0" |
| + |
| +static const char error_texts[] = |
| + "no error\0" |
| + "\\ at end of pattern\0" |
| + "\\c at end of pattern\0" |
| + "unrecognized character follows \\\0" |
| + "numbers out of order in {} quantifier\0" |
| /* 5 */ |
| - "number too big in {} quantifier", |
| - "missing terminating ] for character class", |
| - "invalid escape sequence in character class", |
| - "range out of order in character class", |
| - "nothing to repeat", |
| + "number too big in {} quantifier\0" |
| + "missing terminating ] for character class\0" |
| + "invalid escape sequence in character class\0" |
| + "range out of order in character class\0" |
| + "nothing to repeat\0" |
| /* 10 */ |
| - "operand of unlimited repeat could match the empty string", /** DEAD **/ |
| - "internal error: unexpected repeat", |
| - "unrecognized character after (?", |
| - "POSIX named classes are supported only within a class", |
| - "missing )", |
| + DEAD("operand of unlimited repeat could match the empty string") |
| + "internal error: unexpected repeat\0" |
| + "unrecognized character after (?\0" |
| + "POSIX named classes are supported only within a class\0" |
| + "missing )\0" |
| /* 15 */ |
| - "reference to non-existent subpattern", |
| - "erroffset passed as NULL", |
| - "unknown option bit(s) set", |
| - "missing ) after comment", |
| - "parentheses nested too deeply", /** DEAD **/ |
| + "reference to non-existent subpattern\0" |
| + "erroffset passed as NULL\0" |
| + "unknown option bit(s) set\0" |
| + "missing ) after comment\0" |
| + DEAD("parentheses nested too deeply") |
| /* 20 */ |
| - "regular expression too large", |
| - "failed to get memory", |
| - "unmatched parentheses", |
| - "internal error: code overflow", |
| - "unrecognized character after (?<", |
| + "regular expression too large\0" |
| + "failed to get memory\0" |
| + "unmatched parentheses\0" |
| + "internal error: code overflow\0" |
| + "unrecognized character after (?<\0" |
| /* 25 */ |
| - "lookbehind assertion is not fixed length", |
| - "malformed number or name after (?(", |
| - "conditional group contains more than two branches", |
| - "assertion expected after (?(", |
| - "(?R or (?digits must be followed by )", |
| + "lookbehind assertion is not fixed length\0" |
| + "malformed number or name after (?(\0" |
| + "conditional group contains more than two branches\0" |
| + "assertion expected after (?(\0" |
| + "(?R or (?digits must be followed by )\0" |
| /* 30 */ |
| - "unknown POSIX class name", |
| - "POSIX collating elements are not supported", |
| - "this version of PCRE is not compiled with PCRE_UTF8 support", |
| - "spare error", /** DEAD **/ |
| - "character value in \\x{...} sequence is too large", |
| + "unknown POSIX class name\0" |
| + "POSIX collating elements are not supported\0" |
| + "this version of PCRE is not compiled with PCRE_UTF8 support\0" |
| + DEAD("spare error") |
| + "character value in \\x{...} sequence is too large\0" |
| /* 35 */ |
| - "invalid condition (?(0)", |
| - "\\C not allowed in lookbehind assertion", |
| - "PCRE does not support \\L, \\l, \\N, \\U, or \\u", |
| - "number after (?C is > 255", |
| - "closing ) for (?C expected", |
| + "invalid condition (?(0)\0" |
| + "\\C not allowed in lookbehind assertion\0" |
| + "PCRE does not support \\L, \\l, \\N, \\U, or \\u\0" |
| + "number after (?C is > 255\0" |
| + "closing ) for (?C expected\0" |
| /* 40 */ |
| - "recursive call could loop indefinitely", |
| - "unrecognized character after (?P", |
| - "syntax error in subpattern name (missing terminator)", |
| - "two named subpatterns have the same name", |
| - "invalid UTF-8 string", |
| + "recursive call could loop indefinitely\0" |
| + "unrecognized character after (?P\0" |
| + "syntax error in subpattern name (missing terminator)\0" |
| + "two named subpatterns have the same name\0" |
| + "invalid UTF-8 string\0" |
| /* 45 */ |
| - "support for \\P, \\p, and \\X has not been compiled", |
| - "malformed \\P or \\p sequence", |
| - "unknown property name after \\P or \\p", |
| - "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)", |
| - "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")", |
| + "support for \\P, \\p, and \\X has not been compiled\0" |
| + "malformed \\P or \\p sequence\0" |
| + "unknown property name after \\P or \\p\0" |
| + "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0" |
| + "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0" |
| /* 50 */ |
| - "repeated subpattern is too long", |
| - "octal value is greater than \\377 (not in UTF-8 mode)", |
| - "internal error: overran compiling workspace", |
| - "internal error: previously-checked referenced subpattern not found", |
| - "DEFINE group contains more than one branch", |
| + "repeated subpattern is too long\0" |
| + "octal value is greater than \\377 (not in UTF-8 mode)\0" |
| + "internal error: overran compiling workspace\0" |
| + "internal error: previously-checked referenced subpattern not found\0" |
| + "DEFINE group contains more than one branch\0" |
| /* 55 */ |
| - "repeating a DEFINE group is not allowed", |
| - "inconsistent NEWLINE options", |
| - "\\g is not followed by an (optionally braced) non-zero number" |
| + "repeating a DEFINE group is not allowed\0" |
| + "inconsistent NEWLINE options\0" |
| + "\\g is not followed by an (optionally braced) non-zero number"; |
| + |
| +static const int error_texts_offsets[] = { |
| + 0, |
| + 9, |
| + 29, |
| + 50, |
| + 83, |
| + 121, |
| + 153, |
| + 195, |
| + 238, |
| + 276, |
| + 294, |
| + 295, |
| + 329, |
| + 361, |
| + 415, |
| + 425, |
| + 462, |
| + 487, |
| + 513, |
| + 537, |
| + 538, |
| + 567, |
| + 588, |
| + 610, |
| + 640, |
| + 673, |
| + 714, |
| + 749, |
| + 799, |
| + 828, |
| + 866, |
| + 891, |
| + 934, |
| + 994, |
| + 995, |
| + 1044, |
| + 1068, |
| + 1107, |
| + 1151, |
| + 1177, |
| + 1204, |
| + 1243, |
| + 1276, |
| + 1329, |
| + 1370, |
| + 1391, |
| + 1440, |
| + 1468, |
| + 1505, |
| + 1557, |
| + 1600, |
| + 1632, |
| + 1685, |
| + 1729, |
| + 1796, |
| + 1839, |
| + 1879, |
| + 1908 |
| }; |
| |
| |
| @@ -1453,14 +1526,16 @@ |
| static int |
| check_posix_name(const uschar *ptr, int len) |
| { |
| -register int yield = 0; |
| -while (posix_name_lengths[yield] != 0) |
| - { |
| - if (len == posix_name_lengths[yield] && |
| - strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; |
| - yield++; |
| - } |
| -return -1; |
| + int offset = 0; |
| + int yield = 0; |
| + while (posix_name_lengths[yield] != 0) |
| + { |
| + if (len == posix_name_lengths[yield] && |
| + strcmp((const char *)ptr, posix_names + offset) == 0) return yield; |
| + offset += posix_name_lengths[yield] + 1; |
| + yield++; |
| + } |
| + return -1; |
| } |
| |
| |
| @@ -5200,7 +5275,7 @@ |
| #ifdef SUPPORT_UTF8 |
| PCRE_UTF8_ERROR_RETURN: |
| #endif |
| - *errorptr = error_texts[errorcode]; |
| + *errorptr = error_texts + error_texts_offsets[errorcode]; |
| if (errorcodeptr != NULL) *errorcodeptr = errorcode; |
| return NULL; |
| } |
| @@ -5297,7 +5372,7 @@ |
| if (code - codestart > length) |
| { |
| (pcre_free)(re); |
| - *errorptr = error_texts[ERR23]; |
| + *errorptr = error_texts + error_texts_offsets[ERR23]; |
| *erroroffset = ptr - (uschar *)pattern; |
| if (errorcodeptr != NULL) *errorcodeptr = ERR23; |
| return NULL; |