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. */
36static 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
53size_t
54tre_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