~vcs-imports/gawk/master

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