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