Annotation of embedaddon/php/ext/mbstring/oniguruma/regerror.c, revision 1.1

1.1     ! misho       1: /**********************************************************************
        !             2:   regerror.c -  Oniguruma (regular expression library)
        !             3: **********************************************************************/
        !             4: /*-
        !             5:  * Copyright (c) 2002-2006  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms, with or without
        !             9:  * modification, are permitted provided that the following conditions
        !            10:  * are met:
        !            11:  * 1. Redistributions of source code must retain the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer.
        !            13:  * 2. Redistributions in binary form must reproduce the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer in the
        !            15:  *    documentation and/or other materials provided with the distribution.
        !            16:  *
        !            17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
        !            18:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            19:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            20:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
        !            21:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            22:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            23:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            25:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            26:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            27:  * SUCH DAMAGE.
        !            28:  */
        !            29: 
        !            30: #include "regint.h"
        !            31: #include <stdio.h> /* for vsnprintf() */
        !            32: 
        !            33: #ifdef HAVE_STDARG_PROTOTYPES
        !            34: #include <stdarg.h>
        !            35: #define va_init_list(a,b) va_start(a,b)
        !            36: #else
        !            37: #include <varargs.h>
        !            38: #define va_init_list(a,b) va_start(a)
        !            39: #endif
        !            40: 
        !            41: extern UChar*
        !            42: onig_error_code_to_format(int code)
        !            43: {
        !            44:   char *p;
        !            45: 
        !            46:   if (code >= 0) return (UChar* )0;
        !            47: 
        !            48:   switch (code) {
        !            49:   case ONIG_MISMATCH:
        !            50:     p = "mismatch"; break;
        !            51:   case ONIG_NO_SUPPORT_CONFIG:
        !            52:     p = "no support in this configuration"; break;
        !            53:   case ONIGERR_MEMORY:
        !            54:     p = "fail to memory allocation"; break;
        !            55:   case ONIGERR_MATCH_STACK_LIMIT_OVER:
        !            56:     p = "match-stack limit over"; break;
        !            57:   case ONIGERR_TYPE_BUG:
        !            58:     p = "undefined type (bug)"; break;
        !            59:   case ONIGERR_PARSER_BUG:
        !            60:     p = "internal parser error (bug)"; break;
        !            61:   case ONIGERR_STACK_BUG:
        !            62:     p = "stack error (bug)"; break;
        !            63:   case ONIGERR_UNDEFINED_BYTECODE:
        !            64:     p = "undefined bytecode (bug)"; break;
        !            65:   case ONIGERR_UNEXPECTED_BYTECODE:
        !            66:     p = "unexpected bytecode (bug)"; break;
        !            67:   case ONIGERR_DEFAULT_ENCODING_IS_NOT_SETTED:
        !            68:     p = "default multibyte-encoding is not setted"; break;
        !            69:   case ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:
        !            70:     p = "can't convert to wide-char on specified multibyte-encoding"; break;
        !            71:   case ONIGERR_INVALID_ARGUMENT:
        !            72:     p = "invalid argument"; break;
        !            73:   case ONIGERR_END_PATTERN_AT_LEFT_BRACE:
        !            74:     p = "end pattern at left brace"; break;
        !            75:   case ONIGERR_END_PATTERN_AT_LEFT_BRACKET:
        !            76:     p = "end pattern at left bracket"; break;
        !            77:   case ONIGERR_EMPTY_CHAR_CLASS:
        !            78:     p = "empty char-class"; break;
        !            79:   case ONIGERR_PREMATURE_END_OF_CHAR_CLASS:
        !            80:     p = "premature end of char-class"; break;
        !            81:   case ONIGERR_END_PATTERN_AT_ESCAPE:
        !            82:     p = "end pattern at escape"; break;
        !            83:   case ONIGERR_END_PATTERN_AT_META:
        !            84:     p = "end pattern at meta"; break;
        !            85:   case ONIGERR_END_PATTERN_AT_CONTROL:
        !            86:     p = "end pattern at control"; break;
        !            87:   case ONIGERR_META_CODE_SYNTAX:
        !            88:     p = "illegal meta-code syntax"; break;
        !            89:   case ONIGERR_CONTROL_CODE_SYNTAX:
        !            90:     p = "illegal control-code syntax"; break;
        !            91:   case ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:
        !            92:     p = "char-class value at end of range"; break;
        !            93:   case ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:
        !            94:     p = "char-class value at start of range"; break;
        !            95:   case ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:
        !            96:     p = "unmatched range specifier in char-class"; break;
        !            97:   case ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:
        !            98:     p = "target of repeat operator is not specified"; break;
        !            99:   case ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:
        !           100:     p = "target of repeat operator is invalid"; break;
        !           101:   case ONIGERR_NESTED_REPEAT_OPERATOR:
        !           102:     p = "nested repeat operator"; break;
        !           103:   case ONIGERR_UNMATCHED_CLOSE_PARENTHESIS:
        !           104:     p = "unmatched close parenthesis"; break;
        !           105:   case ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:
        !           106:     p = "end pattern with unmatched parenthesis"; break;
        !           107:   case ONIGERR_END_PATTERN_IN_GROUP:
        !           108:     p = "end pattern in group"; break;
        !           109:   case ONIGERR_UNDEFINED_GROUP_OPTION:
        !           110:     p = "undefined group option"; break;
        !           111:   case ONIGERR_INVALID_POSIX_BRACKET_TYPE:
        !           112:     p = "invalid POSIX bracket type"; break;
        !           113:   case ONIGERR_INVALID_LOOK_BEHIND_PATTERN:
        !           114:     p = "invalid pattern in look-behind"; break;
        !           115:   case ONIGERR_INVALID_REPEAT_RANGE_PATTERN:
        !           116:     p = "invalid repeat range {lower,upper}"; break;
        !           117:   case ONIGERR_TOO_BIG_NUMBER:
        !           118:     p = "too big number"; break;
        !           119:   case ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:
        !           120:     p = "too big number for repeat range"; break;
        !           121:   case ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:
        !           122:     p = "upper is smaller than lower in repeat range"; break;
        !           123:   case ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS:
        !           124:     p = "empty range in char class"; break;
        !           125:   case ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:
        !           126:     p = "mismatch multibyte code length in char-class range"; break;
        !           127:   case ONIGERR_TOO_MANY_MULTI_BYTE_RANGES:
        !           128:     p = "too many multibyte code ranges are specified"; break;
        !           129:   case ONIGERR_TOO_SHORT_MULTI_BYTE_STRING:
        !           130:     p = "too short multibyte code string"; break;
        !           131:   case ONIGERR_TOO_BIG_BACKREF_NUMBER:
        !           132:     p = "too big backref number"; break;
        !           133:   case ONIGERR_INVALID_BACKREF:
        !           134: #ifdef USE_NAMED_GROUP
        !           135:     p = "invalid backref number/name"; break;
        !           136: #else
        !           137:     p = "invalid backref number"; break;
        !           138: #endif
        !           139:   case ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED:
        !           140:     p = "numbered backref/call is not allowed. (use name)"; break;
        !           141:   case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:
        !           142:     p = "too big wide-char value"; break;
        !           143:   case ONIGERR_TOO_LONG_WIDE_CHAR_VALUE:
        !           144:     p = "too long wide-char value"; break;
        !           145:   case ONIGERR_INVALID_WIDE_CHAR_VALUE:
        !           146:     p = "invalid wide-char value"; break;
        !           147:   case ONIGERR_EMPTY_GROUP_NAME:
        !           148:     p = "group name is empty"; break;
        !           149:   case ONIGERR_INVALID_GROUP_NAME:
        !           150:     p = "invalid group name <%n>"; break;
        !           151:   case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:
        !           152: #ifdef USE_NAMED_GROUP
        !           153:     p = "invalid char in group name <%n>"; break;
        !           154: #else
        !           155:     p = "invalid char in group number <%n>"; break;
        !           156: #endif
        !           157:   case ONIGERR_UNDEFINED_NAME_REFERENCE:
        !           158:     p = "undefined name <%n> reference"; break;
        !           159:   case ONIGERR_UNDEFINED_GROUP_REFERENCE:
        !           160:     p = "undefined group <%n> reference"; break;
        !           161:   case ONIGERR_MULTIPLEX_DEFINED_NAME:
        !           162:     p = "multiplex defined name <%n>"; break;
        !           163:   case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:
        !           164:     p = "multiplex definition name <%n> call"; break;
        !           165:   case ONIGERR_NEVER_ENDING_RECURSION:
        !           166:     p = "never ending recursion"; break;
        !           167:   case ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY:
        !           168:     p = "group number is too big for capture history"; break;
        !           169:   case ONIGERR_INVALID_CHAR_PROPERTY_NAME:
        !           170:     p = "invalid character property name {%n}"; break;
        !           171:   case ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION:
        !           172:     p = "not supported encoding combination"; break;
        !           173:   case ONIGERR_INVALID_COMBINATION_OF_OPTIONS:
        !           174:     p = "invalid combination of options"; break;
        !           175:   case ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT:
        !           176:     p = "over thread pass limit count"; break;
        !           177: 
        !           178:   default:
        !           179:     p = "undefined error code"; break;
        !           180:   }
        !           181: 
        !           182:   return (UChar* )p;
        !           183: }
        !           184: 
        !           185: 
        !           186: static int to_ascii(OnigEncoding enc, UChar *s, UChar *end,
        !           187:                    UChar buf[], int buf_size, int *is_over)
        !           188: {
        !           189:   int len;
        !           190:   UChar *p;
        !           191:   OnigCodePoint code;
        !           192: 
        !           193:   if (ONIGENC_MBC_MINLEN(enc) > 1) {
        !           194:     p = s;
        !           195:     len = 0;
        !           196:     while (p < end) {
        !           197:       code = ONIGENC_MBC_TO_CODE(enc, p, end);
        !           198:       if (code >= 0x80) {
        !           199:        if (len + 5 <= buf_size) {
        !           200:          sprintf((char* )(&(buf[len])), "\\%03o",
        !           201:                  (unsigned int)(code & 0377));
        !           202:          len += 5;
        !           203:        }
        !           204:        else {
        !           205:          break;
        !           206:        }
        !           207:       }
        !           208:       else {
        !           209:        buf[len++] = (UChar )code;
        !           210:       }
        !           211: 
        !           212:       p += enc_len(enc, p);
        !           213:       if (len >= buf_size) break;
        !           214:     }
        !           215: 
        !           216:     *is_over = ((p < end) ? 1 : 0);
        !           217:   }
        !           218:   else {
        !           219:     len = MIN((end - s), buf_size);
        !           220:     xmemcpy(buf, s, (size_t )len);
        !           221:     *is_over = ((buf_size < (end - s)) ? 1 : 0);
        !           222:   }
        !           223: 
        !           224:   return len;
        !           225: }
        !           226: 
        !           227: 
        !           228: /* for ONIG_MAX_ERROR_MESSAGE_LEN */
        !           229: #define MAX_ERROR_PAR_LEN   30
        !           230: 
        !           231: extern int
        !           232: #ifdef HAVE_STDARG_PROTOTYPES
        !           233: onig_error_code_to_str(UChar* s, int code, ...)
        !           234: #else
        !           235: onig_error_code_to_str(s, code, va_alist)
        !           236:   UChar* s;
        !           237:   int code;
        !           238:   va_dcl 
        !           239: #endif
        !           240: {
        !           241:   UChar *p, *q;
        !           242:   OnigErrorInfo* einfo;
        !           243:   int len, is_over;
        !           244:   UChar parbuf[MAX_ERROR_PAR_LEN];
        !           245:   va_list vargs;
        !           246: 
        !           247:   va_init_list(vargs, code);
        !           248: 
        !           249:   switch (code) {
        !           250:   case ONIGERR_UNDEFINED_NAME_REFERENCE:
        !           251:   case ONIGERR_UNDEFINED_GROUP_REFERENCE:
        !           252:   case ONIGERR_MULTIPLEX_DEFINED_NAME:
        !           253:   case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:
        !           254:   case ONIGERR_INVALID_GROUP_NAME:
        !           255:   case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:
        !           256:   case ONIGERR_INVALID_CHAR_PROPERTY_NAME:
        !           257:     einfo = va_arg(vargs, OnigErrorInfo*);
        !           258:     len = to_ascii(einfo->enc, einfo->par, einfo->par_end,
        !           259:                   parbuf, MAX_ERROR_PAR_LEN - 3, &is_over);
        !           260:     q = onig_error_code_to_format(code);
        !           261:     p = s;
        !           262:     while (*q != '\0') {
        !           263:       if (*q == '%') {
        !           264:        q++;
        !           265:        if (*q == 'n') { /* '%n': name */
        !           266:          xmemcpy(p, parbuf, len);
        !           267:          p += len;
        !           268:          if (is_over != 0) {
        !           269:            xmemcpy(p, "...", 3);
        !           270:            p += 3;
        !           271:          }
        !           272:          q++;
        !           273:        }
        !           274:        else
        !           275:          goto normal_char;
        !           276:       }
        !           277:       else {
        !           278:       normal_char:
        !           279:        *p++ = *q++;
        !           280:       }
        !           281:     }
        !           282:     *p = '\0';
        !           283:     len = p - s;
        !           284:     break;
        !           285: 
        !           286:   default:
        !           287:     q = onig_error_code_to_format(code);
        !           288:     len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, q);
        !           289:     xmemcpy(s, q, len);
        !           290:     s[len] = '\0';
        !           291:     break;
        !           292:   }
        !           293: 
        !           294:   va_end(vargs);
        !           295:   return len;
        !           296: }
        !           297: 
        !           298: 
        !           299: void
        !           300: #ifdef HAVE_STDARG_PROTOTYPES
        !           301: onig_snprintf_with_pattern(UChar buf[], int bufsize, OnigEncoding enc,
        !           302:                            UChar* pat, UChar* pat_end, const UChar *fmt, ...)
        !           303: #else
        !           304: onig_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)
        !           305:     UChar buf[];
        !           306:     int bufsize;
        !           307:     OnigEncoding enc;
        !           308:     UChar* pat;
        !           309:     UChar* pat_end;
        !           310:     const UChar *fmt;
        !           311:     va_dcl
        !           312: #endif
        !           313: {
        !           314:   int n, need, len;
        !           315:   UChar *p, *s, *bp;
        !           316:   UChar bs[6];
        !           317:   va_list args;
        !           318: 
        !           319:   va_init_list(args, fmt);
        !           320:   n = vsnprintf((char* )buf, bufsize, (const char* )fmt, args);
        !           321:   va_end(args);
        !           322: 
        !           323:   need = (pat_end - pat) * 4 + 4;
        !           324: 
        !           325:   if (n + need < bufsize) {
        !           326:     strcat((char* )buf, ": /");
        !           327:     s = buf + onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, buf);
        !           328: 
        !           329:     p = pat;
        !           330:     while (p < pat_end) {
        !           331:       if (*p == MC_ESC(enc)) {
        !           332:        *s++ = *p++;
        !           333:        len = enc_len(enc, p);
        !           334:        while (len-- > 0) *s++ = *p++;
        !           335:       }
        !           336:       else if (*p == '/') {
        !           337:        *s++ = (unsigned char )MC_ESC(enc);
        !           338:        *s++ = *p++;
        !           339:       }
        !           340:       else if (ONIGENC_IS_MBC_HEAD(enc, p)) {
        !           341:         len = enc_len(enc, p);
        !           342:         if (ONIGENC_MBC_MINLEN(enc) == 1) {
        !           343:           while (len-- > 0) *s++ = *p++;
        !           344:         }
        !           345:         else { /* for UTF16 */
        !           346:           int blen;
        !           347: 
        !           348:           while (len-- > 0) {
        !           349:             sprintf((char* )bs, "\\%03o", *p++ & 0377);
        !           350:             blen = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);
        !           351:             bp = bs;
        !           352:             while (blen-- > 0) *s++ = *bp++;
        !           353:           }
        !           354:         }
        !           355:       }
        !           356:       else if (!ONIGENC_IS_CODE_PRINT(enc, *p) &&
        !           357:               !ONIGENC_IS_CODE_SPACE(enc, *p)) {
        !           358:        sprintf((char* )bs, "\\%03o", *p++ & 0377);
        !           359:        len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);
        !           360:         bp = bs;
        !           361:        while (len-- > 0) *s++ = *bp++;
        !           362:       }
        !           363:       else {
        !           364:        *s++ = *p++;
        !           365:       }
        !           366:     }
        !           367: 
        !           368:     *s++ = '/';
        !           369:     *s   = '\0';
        !           370:   }
        !           371: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>