Home | History | Annotate | Line # | Download | only in lib
      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   };
     52 
     53 size_t
     54 tre_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
     55 {
     56   const char *err;
     57   size_t err_len;
     58 
     59   /*LINTED*/(void)&preg;
     60   if (errcode >= 0
     61       && errcode < (int)(sizeof(tre_error_messages)
     62 			 / sizeof(*tre_error_messages)))
     63     err = gettext(tre_error_messages[errcode]);
     64   else
     65     err = gettext("Unknown error");
     66 
     67   err_len = strlen(err) + 1;
     68   if (errbuf_size > 0 && errbuf != NULL)
     69     {
     70       if (err_len > errbuf_size)
     71 	{
     72 	  strncpy(errbuf, err, errbuf_size - 1);
     73 	  errbuf[errbuf_size - 1] = '\0';
     74 	}
     75       else
     76 	{
     77 	  strcpy(errbuf, err);
     78 	}
     79     }
     80   return err_len;
     81 }
     82 
     83 /* EOF */
     84