gdb - Local mods (compile)
[dragonfly.git] / contrib / tre / lib / regerror.c
CommitLineData
5f2eab64
JM
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 */
d5f8dde1
JM
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 */
5f2eab64
JM
54 };
55
56size_t
57tre_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
58{
59 const char *err;
60 size_t err_len;
61
62 /*LINTED*/(void)&preg;
63 if (errcode >= 0
64 && errcode < (int)(sizeof(tre_error_messages)
65 / sizeof(*tre_error_messages)))
66 err = gettext(tre_error_messages[errcode]);
67 else
68 err = gettext("Unknown error");
69
70 err_len = strlen(err) + 1;
71 if (errbuf_size > 0 && errbuf != NULL)
72 {
73 if (err_len > errbuf_size)
74 {
75 strncpy(errbuf, err, errbuf_size - 1);
76 errbuf[errbuf_size - 1] = '\0';
77 }
78 else
79 {
80 strcpy(errbuf, err);
81 }
82 }
83 return err_len;
84}
85
86/* EOF */