Changeset View
Changeset View
Standalone View
Standalone View
src/gettext.h
1 | /* Convenience header for conditional use of GNU <libintl.h>. | 1 | /* Convenience header for conditional use of GNU <libintl.h>. | ||
---|---|---|---|---|---|
2 | Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. | 2 | Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2017 Free Software | ||
3 | Foundation, Inc. | ||||
3 | 4 | | |||
4 | This program is free software; you can redistribute it and/or modify it | 5 | This program is free software; you can redistribute it and/or modify | ||
5 | under the terms of the GNU Library General Public License as published | 6 | it under the terms of the GNU General Public License as published by | ||
6 | by the Free Software Foundation; either version 2, or (at your option) | 7 | the Free Software Foundation; either version 3, or (at your option) | ||
7 | any later version. | 8 | any later version. | ||
8 | 9 | | |||
9 | This program is distributed in the hope that it will be useful, | 10 | This program is distributed in the hope that it will be useful, | ||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | Library General Public License for more details. | 13 | GNU General Public License for more details. | ||
13 | 14 | | |||
14 | You should have received a copy of the GNU Library General Public | 15 | You should have received a copy of the GNU General Public License along | ||
15 | License along with this program; if not, write to the Free Software | 16 | with this program; if not, see <http://www.gnu.org/licenses/>. */ | ||
16 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | | |||
17 | USA. */ | | |||
18 | 17 | | |||
19 | #ifndef _LIBGETTEXT_H | 18 | #ifndef _LIBGETTEXT_H | ||
20 | #define _LIBGETTEXT_H 1 | 19 | #define _LIBGETTEXT_H 1 | ||
21 | 20 | | |||
21 | /* NLS can be disabled through the configure --disable-nls option | ||||
22 | or through "#define ENABLE NLS 0" before including this file. */ | ||||
23 | #if defined ENABLE_NLS && ENABLE_NLS | ||||
24 | | ||||
22 | /* Get declarations of GNU message catalog functions. */ | 25 | /* Get declarations of GNU message catalog functions. */ | ||
23 | # include <libintl.h> | 26 | # include <libintl.h> | ||
24 | // libintl.h redefines inline which causes MSVC to abort compilation with the message | | |||
25 | // fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords | | |||
26 | #undef inline | | |||
27 | 27 | | |||
28 | /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by | 28 | /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by | ||
29 | the gettext() and ngettext() macros. This is an alternative to calling | 29 | the gettext() and ngettext() macros. This is an alternative to calling | ||
30 | textdomain(), and is useful for libraries. */ | 30 | textdomain(), and is useful for libraries. */ | ||
31 | # ifdef DEFAULT_TEXT_DOMAIN | 31 | # ifdef DEFAULT_TEXT_DOMAIN | ||
32 | # undef gettext | 32 | # undef gettext | ||
33 | # define gettext(Msgid) \ | 33 | # define gettext(Msgid) \ | ||
34 | dgettext (DEFAULT_TEXT_DOMAIN, Msgid) | 34 | dgettext (DEFAULT_TEXT_DOMAIN, Msgid) | ||
35 | # undef ngettext | 35 | # undef ngettext | ||
36 | # define ngettext(Msgid1, Msgid2, N) \ | 36 | # define ngettext(Msgid1, Msgid2, N) \ | ||
37 | dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) | 37 | dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) | ||
38 | # endif | 38 | # endif | ||
39 | 39 | | |||
40 | #else | ||||
41 | | ||||
42 | /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which | ||||
43 | chokes if dcgettext is defined as a macro. So include it now, to make | ||||
44 | later inclusions of <locale.h> a NOP. We don't include <libintl.h> | ||||
45 | as well because people using "gettext.h" will not include <libintl.h>, | ||||
46 | and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> | ||||
47 | is OK. */ | ||||
48 | #if defined(__sun) | ||||
49 | # include <locale.h> | ||||
50 | #endif | ||||
51 | | ||||
52 | /* Many header files from the libstdc++ coming with g++ 3.3 or newer include | ||||
53 | <libintl.h>, which chokes if dcgettext is defined as a macro. So include | ||||
54 | it now, to make later inclusions of <libintl.h> a NOP. */ | ||||
55 | #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) | ||||
56 | # include <cstdlib> | ||||
57 | # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H | ||||
58 | # include <libintl.h> | ||||
59 | # endif | ||||
60 | #endif | ||||
61 | | ||||
62 | /* Disabled NLS. | ||||
63 | The casts to 'const char *' serve the purpose of producing warnings | ||||
64 | for invalid uses of the value returned from these functions. | ||||
65 | On pre-ANSI systems without 'const', the config.h file is supposed to | ||||
66 | contain "#define const". */ | ||||
67 | # undef gettext | ||||
68 | # define gettext(Msgid) ((const char *) (Msgid)) | ||||
69 | # undef dgettext | ||||
70 | # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) | ||||
71 | # undef dcgettext | ||||
72 | # define dcgettext(Domainname, Msgid, Category) \ | ||||
73 | ((void) (Category), dgettext (Domainname, Msgid)) | ||||
74 | # undef ngettext | ||||
75 | # define ngettext(Msgid1, Msgid2, N) \ | ||||
76 | ((N) == 1 \ | ||||
77 | ? ((void) (Msgid2), (const char *) (Msgid1)) \ | ||||
78 | : ((void) (Msgid1), (const char *) (Msgid2))) | ||||
79 | # undef dngettext | ||||
80 | # define dngettext(Domainname, Msgid1, Msgid2, N) \ | ||||
81 | ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) | ||||
82 | # undef dcngettext | ||||
83 | # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ | ||||
84 | ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) | ||||
85 | # undef textdomain | ||||
86 | # define textdomain(Domainname) ((const char *) (Domainname)) | ||||
87 | # undef bindtextdomain | ||||
88 | # define bindtextdomain(Domainname, Dirname) \ | ||||
89 | ((void) (Domainname), (const char *) (Dirname)) | ||||
90 | # undef bind_textdomain_codeset | ||||
91 | # define bind_textdomain_codeset(Domainname, Codeset) \ | ||||
92 | ((void) (Domainname), (const char *) (Codeset)) | ||||
93 | | ||||
94 | #endif | ||||
95 | | ||||
96 | /* Prefer gnulib's setlocale override over libintl's setlocale override. */ | ||||
97 | #ifdef GNULIB_defined_setlocale | ||||
98 | # undef setlocale | ||||
99 | # define setlocale rpl_setlocale | ||||
100 | #endif | ||||
101 | | ||||
102 | /* A pseudo function call that serves as a marker for the automated | ||||
103 | extraction of messages, but does not call gettext(). The run-time | ||||
104 | translation is done at a different place in the code. | ||||
105 | The argument, String, should be a literal string. Concatenated strings | ||||
106 | and other string expressions won't work. | ||||
107 | The macro's expansion is not parenthesized, so that it is suitable as | ||||
108 | initializer for static 'char[]' or 'const char[]' variables. */ | ||||
109 | #define gettext_noop(String) String | ||||
110 | | ||||
40 | /* The separator between msgctxt and msgid in a .mo file. */ | 111 | /* The separator between msgctxt and msgid in a .mo file. */ | ||
41 | #define GETTEXT_CONTEXT_GLUE "\004" | 112 | #define GETTEXT_CONTEXT_GLUE "\004" | ||
42 | 113 | | |||
43 | /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a | 114 | /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a | ||
44 | MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be | 115 | MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be | ||
45 | short and rarely need to change. | 116 | short and rarely need to change. | ||
46 | The letter 'p' stands for 'particular' or 'special'. */ | 117 | The letter 'p' stands for 'particular' or 'special'. */ | ||
47 | #ifdef DEFAULT_TEXT_DOMAIN | 118 | #ifdef DEFAULT_TEXT_DOMAIN | ||
48 | # define pgettext(Msgctxt, Msgid) \ | 119 | # define pgettext(Msgctxt, Msgid) \ | ||
49 | pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid) | 120 | pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) | ||
50 | #else | 121 | #else | ||
51 | # define pgettext(Msgctxt, Msgid) \ | 122 | # define pgettext(Msgctxt, Msgid) \ | ||
52 | pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid) | 123 | pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) | ||
53 | #endif | 124 | #endif | ||
54 | #define dpgettext(Domainname, Msgctxt, Msgid) \ | 125 | #define dpgettext(Domainname, Msgctxt, Msgid) \ | ||
55 | pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid) | 126 | pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) | ||
127 | #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ | ||||
128 | pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) | ||||
129 | #ifdef DEFAULT_TEXT_DOMAIN | ||||
130 | # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ | ||||
131 | npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) | ||||
132 | #else | ||||
133 | # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ | ||||
134 | npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) | ||||
135 | #endif | ||||
136 | #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ | ||||
137 | npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) | ||||
138 | #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ | ||||
139 | npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) | ||||
56 | 140 | | |||
57 | #ifdef __GNUC__ | 141 | #ifdef __GNUC__ | ||
58 | __inline | 142 | __inline | ||
59 | #else | 143 | #else | ||
60 | #ifdef __cplusplus | 144 | #ifdef __cplusplus | ||
61 | inline | 145 | inline | ||
62 | #endif | 146 | #endif | ||
63 | #endif | 147 | #endif | ||
64 | static const char * | 148 | static const char * | ||
65 | pgettext_aux(const char *domain, | 149 | pgettext_aux (const char *domain, | ||
66 | const char *msg_ctxt_id, const char *msgid) | 150 | const char *msg_ctxt_id, const char *msgid, | ||
151 | int category) | ||||
67 | { | 152 | { | ||
68 | const char *translation = dgettext(domain, msg_ctxt_id); | 153 | const char *translation = dcgettext (domain, msg_ctxt_id, category); | ||
69 | if (translation == msg_ctxt_id) { | 154 | if (translation == msg_ctxt_id) | ||
70 | return msgid; | 155 | return msgid; | ||
71 | } else { | 156 | else | ||
72 | return translation; | 157 | return translation; | ||
73 | } | 158 | } | ||
159 | | ||||
160 | #ifdef __GNUC__ | ||||
161 | __inline | ||||
162 | #else | ||||
163 | #ifdef __cplusplus | ||||
164 | inline | ||||
165 | #endif | ||||
166 | #endif | ||||
167 | static const char * | ||||
168 | npgettext_aux (const char *domain, | ||||
169 | const char *msg_ctxt_id, const char *msgid, | ||||
170 | const char *msgid_plural, unsigned long int n, | ||||
171 | int category) | ||||
172 | { | ||||
173 | const char *translation = | ||||
174 | dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); | ||||
175 | if (translation == msg_ctxt_id || translation == msgid_plural) | ||||
176 | return (n == 1 ? msgid : msgid_plural); | ||||
177 | else | ||||
178 | return translation; | ||||
74 | } | 179 | } | ||
75 | 180 | | |||
76 | /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID | 181 | /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID | ||
77 | can be arbitrary expressions. But for string literals these macros are | 182 | can be arbitrary expressions. But for string literals these macros are | ||
78 | less efficient than those above. */ | 183 | less efficient than those above. */ | ||
79 | 184 | | |||
80 | #include <string.h> | 185 | #include <string.h> | ||
81 | 186 | | |||
82 | #ifndef __STRICT_ANSI__ | 187 | #if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \ | ||
83 | #define __STRICT_ANSI__ | 188 | /* || __STDC_VERSION__ == 199901L | ||
84 | #define __STRICT_ANSI_FORCED__ | 189 | || (__STDC_VERSION__ >= 201112L && !defined __STDC_NO_VLA__) */ ) | ||
190 | # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1 | ||||
191 | #else | ||||
192 | # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0 | ||||
85 | #endif | 193 | #endif | ||
86 | 194 | | |||
87 | #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ | | |||
88 | (__STRICT_ANSI__ - 0 == 0) && (__GNUC__ >= 3 || __GNUG__ >= 2 /* || __STDC_VERSION__ >= 199901L */ ) | | |||
89 | | ||||
90 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 195 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | ||
91 | #include <stdlib.h> | 196 | #include <stdlib.h> | ||
92 | #endif | 197 | #endif | ||
93 | 198 | | |||
94 | #define pgettext_expr(Msgctxt, Msgid) \ | 199 | #define pgettext_expr(Msgctxt, Msgid) \ | ||
95 | dpgettext_expr (NULL, Msgctxt, Msgid) | 200 | dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) | ||
96 | #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ | 201 | #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ | ||
97 | dpgettext_expr (Domainname, Msgctxt, Msgid) | 202 | dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) | ||
98 | 203 | | |||
99 | #ifdef __GNUC__ | 204 | #ifdef __GNUC__ | ||
100 | __inline | 205 | __inline | ||
101 | #else | 206 | #else | ||
102 | #ifdef __cplusplus | 207 | #ifdef __cplusplus | ||
103 | inline | 208 | inline | ||
104 | #endif | 209 | #endif | ||
105 | #endif | 210 | #endif | ||
106 | static const char * | 211 | static const char * | ||
107 | dpgettext_expr(const char *domain, | 212 | dcpgettext_expr (const char *domain, | ||
108 | const char *msgctxt, const char *msgid) | 213 | const char *msgctxt, const char *msgid, | ||
214 | int category) | ||||
109 | { | 215 | { | ||
110 | size_t msgctxt_len = strlen(msgctxt) + 1; | 216 | size_t msgctxt_len = strlen (msgctxt) + 1; | ||
111 | size_t msgid_len = strlen(msgid) + 1; | 217 | size_t msgid_len = strlen (msgid) + 1; | ||
112 | const char *translation; | 218 | const char *translation; | ||
113 | int translation_found; | | |||
114 | #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 219 | #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | ||
115 | char msg_ctxt_id[msgctxt_len + msgid_len]; | 220 | char msg_ctxt_id[msgctxt_len + msgid_len]; | ||
116 | #else | 221 | #else | ||
117 | char buf[1024]; | 222 | char buf[1024]; | ||
118 | char *msg_ctxt_id = | 223 | char *msg_ctxt_id = | ||
119 | (msgctxt_len + msgid_len <= sizeof(buf) | 224 | (msgctxt_len + msgid_len <= sizeof (buf) | ||
120 | ? buf | 225 | ? buf | ||
121 | : (char *) malloc(msgctxt_len + msgid_len)); | 226 | : (char *) malloc (msgctxt_len + msgid_len)); | ||
122 | if (msg_ctxt_id != nullptr) | 227 | if (msg_ctxt_id != NULL) | ||
123 | #endif | 228 | #endif | ||
124 | { | 229 | { | ||
230 | int found_translation; | ||||
125 | memcpy(msg_ctxt_id, msgctxt, msgctxt_len - 1); | 231 | memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); | ||
126 | msg_ctxt_id[msgctxt_len - 1] = '\004'; | 232 | msg_ctxt_id[msgctxt_len - 1] = '\004'; | ||
127 | memcpy(msg_ctxt_id + msgctxt_len, msgid, msgid_len); | 233 | memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); | ||
128 | translation = dgettext(domain, msg_ctxt_id); | 234 | translation = dcgettext (domain, msg_ctxt_id, category); | ||
129 | /* Test must occur before msg_ctxt_id freed */ | 235 | found_translation = (translation != msg_ctxt_id); | ||
130 | translation_found = translation != msg_ctxt_id; | | |||
131 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 236 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | ||
132 | if (msg_ctxt_id != buf) { | 237 | if (msg_ctxt_id != buf) | ||
133 | free(msg_ctxt_id); | 238 | free (msg_ctxt_id); | ||
134 | } | | |||
135 | #endif | 239 | #endif | ||
136 | if (translation_found) { | 240 | if (found_translation) | ||
137 | return translation; | 241 | return translation; | ||
138 | } | 242 | } | ||
139 | } | | |||
140 | return msgid; | 243 | return msgid; | ||
141 | } | 244 | } | ||
142 | 245 | | |||
143 | #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ | 246 | #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ | ||
144 | dnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N) | 247 | dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) | ||
145 | #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ | 248 | #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ | ||
146 | dnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N) | 249 | dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) | ||
147 | 250 | | |||
148 | #ifdef __GNUC__ | 251 | #ifdef __GNUC__ | ||
149 | __inline | 252 | __inline | ||
150 | #else | 253 | #else | ||
151 | #ifdef __cplusplus | 254 | #ifdef __cplusplus | ||
152 | inline | 255 | inline | ||
153 | #endif | 256 | #endif | ||
154 | #endif | 257 | #endif | ||
155 | static const char * | 258 | static const char * | ||
156 | dnpgettext_expr(const char *domain, | 259 | dcnpgettext_expr (const char *domain, | ||
157 | const char *msgctxt, const char *msgid, | 260 | const char *msgctxt, const char *msgid, | ||
158 | const char *msgid_plural, unsigned long int n) | 261 | const char *msgid_plural, unsigned long int n, | ||
262 | int category) | ||||
159 | { | 263 | { | ||
160 | size_t msgctxt_len = strlen(msgctxt) + 1; | 264 | size_t msgctxt_len = strlen (msgctxt) + 1; | ||
161 | size_t msgid_len = strlen(msgid) + 1; | 265 | size_t msgid_len = strlen (msgid) + 1; | ||
162 | const char *translation; | 266 | const char *translation; | ||
163 | int translation_found; | | |||
164 | #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 267 | #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | ||
165 | char msg_ctxt_id[msgctxt_len + msgid_len]; | 268 | char msg_ctxt_id[msgctxt_len + msgid_len]; | ||
166 | #else | 269 | #else | ||
167 | char buf[1024]; | 270 | char buf[1024]; | ||
168 | char *msg_ctxt_id = | 271 | char *msg_ctxt_id = | ||
169 | (msgctxt_len + msgid_len <= sizeof(buf) | 272 | (msgctxt_len + msgid_len <= sizeof (buf) | ||
170 | ? buf | 273 | ? buf | ||
171 | : (char *) malloc(msgctxt_len + msgid_len)); | 274 | : (char *) malloc (msgctxt_len + msgid_len)); | ||
172 | if (msg_ctxt_id != nullptr) | 275 | if (msg_ctxt_id != NULL) | ||
173 | #endif | 276 | #endif | ||
174 | { | 277 | { | ||
278 | int found_translation; | ||||
175 | memcpy(msg_ctxt_id, msgctxt, msgctxt_len - 1); | 279 | memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); | ||
176 | msg_ctxt_id[msgctxt_len - 1] = '\004'; | 280 | msg_ctxt_id[msgctxt_len - 1] = '\004'; | ||
177 | memcpy(msg_ctxt_id + msgctxt_len, msgid, msgid_len); | 281 | memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); | ||
178 | translation = dngettext(domain, msg_ctxt_id, msgid_plural, n); | 282 | translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); | ||
179 | /* Test must occur before msg_ctxt_id freed */ | 283 | found_translation = !(translation == msg_ctxt_id || translation == msgid_plural); | ||
180 | translation_found = !(translation == msg_ctxt_id || translation == msgid_plural); | | |||
181 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | 284 | #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS | ||
182 | if (msg_ctxt_id != buf) { | 285 | if (msg_ctxt_id != buf) | ||
183 | free(msg_ctxt_id); | 286 | free (msg_ctxt_id); | ||
184 | } | | |||
185 | #endif | 287 | #endif | ||
186 | if (translation_found) { | 288 | if (found_translation) | ||
187 | return translation; | 289 | return translation; | ||
188 | } | 290 | } | ||
189 | } | | |||
190 | return (n == 1 ? msgid : msgid_plural); | 291 | return (n == 1 ? msgid : msgid_plural); | ||
191 | } | 292 | } | ||
192 | 293 | | |||
193 | #ifdef __STRICT_ANSI_FORCED__ | | |||
194 | #undef __STRICT_ANSI__ | | |||
195 | #undef __STRICT_ANSI_FORCED__ | | |||
196 | #endif | | |||
197 | | ||||
198 | #endif /* _LIBGETTEXT_H */ | 294 | #endif /* _LIBGETTEXT_H */ |