xref: /dflybsd-src/contrib/tre/lib/regerror.c (revision d33005aaee6af52c80428b59b52aee522c002492)
15f2eab64SJohn Marino /*
25f2eab64SJohn Marino   tre_regerror.c - POSIX tre_regerror() implementation for TRE.
35f2eab64SJohn Marino 
45f2eab64SJohn Marino   This software is released under a BSD-style license.
55f2eab64SJohn Marino   See the file LICENSE for details and copyright.
65f2eab64SJohn Marino 
75f2eab64SJohn Marino */
85f2eab64SJohn Marino 
95f2eab64SJohn Marino #ifdef HAVE_CONFIG_H
105f2eab64SJohn Marino #include <config.h>
115f2eab64SJohn Marino #endif /* HAVE_CONFIG_H */
125f2eab64SJohn Marino 
135f2eab64SJohn Marino #include <string.h>
145f2eab64SJohn Marino #ifdef HAVE_WCHAR_H
155f2eab64SJohn Marino #include <wchar.h>
165f2eab64SJohn Marino #endif /* HAVE_WCHAR_H */
175f2eab64SJohn Marino #ifdef HAVE_WCTYPE_H
185f2eab64SJohn Marino #include <wctype.h>
195f2eab64SJohn Marino #endif /* HAVE_WCTYPE_H */
205f2eab64SJohn Marino 
215f2eab64SJohn Marino #include "tre-internal.h"
225f2eab64SJohn Marino #include "tre.h"
235f2eab64SJohn Marino 
245f2eab64SJohn Marino #ifdef HAVE_GETTEXT
255f2eab64SJohn Marino #include <libintl.h>
265f2eab64SJohn Marino #else
275f2eab64SJohn Marino #define dgettext(p, s) s
285f2eab64SJohn Marino #define gettext(s) s
295f2eab64SJohn Marino #endif
305f2eab64SJohn Marino 
315f2eab64SJohn Marino #define _(String) dgettext(PACKAGE, String)
325f2eab64SJohn Marino #define gettext_noop(String) String
335f2eab64SJohn Marino 
345f2eab64SJohn Marino /* Error message strings for error codes listed in `tre.h'.  This list
355f2eab64SJohn Marino    needs to be in sync with the codes listed there, naturally. */
365f2eab64SJohn Marino static const char *tre_error_messages[] =
375f2eab64SJohn Marino   { gettext_noop("No error"),				 /* REG_OK */
385f2eab64SJohn Marino     gettext_noop("No match"),				 /* REG_NOMATCH */
395f2eab64SJohn Marino     gettext_noop("Invalid regexp"),			 /* REG_BADPAT */
405f2eab64SJohn Marino     gettext_noop("Unknown collating element"),		 /* REG_ECOLLATE */
415f2eab64SJohn Marino     gettext_noop("Unknown character class name"),	 /* REG_ECTYPE */
425f2eab64SJohn Marino     gettext_noop("Trailing backslash"),			 /* REG_EESCAPE */
435f2eab64SJohn Marino     gettext_noop("Invalid back reference"),		 /* REG_ESUBREG */
445f2eab64SJohn Marino     gettext_noop("Missing ']'"),			 /* REG_EBRACK */
455f2eab64SJohn Marino     gettext_noop("Missing ')'"),			 /* REG_EPAREN */
465f2eab64SJohn Marino     gettext_noop("Missing '}'"),			 /* REG_EBRACE */
475f2eab64SJohn Marino     gettext_noop("Invalid contents of {}"),		 /* REG_BADBR */
485f2eab64SJohn Marino     gettext_noop("Invalid character range"),		 /* REG_ERANGE */
495f2eab64SJohn Marino     gettext_noop("Out of memory"),			 /* REG_ESPACE */
50d5f8dde1SJohn Marino     gettext_noop("Invalid use of repetition operators"), /* REG_BADRPT */
51d5f8dde1SJohn Marino     gettext_noop("Empty (sub)expression"),		 /* REG_EMPTY */
52d5f8dde1SJohn Marino     gettext_noop("Invalid argument to regex routine"),	 /* REG_INVARG */
53d5f8dde1SJohn Marino     gettext_noop("Illegal byte sequence")		 /* REG_ILLSEQ */
545f2eab64SJohn Marino   };
555f2eab64SJohn Marino 
565f2eab64SJohn Marino size_t
tre_regerror(int errcode,const regex_t * __restrict preg,char * __restrict errbuf,size_t errbuf_size)57*d33005aaSSascha Wildner tre_regerror(int errcode, const regex_t * __restrict preg,
58*d33005aaSSascha Wildner     char * __restrict errbuf, size_t errbuf_size)
595f2eab64SJohn Marino {
605f2eab64SJohn Marino   const char *err;
615f2eab64SJohn Marino   size_t err_len;
625f2eab64SJohn Marino 
635f2eab64SJohn Marino   /*LINTED*/(void)&preg;
645f2eab64SJohn Marino   if (errcode >= 0
655f2eab64SJohn Marino       && errcode < (int)(sizeof(tre_error_messages)
665f2eab64SJohn Marino 			 / sizeof(*tre_error_messages)))
675f2eab64SJohn Marino     err = gettext(tre_error_messages[errcode]);
685f2eab64SJohn Marino   else
695f2eab64SJohn Marino     err = gettext("Unknown error");
705f2eab64SJohn Marino 
715f2eab64SJohn Marino   err_len = strlen(err) + 1;
725f2eab64SJohn Marino   if (errbuf_size > 0 && errbuf != NULL)
735f2eab64SJohn Marino     {
745f2eab64SJohn Marino       if (err_len > errbuf_size)
755f2eab64SJohn Marino 	{
765f2eab64SJohn Marino 	  strncpy(errbuf, err, errbuf_size - 1);
775f2eab64SJohn Marino 	  errbuf[errbuf_size - 1] = '\0';
785f2eab64SJohn Marino 	}
795f2eab64SJohn Marino       else
805f2eab64SJohn Marino 	{
815f2eab64SJohn Marino 	  strcpy(errbuf, err);
825f2eab64SJohn Marino 	}
835f2eab64SJohn Marino     }
845f2eab64SJohn Marino   return err_len;
855f2eab64SJohn Marino }
865f2eab64SJohn Marino 
875f2eab64SJohn Marino /* EOF */
88