regerror.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-
  2.  * Copyright (c) 1992, 1993, 1994 Henry Spencer.
  3.  * Copyright (c) 1992, 1993, 1994
  4.  * The Regents of the University of California.  All rights reserved.
  5.  *
  6.  * This code is derived from software contributed to Berkeley by
  7.  * Henry Spencer.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *   notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *   notice, this list of conditions and the following disclaimer in the
  16.  *   documentation and/or other materials provided with the distribution.
  17.  * 3. All advertising materials mentioning features or use of this software
  18.  *   must display the following acknowledgement:
  19.  * This product includes software developed by the University of
  20.  * California, Berkeley and its contributors.
  21.  * 4. Neither the name of the University nor the names of its contributors
  22.  *   may be used to endorse or promote products derived from this software
  23.  *   without specific prior written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28.  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35.  * SUCH DAMAGE.
  36.  *
  37.  * @(#)regerror.c 8.4 (Berkeley) 3/20/94
  38.  */
  39. #if defined(LIBC_SCCS) && !defined(lint)
  40. static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94";
  41. #endif  /* LIBC_SCCS and not lint */
  42. #include <sys/types.h>
  43. #include <stdio.h>
  44. #include <string.h>
  45. #include <ctype.h>
  46. #include <limits.h>
  47. #include <stdlib.h>
  48. #include <assert.h>
  49. #include <regex/regex.h>
  50. #include <regex/utils.h>
  51. #include <regex/regex2.h>
  52. /* ========= begin header generated by ./mkh ========= */
  53. #ifdef __cplusplus
  54. extern "C"
  55. {
  56. #endif
  57. /* === regerror.c === */
  58. static char *regatoi(const regex_t *preg, char *localbuf);
  59. #ifdef __cplusplus
  60. }
  61. #endif
  62. /* ========= end header generated by ./mkh ========= */
  63. /*
  64.  = #define REG_NOMATCH  1
  65.  = #define REG_BADPAT  2
  66.  = #define REG_ECOLLATE  3
  67.  = #define REG_ECTYPE  4
  68.  = #define REG_EESCAPE  5
  69.  = #define REG_ESUBREG  6
  70.  = #define REG_EBRACK  7
  71.  = #define REG_EPAREN  8
  72.  = #define REG_EBRACE  9
  73.  = #define REG_BADBR 10
  74.  = #define REG_ERANGE 11
  75.  = #define REG_ESPACE 12
  76.  = #define REG_BADRPT 13
  77.  = #define REG_EMPTY 14
  78.  = #define REG_ASSERT 15
  79.  = #define REG_INVARG 16
  80.  = #define REG_ATOI 255 // convert name to number (!)
  81.  = #define REG_ITOA 0400 // convert number to name (!)
  82.  */
  83. static struct rerr
  84. {
  85. int code;
  86. char    *name;
  87. char    *explain;
  88. } rerrs[] =
  89. {
  90. {
  91. REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match"
  92. },
  93. {
  94. REG_BADPAT, "REG_BADPAT", "invalid regular expression"
  95. },
  96. {
  97. REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element"
  98. },
  99. {
  100. REG_ECTYPE, "REG_ECTYPE", "invalid character class"
  101. },
  102. {
  103. REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\)"
  104. },
  105. {
  106. REG_ESUBREG, "REG_ESUBREG", "invalid backreference number"
  107. },
  108. {
  109. REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced"
  110. },
  111. {
  112. REG_EPAREN, "REG_EPAREN", "parentheses not balanced"
  113. },
  114. {
  115. REG_EBRACE, "REG_EBRACE", "braces not balanced"
  116. },
  117. {
  118. REG_BADBR, "REG_BADBR", "invalid repetition count(s)"
  119. },
  120. {
  121. REG_ERANGE, "REG_ERANGE", "invalid character range"
  122. },
  123. {
  124. REG_ESPACE, "REG_ESPACE", "out of memory"
  125. },
  126. {
  127. REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid"
  128. },
  129. {
  130. REG_EMPTY, "REG_EMPTY", "empty (sub)expression"
  131. },
  132. {
  133. REG_ASSERT, "REG_ASSERT", ""can't happen" -- you found a bug"
  134. },
  135. {
  136. REG_INVARG, "REG_INVARG", "invalid argument to regex routine"
  137. },
  138. {
  139. 0, "", "*** unknown regexp error code ***"
  140. }
  141. };
  142. /*
  143.  - regerror - the interface to error numbers
  144.  = extern size_t regerror(int, const regex_t *, char *, size_t);
  145.  */
  146. /* ARGSUSED */
  147. size_t
  148. pg95_regerror(errcode, preg, errbuf, errbuf_size)
  149. int errcode;
  150. const regex_t *preg;
  151. char    *errbuf;
  152. size_t errbuf_size;
  153. {
  154. struct rerr *r;
  155. size_t len;
  156. int target = errcode & ~REG_ITOA;
  157. char    *s;
  158. char convbuf[50];
  159. if (errcode == REG_ATOI)
  160. s = regatoi(preg, convbuf);
  161. else
  162. {
  163. for (r = rerrs; r->code != 0; r++)
  164. if (r->code == target)
  165. break;
  166. if (errcode & REG_ITOA)
  167. {
  168. if (r->code != 0)
  169. strcpy(convbuf, r->name);
  170. else
  171. sprintf(convbuf, "REG_0x%x", target);
  172. assert(strlen(convbuf) < sizeof(convbuf));
  173. s = convbuf;
  174. }
  175. else
  176. s = r->explain;
  177. }
  178. len = strlen(s) + 1;
  179. if (errbuf_size > 0)
  180. {
  181. if (errbuf_size > len)
  182. strcpy(errbuf, s);
  183. else
  184. {
  185. strncpy(errbuf, s, errbuf_size - 1);
  186. errbuf[errbuf_size - 1] = '';
  187. }
  188. }
  189. return len;
  190. }
  191. /*
  192.  - regatoi - internal routine to implement REG_ATOI
  193.  == static char *regatoi(const regex_t *preg, char *localbuf);
  194.  */
  195. static char *
  196. regatoi(preg, localbuf)
  197. const regex_t *preg;
  198. char    *localbuf;
  199. {
  200. struct rerr *r;
  201. for (r = rerrs; r->code != 0; r++)
  202. #ifdef MULTIBYTE
  203. if (pg_char_and_wchar_strcmp(r->name, preg->re_endp) == 0)
  204. #else
  205. if (strcmp(r->name, preg->re_endp) == 0)
  206. #endif
  207. break;
  208. if (r->code == 0)
  209. return "0";
  210. sprintf(localbuf, "%d", r->code);
  211. return localbuf;
  212. }