summaryrefslogtreecommitdiff
path: root/ext/mbstring/oniguruma/regerror.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mbstring/oniguruma/regerror.c')
-rw-r--r--ext/mbstring/oniguruma/regerror.c267
1 files changed, 267 insertions, 0 deletions
diff --git a/ext/mbstring/oniguruma/regerror.c b/ext/mbstring/oniguruma/regerror.c
new file mode 100644
index 0000000000..a1e86c34f1
--- /dev/null
+++ b/ext/mbstring/oniguruma/regerror.c
@@ -0,0 +1,267 @@
+/**********************************************************************
+
+ regerror.c - Oniguruma (regular expression library)
+
+ Copyright (C) 2002-2003 K.Kosako (kosako@sofnec.co.jp)
+
+**********************************************************************/
+#include "regint.h"
+#include <stdio.h> /* for vsnprintf() */
+
+#ifdef HAVE_STDARG_PROTOTYPES
+#include <stdarg.h>
+#define va_init_list(a,b) va_start(a,b)
+#else
+#include <varargs.h>
+#define va_init_list(a,b) va_start(a)
+#endif
+
+extern char*
+regex_error_code_to_format(int code)
+{
+ char *p;
+
+ if (code >= 0) return (char* )0;
+
+ switch (code) {
+ case REG_MISMATCH:
+ p = "mismatch"; break;
+ case REG_NO_SUPPORT_CONFIG:
+ p = "no support in this configuration"; break;
+ case REGERR_MEMORY:
+ p = "fail to memory allocation"; break;
+ case REGERR_MATCH_STACK_LIMIT_OVER:
+ p = "match-stack limit over"; break;
+ case REGERR_TYPE_BUG:
+ p = "undefined type (bug)"; break;
+ case REGERR_PARSER_BUG:
+ p = "internal parser error (bug)"; break;
+ case REGERR_STACK_BUG:
+ p = "stack error (bug)"; break;
+ case REGERR_UNDEFINED_BYTECODE:
+ p = "undefined bytecode (bug)"; break;
+ case REGERR_UNEXPECTED_BYTECODE:
+ p = "unexpected bytecode (bug)"; break;
+ case REGERR_DEFAULT_ENCODING_IS_NOT_SETTED:
+ p = "default multibyte-encoding is not setted"; break;
+ case REGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:
+ p = "can't convert to wide-char on specified multibyte-encoding"; break;
+ case REGERR_END_PATTERN_AT_LEFT_BRACE:
+ p = "end pattern at left brace"; break;
+ case REGERR_END_PATTERN_AT_LEFT_BRACKET:
+ p = "end pattern at left bracket"; break;
+ case REGERR_EMPTY_CHAR_CLASS:
+ p = "empty char-class"; break;
+ case REGERR_PREMATURE_END_OF_CHAR_CLASS:
+ p = "premature end of char-class"; break;
+ case REGERR_END_PATTERN_AT_BACKSLASH:
+ p = "end pattern at backslash"; break;
+ case REGERR_END_PATTERN_AT_META:
+ p = "end pattern at meta"; break;
+ case REGERR_END_PATTERN_AT_CONTROL:
+ p = "end pattern at control"; break;
+ case REGERR_META_CODE_SYNTAX:
+ p = "illegal meta-code syntax"; break;
+ case REGERR_CONTROL_CODE_SYNTAX:
+ p = "illegal control-code syntax"; break;
+ case REGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:
+ p = "char-class value at end of range"; break;
+ case REGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:
+ p = "char-class value at start of range"; break;
+ case REGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:
+ p = "unmatched range specifier in char-class"; break;
+ case REGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:
+ p = "target of repeat operator is not specified"; break;
+ case REGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:
+ p = "target of repeat operator is invalid"; break;
+ case REGERR_NESTED_REPEAT_OPERATOR:
+ p = "nested repeat operator"; break;
+ case REGERR_UNMATCHED_CLOSE_PARENTHESIS:
+ p = "unmatched close parenthesis"; break;
+ case REGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:
+ p = "end pattern with unmatched parenthesis"; break;
+ case REGERR_END_PATTERN_IN_GROUP:
+ p = "end pattern in group"; break;
+ case REGERR_UNDEFINED_GROUP_OPTION:
+ p = "undefined group option"; break;
+ case REGERR_INVALID_POSIX_BRACKET_TYPE:
+ p = "invalid POSIX bracket type"; break;
+ case REGERR_INVALID_LOOK_BEHIND_PATTERN:
+ p = "invalid pattern in look-behind"; break;
+ case REGERR_INVALID_REPEAT_RANGE_PATTERN:
+ p = "invalid repeat range {lower,upper}"; break;
+ case REGERR_TOO_BIG_NUMBER:
+ p = "too big number"; break;
+ case REGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:
+ p = "too big number for repeat range"; break;
+ case REGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:
+ p = "upper is smaller than lower in repeat range"; break;
+ case REGERR_EMPTY_RANGE_IN_CHAR_CLASS:
+ p = "empty range in char class"; break;
+ case REGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:
+ p = "mismatch multibyte code length in char-class range"; break;
+ case REGERR_TOO_MANY_MULTI_BYTE_RANGES:
+ p = "too many multibyte code ranges are specified"; break;
+ case REGERR_TOO_SHORT_MULTI_BYTE_STRING:
+ p = "too short multibyte code string"; break;
+ case REGERR_TOO_BIG_BACKREF_NUMBER:
+ p = "too big backref number"; break;
+ case REGERR_INVALID_BACKREF:
+#ifdef USE_NAMED_SUBEXP
+ p = "invalid backref number/name"; break;
+#else
+ p = "invalid backref number"; break;
+#endif
+ case REGERR_TOO_BIG_WIDE_CHAR_VALUE:
+ p = "too big wide-char value"; break;
+ case REGERR_TOO_LONG_WIDE_CHAR_VALUE:
+ p = "too long wide-char value"; break;
+ case REGERR_INVALID_WIDE_CHAR_VALUE:
+ p = "invalid wide-char value"; break;
+ case REGERR_INVALID_SUBEXP_NAME:
+ p = "invalid subexp name"; break;
+ case REGERR_UNDEFINED_NAME_REFERENCE:
+ p = "undefined name <%n> reference"; break;
+ case REGERR_UNDEFINED_GROUP_REFERENCE:
+ p = "undefined group reference"; break;
+ case REGERR_MULTIPLEX_DEFINITION_NAME_CALL:
+ p = "multiplex definition name <%n> call"; break;
+ case REGERR_NEVER_ENDING_RECURSION:
+ p = "never ending recursion"; break;
+ case REGERR_OVER_THREAD_PASS_LIMIT_COUNT:
+ p = "over thread pass limit count"; break;
+
+ default:
+ p = "undefined error code"; break;
+ }
+
+ return p;
+}
+
+
+/* for REG_MAX_ERROR_MESSAGE_LEN */
+#define MAX_ERROR_PAR_LEN 30
+
+extern int
+#ifdef HAVE_STDARG_PROTOTYPES
+regex_error_code_to_str(UChar* s, int code, ...)
+#else
+regex_error_code_to_str(UChar* s, code, va_alist)
+ int code;
+ va_dcl
+#endif
+{
+ UChar *p, *q;
+ RegErrorInfo* einfo;
+ int len;
+ va_list vargs;
+
+ va_init_list(vargs, code);
+
+ switch (code) {
+ case REGERR_UNDEFINED_NAME_REFERENCE:
+ case REGERR_MULTIPLEX_DEFINITION_NAME_CALL:
+ einfo = va_arg(vargs, RegErrorInfo*);
+ len = einfo->par_end - einfo->par;
+ q = regex_error_code_to_format(code);
+ p = s;
+ while (*q != '\0') {
+ if (*q == '%') {
+ q++;
+ if (*q == 'n') { /* '%n': name */
+ if (len > MAX_ERROR_PAR_LEN) {
+ xmemcpy(p, einfo->par, MAX_ERROR_PAR_LEN - 3);
+ p += (MAX_ERROR_PAR_LEN - 3);
+ xmemcpy(p, "...", 3);
+ p += 3;
+ }
+ else {
+ xmemcpy(p, einfo->par, len);
+ p += len;
+ }
+ q++;
+ }
+ else
+ goto normal_char;
+ }
+ else {
+ normal_char:
+ *p++ = *q++;
+ }
+ }
+ *p = '\0';
+ len = p - s;
+ break;
+
+ default:
+ q = regex_error_code_to_format(code);
+ len = strlen(q);
+ xmemcpy(s, q, len);
+ s[len] = '\0';
+ break;
+ }
+
+ va_end(vargs);
+ return len;
+}
+
+
+void
+#ifdef HAVE_STDARG_PROTOTYPES
+regex_snprintf_with_pattern(char buf[], int bufsize, RegCharEncoding enc,
+ char* pat, char* pat_end, char *fmt, ...)
+#else
+regex_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)
+ char buf[];
+ int bufsize;
+ RegCharEncoding enc;
+ char* pat;
+ char* pat_end;
+ const char *fmt;
+ va_dcl
+#endif
+{
+ int n, need, len;
+ char *p, *s;
+ va_list args;
+
+ va_init_list(args, fmt);
+ n = vsnprintf(buf, bufsize, fmt, args);
+ va_end(args);
+
+ need = (pat_end - pat) * 4 + 4;
+
+ if (n + need < bufsize) {
+ strcat(buf, ": /");
+ s = buf + strlen(buf);
+
+ p = pat;
+ while (p < pat_end) {
+ if (*p == '\\') {
+ *s++ = *p++;
+ len = mblen(enc, *p);
+ while (len-- > 0) *s++ = *p++;
+ }
+ else if (*p == '/') {
+ *s++ = '\\';
+ *s++ = *p++;
+ }
+ else if (ismb(enc, *p)) {
+ len = mblen(enc, *p);
+ while (len-- > 0) *s++ = *p++;
+ }
+ else if (!IS_PRINT(*p) && !IS_SPACE(*p)) {
+ char b[5];
+ sprintf(b, "\\%03o", *p & 0377);
+ len = strlen(b);
+ while (len-- > 0) *s++ = *p++;
+ }
+ else {
+ *s++ = *p++;
+ }
+ }
+
+ *s++ = '/';
+ *s = '\0';
+ }
+}