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