regerror.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

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