home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ixemul-45.0-src.tgz / tar.out / contrib / ixemul / static / regerror.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  6KB  |  187 lines

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