Annotation of embedaddon/php/ext/ereg/regex/regerror.c, revision 1.1.1.1

1.1       misho       1: #include <sys/types.h>
                      2: #include <stdio.h>
                      3: #include <string.h>
                      4: #include <ctype.h>
                      5: #include <limits.h>
                      6: #include <stdlib.h>
                      7: 
                      8: #include "regex.h"
                      9: #include "utils.h"
                     10: #include "regerror.ih"
                     11: #include "php.h"
                     12: 
                     13: /*
                     14:  = #define     REG_OKAY         0
                     15:  = #define     REG_NOMATCH      1
                     16:  = #define     REG_BADPAT       2
                     17:  = #define     REG_ECOLLATE     3
                     18:  = #define     REG_ECTYPE       4
                     19:  = #define     REG_EESCAPE      5
                     20:  = #define     REG_ESUBREG      6
                     21:  = #define     REG_EBRACK       7
                     22:  = #define     REG_EPAREN       8
                     23:  = #define     REG_EBRACE       9
                     24:  = #define     REG_BADBR       10
                     25:  = #define     REG_ERANGE      11
                     26:  = #define     REG_ESPACE      12
                     27:  = #define     REG_BADRPT      13
                     28:  = #define     REG_EMPTY       14
                     29:  = #define     REG_ASSERT      15
                     30:  = #define     REG_INVARG      16
                     31:  = #define     REG_ATOI        255     // convert name to number (!)
                     32:  = #define     REG_ITOA        0400    // convert number to name (!)
                     33:  */
                     34: static const struct rerr {
                     35:        int code;
                     36:        const char *name;
                     37:        const char *explain;
                     38: } rerrs[] = {
                     39:        {REG_OKAY,      "REG_OKAY",     "no errors detected"},
                     40:        {REG_NOMATCH,   "REG_NOMATCH",  "regexec() failed to match"},
                     41:        {REG_BADPAT,    "REG_BADPAT",   "invalid regular expression"},
                     42:        {REG_ECOLLATE,  "REG_ECOLLATE", "invalid collating element"},
                     43:        {REG_ECTYPE,    "REG_ECTYPE",   "invalid character class"},
                     44:        {REG_EESCAPE,   "REG_EESCAPE",  "trailing backslash (\\)"},
                     45:        {REG_ESUBREG,   "REG_ESUBREG",  "invalid backreference number"},
                     46:        {REG_EBRACK,    "REG_EBRACK",   "brackets ([ ]) not balanced"},
                     47:        {REG_EPAREN,    "REG_EPAREN",   "parentheses not balanced"},
                     48:        {REG_EBRACE,    "REG_EBRACE",   "braces not balanced"},
                     49:        {REG_BADBR,     "REG_BADBR",    "invalid repetition count(s)"},
                     50:        {REG_ERANGE,    "REG_ERANGE",   "invalid character range"},
                     51:        {REG_ESPACE,    "REG_ESPACE",   "out of memory"},
                     52:        {REG_BADRPT,    "REG_BADRPT",   "repetition-operator operand invalid"},
                     53:        {REG_EMPTY,     "REG_EMPTY",    "empty (sub)expression"},
                     54:        {REG_ASSERT,    "REG_ASSERT",   "\"can't happen\" -- you found a bug"},
                     55:        {REG_INVARG,    "REG_INVARG",   "invalid argument to regex routine"},
                     56:        {-1,            "",             "*** unknown regexp error code ***"},
                     57: };
                     58: 
                     59: /*
                     60:  - regerror - the interface to error numbers
                     61:  = API_EXPORT(size_t) regerror(int, const regex_t *, char *, size_t);
                     62:  */
                     63: /* ARGSUSED */
                     64: API_EXPORT(size_t)
                     65: regerror(
                     66: int errcode,
                     67: const regex_t *preg,
                     68: char *errbuf,
                     69: size_t errbuf_size)
                     70: {
                     71:        register const struct rerr *r;
                     72:        register size_t len;
                     73:        register int target = errcode &~ REG_ITOA;
                     74:        register const char *s;
                     75:        char convbuf[50];
                     76: 
                     77:        if (errcode == REG_ATOI)
                     78:                s = regatoi(preg, convbuf, sizeof(convbuf));
                     79:        else {
                     80:                for (r = rerrs; r->code >= 0; r++)
                     81:                        if (r->code == target)
                     82:                                break;
                     83:        
                     84:                if (errcode&REG_ITOA) {
                     85:                        if (r->code >= 0) {
                     86:                                (void) strncpy(convbuf, r->name, sizeof(convbuf) - 1);
                     87:                                convbuf[sizeof(convbuf) - 1] = '\0';
                     88:                        } else {
                     89:                                snprintf(convbuf, sizeof(convbuf), "REG_0x%x", target);
                     90:                        }
                     91:                        assert(strlen(convbuf) < sizeof(convbuf));
                     92:                        s = convbuf;
                     93:                } else
                     94:                        s = r->explain;
                     95:        }
                     96: 
                     97:        len = strlen(s) + 1;
                     98:        if (errbuf_size > 0) {
                     99:                if (errbuf_size > len)
                    100:                        (void) strcpy(errbuf, s);
                    101:                else {
                    102:                        (void) strncpy(errbuf, s, errbuf_size-1);
                    103:                        errbuf[errbuf_size-1] = '\0';
                    104:                }
                    105:        }
                    106: 
                    107:        return(len);
                    108: }
                    109: 
                    110: /*
                    111:  - regatoi - internal routine to implement REG_ATOI
                    112:  == static char *regatoi(const regex_t *preg, char *localbuf, int bufsize);
                    113:  */
                    114: static char *
                    115: regatoi(preg, localbuf, bufsize)
                    116: const regex_t *preg;
                    117: char *localbuf;
                    118: int bufsize;
                    119: {
                    120:        register const struct rerr *r;
                    121: 
                    122:        for (r = rerrs; r->code >= 0; r++)
                    123:                if (strcmp(r->name, preg->re_endp) == 0)
                    124:                        break;
                    125:        if (r->code < 0)
                    126:                return("0");
                    127: 
                    128:        snprintf(localbuf, bufsize, "%d", r->code);
                    129:        return(localbuf);
                    130: }

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