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®_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>