xref: /netbsd/external/bsd/tre/dist/lib/regerror.c (revision d714042b)
1*63d4abf0Sagc /*
2*63d4abf0Sagc   tre_regerror.c - POSIX tre_regerror() implementation for TRE.
3*63d4abf0Sagc 
4*63d4abf0Sagc   This software is released under a BSD-style license.
5*63d4abf0Sagc   See the file LICENSE for details and copyright.
6*63d4abf0Sagc 
7*63d4abf0Sagc */
8*63d4abf0Sagc 
9*63d4abf0Sagc #ifdef HAVE_CONFIG_H
10*63d4abf0Sagc #include <config.h>
11*63d4abf0Sagc #endif /* HAVE_CONFIG_H */
12*63d4abf0Sagc 
13*63d4abf0Sagc #include <string.h>
14*63d4abf0Sagc #ifdef HAVE_WCHAR_H
15*63d4abf0Sagc #include <wchar.h>
16*63d4abf0Sagc #endif /* HAVE_WCHAR_H */
17*63d4abf0Sagc #ifdef HAVE_WCTYPE_H
18*63d4abf0Sagc #include <wctype.h>
19*63d4abf0Sagc #endif /* HAVE_WCTYPE_H */
20*63d4abf0Sagc 
21*63d4abf0Sagc #include "tre-internal.h"
22*63d4abf0Sagc #include "tre.h"
23*63d4abf0Sagc 
24*63d4abf0Sagc #ifdef HAVE_GETTEXT
25*63d4abf0Sagc #include <libintl.h>
26*63d4abf0Sagc #else
27*63d4abf0Sagc #define dgettext(p, s) s
28*63d4abf0Sagc #define gettext(s) s
29*63d4abf0Sagc #endif
30*63d4abf0Sagc 
31*63d4abf0Sagc #define _(String) dgettext(PACKAGE, String)
32*63d4abf0Sagc #define gettext_noop(String) String
33*63d4abf0Sagc 
34*63d4abf0Sagc /* Error message strings for error codes listed in `tre.h'.  This list
35*63d4abf0Sagc    needs to be in sync with the codes listed there, naturally. */
36*63d4abf0Sagc static const char *tre_error_messages[] =
37*63d4abf0Sagc   { gettext_noop("No error"),				 /* REG_OK */
38*63d4abf0Sagc     gettext_noop("No match"),				 /* REG_NOMATCH */
39*63d4abf0Sagc     gettext_noop("Invalid regexp"),			 /* REG_BADPAT */
40*63d4abf0Sagc     gettext_noop("Unknown collating element"),		 /* REG_ECOLLATE */
41*63d4abf0Sagc     gettext_noop("Unknown character class name"),	 /* REG_ECTYPE */
42*63d4abf0Sagc     gettext_noop("Trailing backslash"),			 /* REG_EESCAPE */
43*63d4abf0Sagc     gettext_noop("Invalid back reference"),		 /* REG_ESUBREG */
44*63d4abf0Sagc     gettext_noop("Missing ']'"),			 /* REG_EBRACK */
45*63d4abf0Sagc     gettext_noop("Missing ')'"),			 /* REG_EPAREN */
46*63d4abf0Sagc     gettext_noop("Missing '}'"),			 /* REG_EBRACE */
47*63d4abf0Sagc     gettext_noop("Invalid contents of {}"),		 /* REG_BADBR */
48*63d4abf0Sagc     gettext_noop("Invalid character range"),		 /* REG_ERANGE */
49*63d4abf0Sagc     gettext_noop("Out of memory"),			 /* REG_ESPACE */
50*63d4abf0Sagc     gettext_noop("Invalid use of repetition operators")	 /* REG_BADRPT */
51*63d4abf0Sagc   };
52*63d4abf0Sagc 
53*63d4abf0Sagc size_t
tre_regerror(int errcode,const regex_t * preg,char * errbuf,size_t errbuf_size)54*63d4abf0Sagc tre_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
55*63d4abf0Sagc {
56*63d4abf0Sagc   const char *err;
57*63d4abf0Sagc   size_t err_len;
58*63d4abf0Sagc 
59*63d4abf0Sagc   /*LINTED*/(void)&preg;
60*63d4abf0Sagc   if (errcode >= 0
61*63d4abf0Sagc       && errcode < (int)(sizeof(tre_error_messages)
62*63d4abf0Sagc 			 / sizeof(*tre_error_messages)))
63*63d4abf0Sagc     err = gettext(tre_error_messages[errcode]);
64*63d4abf0Sagc   else
65*63d4abf0Sagc     err = gettext("Unknown error");
66*63d4abf0Sagc 
67*63d4abf0Sagc   err_len = strlen(err) + 1;
68*63d4abf0Sagc   if (errbuf_size > 0 && errbuf != NULL)
69*63d4abf0Sagc     {
70*63d4abf0Sagc       if (err_len > errbuf_size)
71*63d4abf0Sagc 	{
72*63d4abf0Sagc 	  strncpy(errbuf, err, errbuf_size - 1);
73*63d4abf0Sagc 	  errbuf[errbuf_size - 1] = '\0';
74*63d4abf0Sagc 	}
75*63d4abf0Sagc       else
76*63d4abf0Sagc 	{
77*63d4abf0Sagc 	  strcpy(errbuf, err);
78*63d4abf0Sagc 	}
79*63d4abf0Sagc     }
80*63d4abf0Sagc   return err_len;
81*63d4abf0Sagc }
82*63d4abf0Sagc 
83*63d4abf0Sagc /* EOF */
84