Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /* error.c - libidn2 error handling helpers.  | 
2  |  |    Copyright (C) 2011-2024 Simon Josefsson  | 
3  |  |  | 
4  |  |    Libidn2 is free software: you can redistribute it and/or modify it  | 
5  |  |    under the terms of either:  | 
6  |  |  | 
7  |  |      * the GNU Lesser General Public License as published by the Free  | 
8  |  |        Software Foundation; either version 3 of the License, or (at  | 
9  |  |        your option) any later version.  | 
10  |  |  | 
11  |  |    or  | 
12  |  |  | 
13  |  |      * the GNU General Public License as published by the Free  | 
14  |  |        Software Foundation; either version 2 of the License, or (at  | 
15  |  |        your option) any later version.  | 
16  |  |  | 
17  |  |    or both in parallel, as here.  | 
18  |  |  | 
19  |  |    This program is distributed in the hope that it will be useful,  | 
20  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of  | 
21  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  | 
22  |  |    GNU General Public License for more details.  | 
23  |  |  | 
24  |  |    You should have received copies of the GNU General Public License and  | 
25  |  |    the GNU Lesser General Public License along with this program.  If  | 
26  |  |    not, see <http://www.gnu.org/licenses/>.  | 
27  |  | */  | 
28  |  |  | 
29  |  | #include <config.h>  | 
30  |  |  | 
31  |  | #include "idn2.h"  | 
32  |  |  | 
33  |  | /* Prepare for gettext. */  | 
34  | 0  | #define _(x) x  | 
35  |  | #define bindtextdomain(a,b)  | 
36  |  |  | 
37  |  | /**  | 
38  |  |  * idn2_strerror:  | 
39  |  |  * @rc: return code from another libidn2 function.  | 
40  |  |  *  | 
41  |  |  * Convert internal libidn2 error code to a humanly readable string.  | 
42  |  |  * The returned pointer must not be de-allocated by the caller.  | 
43  |  |  *  | 
44  |  |  * Return value: A humanly readable string describing error.  | 
45  |  |  **/  | 
46  |  | const char *  | 
47  |  | idn2_strerror (int rc)  | 
48  | 0  | { | 
49  | 0  |   bindtextdomain (PACKAGE, LOCALEDIR);  | 
50  |  | 
  | 
51  | 0  |   switch (rc)  | 
52  | 0  |     { | 
53  | 0  |     case IDN2_OK:  | 
54  | 0  |       return _("success"); | 
55  | 0  |     case IDN2_MALLOC:  | 
56  | 0  |       return _("out of memory"); | 
57  | 0  |     case IDN2_NO_CODESET:  | 
58  | 0  |       return _("could not determine locale encoding format"); | 
59  | 0  |     case IDN2_ICONV_FAIL:  | 
60  | 0  |       return _("could not convert string to UTF-8"); | 
61  | 0  |     case IDN2_ENCODING_ERROR:  | 
62  | 0  |       return _("string encoding error"); | 
63  | 0  |     case IDN2_NFC:  | 
64  | 0  |       return _("string could not be NFC normalized"); | 
65  | 0  |     case IDN2_PUNYCODE_BAD_INPUT:  | 
66  | 0  |       return _("string contains invalid punycode data"); | 
67  | 0  |     case IDN2_PUNYCODE_BIG_OUTPUT:  | 
68  | 0  |       return _("punycode encoded data will be too large"); | 
69  | 0  |     case IDN2_PUNYCODE_OVERFLOW:  | 
70  | 0  |       return _("punycode conversion resulted in overflow"); | 
71  | 0  |     case IDN2_TOO_BIG_DOMAIN:  | 
72  | 0  |       return _("domain name longer than 255 characters"); | 
73  | 0  |     case IDN2_TOO_BIG_LABEL:  | 
74  | 0  |       return _("domain label longer than 63 characters"); | 
75  | 0  |     case IDN2_INVALID_ALABEL:  | 
76  | 0  |       return _("input A-label is not valid"); | 
77  | 0  |     case IDN2_UALABEL_MISMATCH:  | 
78  | 0  |       return _("input A-label and U-label does not match"); | 
79  | 0  |     case IDN2_NOT_NFC:  | 
80  | 0  |       return _("string is not in Unicode NFC format"); | 
81  | 0  |     case IDN2_2HYPHEN:  | 
82  | 0  |       return _("string contains forbidden two hyphens pattern"); | 
83  | 0  |     case IDN2_HYPHEN_STARTEND:  | 
84  | 0  |       return _("string start/ends with forbidden hyphen"); | 
85  | 0  |     case IDN2_LEADING_COMBINING:  | 
86  | 0  |       return _("string contains a forbidden leading combining character"); | 
87  | 0  |     case IDN2_DISALLOWED:  | 
88  | 0  |       return _("string contains a disallowed character"); | 
89  | 0  |     case IDN2_CONTEXTJ:  | 
90  | 0  |       return _("string contains a forbidden context-j character"); | 
91  | 0  |     case IDN2_CONTEXTJ_NO_RULE:  | 
92  | 0  |       return _("string contains a context-j character with null rule"); | 
93  | 0  |     case IDN2_CONTEXTO:  | 
94  | 0  |       return _("string contains a forbidden context-o character"); | 
95  | 0  |     case IDN2_CONTEXTO_NO_RULE:  | 
96  | 0  |       return _("string contains a context-o character with null rule"); | 
97  | 0  |     case IDN2_UNASSIGNED:  | 
98  | 0  |       return _("string contains unassigned code point"); | 
99  | 0  |     case IDN2_BIDI:  | 
100  | 0  |       return _("string has forbidden bi-directional properties"); | 
101  | 0  |     case IDN2_DOT_IN_LABEL:  | 
102  | 0  |       return _("domain label has forbidden dot (TR46)"); | 
103  | 0  |     case IDN2_INVALID_TRANSITIONAL:  | 
104  | 0  |       return  | 
105  | 0  |   _("domain label has character forbidden in transitional mode (TR46)"); | 
106  | 0  |     case IDN2_INVALID_NONTRANSITIONAL:  | 
107  | 0  |       return  | 
108  | 0  |   _  | 
109  | 0  |   ("domain label has character forbidden in non-transitional mode (TR46)"); | 
110  | 0  |     case IDN2_ALABEL_ROUNDTRIP_FAILED:  | 
111  | 0  |       return _("A-label roundtrip failed"); | 
112  | 0  |     default:  | 
113  | 0  |       return _("Unknown error"); | 
114  | 0  |     }  | 
115  | 0  | }  | 
116  |  |  | 
117  | 0  | #define ERR2STR(name) #name  | 
118  |  |  | 
119  |  | /**  | 
120  |  |  * idn2_strerror_name:  | 
121  |  |  * @rc: return code from another libidn2 function.  | 
122  |  |  *  | 
123  |  |  * Convert internal libidn2 error code to a string corresponding to  | 
124  |  |  * internal header file symbols.  For example,  | 
125  |  |  * idn2_strerror_name(IDN2_MALLOC) will return the string  | 
126  |  |  * "IDN2_MALLOC".  | 
127  |  |  *  | 
128  |  |  * The caller must not attempt to de-allocate the returned string.  | 
129  |  |  *  | 
130  |  |  * Return value: A string corresponding to error code symbol.  | 
131  |  |  **/  | 
132  |  | const char *  | 
133  |  | idn2_strerror_name (int rc)  | 
134  | 0  | { | 
135  | 0  |   switch (rc)  | 
136  | 0  |     { | 
137  | 0  |     case IDN2_OK:  | 
138  | 0  |       return ERR2STR (IDN2_OK);  | 
139  | 0  |     case IDN2_MALLOC:  | 
140  | 0  |       return ERR2STR (IDN2_MALLOC);  | 
141  | 0  |     case IDN2_NO_CODESET:  | 
142  | 0  |       return ERR2STR (IDN2_NO_NODESET);  | 
143  | 0  |     case IDN2_ICONV_FAIL:  | 
144  | 0  |       return ERR2STR (IDN2_ICONV_FAIL);  | 
145  | 0  |     case IDN2_ENCODING_ERROR:  | 
146  | 0  |       return ERR2STR (IDN2_ENCODING_ERROR);  | 
147  | 0  |     case IDN2_NFC:  | 
148  | 0  |       return ERR2STR (IDN2_NFC);  | 
149  | 0  |     case IDN2_PUNYCODE_BAD_INPUT:  | 
150  | 0  |       return ERR2STR (IDN2_PUNYCODE_BAD_INPUT);  | 
151  | 0  |     case IDN2_PUNYCODE_BIG_OUTPUT:  | 
152  | 0  |       return ERR2STR (IDN2_PUNYCODE_BIG_OUTPUT);  | 
153  | 0  |     case IDN2_PUNYCODE_OVERFLOW:  | 
154  | 0  |       return ERR2STR (IDN2_PUNYCODE_OVERFLOW);  | 
155  | 0  |     case IDN2_TOO_BIG_DOMAIN:  | 
156  | 0  |       return ERR2STR (IDN2_TOO_BIG_DOMAIN);  | 
157  | 0  |     case IDN2_TOO_BIG_LABEL:  | 
158  | 0  |       return ERR2STR (IDN2_TOO_BIG_LABEL);  | 
159  | 0  |     case IDN2_INVALID_ALABEL:  | 
160  | 0  |       return ERR2STR (IDN2_INVALID_ALABEL);  | 
161  | 0  |     case IDN2_UALABEL_MISMATCH:  | 
162  | 0  |       return ERR2STR (IDN2_UALABEL_MISMATCH);  | 
163  | 0  |     case IDN2_INVALID_FLAGS:  | 
164  | 0  |       return ERR2STR (IDN2_INVALID_FLAGS);  | 
165  | 0  |     case IDN2_NOT_NFC:  | 
166  | 0  |       return ERR2STR (IDN2_NOT_NFC);  | 
167  | 0  |     case IDN2_2HYPHEN:  | 
168  | 0  |       return ERR2STR (IDN2_2HYPHEN);  | 
169  | 0  |     case IDN2_HYPHEN_STARTEND:  | 
170  | 0  |       return ERR2STR (IDN2_HYPHEN_STARTEND);  | 
171  | 0  |     case IDN2_LEADING_COMBINING:  | 
172  | 0  |       return ERR2STR (IDN2_LEADING_COMBINING);  | 
173  | 0  |     case IDN2_DISALLOWED:  | 
174  | 0  |       return ERR2STR (IDN2_DISALLOWED);  | 
175  | 0  |     case IDN2_CONTEXTJ:  | 
176  | 0  |       return ERR2STR (IDN2_CONTEXTJ);  | 
177  | 0  |     case IDN2_CONTEXTJ_NO_RULE:  | 
178  | 0  |       return ERR2STR (IDN2_CONTEXTJ_NO_RULE);  | 
179  | 0  |     case IDN2_CONTEXTO:  | 
180  | 0  |       return ERR2STR (IDN2_CONTEXTO);  | 
181  | 0  |     case IDN2_CONTEXTO_NO_RULE:  | 
182  | 0  |       return ERR2STR (IDN2_CONTEXTO_NO_RULE);  | 
183  | 0  |     case IDN2_UNASSIGNED:  | 
184  | 0  |       return ERR2STR (IDN2_UNASSIGNED);  | 
185  | 0  |     case IDN2_BIDI:  | 
186  | 0  |       return ERR2STR (IDN2_BIDI);  | 
187  | 0  |     case IDN2_DOT_IN_LABEL:  | 
188  | 0  |       return ERR2STR (IDN2_DOT_IN_LABEL);  | 
189  | 0  |     case IDN2_INVALID_TRANSITIONAL:  | 
190  | 0  |       return ERR2STR (IDN2_INVALID_TRANSITIONAL);  | 
191  | 0  |     case IDN2_INVALID_NONTRANSITIONAL:  | 
192  | 0  |       return ERR2STR (IDN2_INVALID_NONTRANSITIONAL);  | 
193  | 0  |     case IDN2_ALABEL_ROUNDTRIP_FAILED:  | 
194  | 0  |       return ERR2STR (IDN2_ALABEL_ROUNDTRIP_FAILED);  | 
195  | 0  |     default:  | 
196  | 0  |       return "IDN2_UNKNOWN";  | 
197  | 0  |     }  | 
198  | 0  | }  |