| /* |
| tre_regerror.c - POSIX tre_regerror() implementation for TRE. |
| |
| This software is released under a BSD-style license. |
| See the file LICENSE for details and copyright. |
| |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include <config.h> |
| #endif /* HAVE_CONFIG_H */ |
| |
| #include <string.h> |
| #ifdef HAVE_WCHAR_H |
| #include <wchar.h> |
| #endif /* HAVE_WCHAR_H */ |
| #ifdef HAVE_WCTYPE_H |
| #include <wctype.h> |
| #endif /* HAVE_WCTYPE_H */ |
| |
| #include "tre-internal.h" |
| #include "tre.h" |
| |
| #ifdef HAVE_GETTEXT |
| #include <libintl.h> |
| #else |
| #define dgettext(p, s) s |
| #define gettext(s) s |
| #endif |
| |
| #define _(String) dgettext(PACKAGE, String) |
| #define gettext_noop(String) String |
| |
| /* Error message strings for error codes listed in `tre.h'. This list |
| needs to be in sync with the codes listed there, naturally. */ |
| static const char *tre_error_messages[] = |
| { gettext_noop("No error"), /* REG_OK */ |
| gettext_noop("No match"), /* REG_NOMATCH */ |
| gettext_noop("Invalid regexp"), /* REG_BADPAT */ |
| gettext_noop("Unknown collating element"), /* REG_ECOLLATE */ |
| gettext_noop("Unknown character class name"), /* REG_ECTYPE */ |
| gettext_noop("Trailing backslash"), /* REG_EESCAPE */ |
| gettext_noop("Invalid back reference"), /* REG_ESUBREG */ |
| gettext_noop("Missing ']'"), /* REG_EBRACK */ |
| gettext_noop("Missing ')'"), /* REG_EPAREN */ |
| gettext_noop("Missing '}'"), /* REG_EBRACE */ |
| gettext_noop("Invalid contents of {}"), /* REG_BADBR */ |
| gettext_noop("Invalid character range"), /* REG_ERANGE */ |
| gettext_noop("Out of memory"), /* REG_ESPACE */ |
| gettext_noop("Invalid use of repetition operators") /* REG_BADRPT */ |
| }; |
| |
| size_t |
| tre_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) |
| { |
| const char *err; |
| size_t err_len; |
| |
| /*LINTED*/(void)&preg; |
| if (errcode >= 0 |
| && errcode < (int)(sizeof(tre_error_messages) |
| / sizeof(*tre_error_messages))) |
| err = gettext(tre_error_messages[errcode]); |
| else |
| err = gettext("Unknown error"); |
| |
| err_len = strlen(err) + 1; |
| if (errbuf_size > 0 && errbuf != NULL) |
| { |
| if (err_len > errbuf_size) |
| { |
| strncpy(errbuf, err, errbuf_size - 1); |
| errbuf[errbuf_size - 1] = '\0'; |
| } |
| else |
| { |
| strcpy(errbuf, err); |
| } |
| } |
| return err_len; |
| } |
| |
| /* EOF */ |