gettext.h revision 05436638acc7c010349a69c3395f1a57c642dc62
14a10645c70199c8d8567fbc46312158c419720abChris Lattner/* Convenience header for conditional use of GNU <libintl.h>.
27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell   Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2012 Free Software
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell   Foundation, Inc.
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell
57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell   This program is free software; you can redistribute it and/or modify
67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell   it under the terms of the GNU General Public License as published by
77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell   the Free Software Foundation; either version 3, or (at your option)
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell   any later version.
94a10645c70199c8d8567fbc46312158c419720abChris Lattner
104a10645c70199c8d8567fbc46312158c419720abChris Lattner   This program is distributed in the hope that it will be useful,
114a10645c70199c8d8567fbc46312158c419720abChris Lattner   but WITHOUT ANY WARRANTY; without even the implied warranty of
124a10645c70199c8d8567fbc46312158c419720abChris Lattner   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
134a10645c70199c8d8567fbc46312158c419720abChris Lattner   GNU General Public License for more details.
144a10645c70199c8d8567fbc46312158c419720abChris Lattner
154a10645c70199c8d8567fbc46312158c419720abChris Lattner   You should have received a copy of the GNU General Public License along
16b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman   with this program; if not, see <http://www.gnu.org/licenses/>.  */
17551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer
18551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef _LIBGETTEXT_H
19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define _LIBGETTEXT_H 1
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer
214a10645c70199c8d8567fbc46312158c419720abChris Lattner/* NLS can be disabled through the configure --disable-nls option.  */
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#if ENABLE_NLS
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
244a10645c70199c8d8567fbc46312158c419720abChris Lattner/* Get declarations of GNU message catalog functions.  */
254a10645c70199c8d8567fbc46312158c419720abChris Lattner# include <libintl.h>
264a10645c70199c8d8567fbc46312158c419720abChris Lattner
274a10645c70199c8d8567fbc46312158c419720abChris Lattner/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
284a10645c70199c8d8567fbc46312158c419720abChris Lattner   the gettext() and ngettext() macros.  This is an alternative to calling
29b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke   textdomain(), and is useful for libraries.  */
304a10645c70199c8d8567fbc46312158c419720abChris Lattner# ifdef DEFAULT_TEXT_DOMAIN
314148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman#  undef gettext
324a10645c70199c8d8567fbc46312158c419720abChris Lattner#  define gettext(Msgid) \
334a10645c70199c8d8567fbc46312158c419720abChris Lattner     dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
34b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke#  undef ngettext
35b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman#  define ngettext(Msgid1, Msgid2, N) \
36b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman     dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
375073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman# endif
385073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
395073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#else
404d143ee01988e1b52e106ffccbb313937ca5e886Chris Lattner
41b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
423c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner   chokes if dcgettext is defined as a macro.  So include it now, to make
43c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
44c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke   as well because people using "gettext.h" will not include <libintl.h>,
45eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
46c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke   is OK.  */
47c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#if defined(__sun)
483c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner# include <locale.h>
493c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner#endif
503c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner
517dac658792425c10274594782d6fcf10208a16f0Chris Lattner/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
527dac658792425c10274594782d6fcf10208a16f0Chris Lattner   <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
537dac658792425c10274594782d6fcf10208a16f0Chris Lattner   it now, to make later inclusions of <libintl.h> a NOP.  */
547dac658792425c10274594782d6fcf10208a16f0Chris Lattner#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
557dac658792425c10274594782d6fcf10208a16f0Chris Lattner# include <cstdlib>
567d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
577d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner#  include <libintl.h>
587d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner# endif
597d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner#endif
607d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner
614a10645c70199c8d8567fbc46312158c419720abChris Lattner/* Disabled NLS.
624a10645c70199c8d8567fbc46312158c419720abChris Lattner   The casts to 'const char *' serve the purpose of producing warnings
63d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke   for invalid uses of the value returned from these functions.
64fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner   On pre-ANSI systems without 'const', the config.h file is supposed to
65fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner   contain "#define const".  */
66fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner# undef gettext
67fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner# define gettext(Msgid) ((const char *) (Msgid))
6860083e2fc0f1165b7511757449f1ee3852b7229cChris Lattner# undef dgettext
69636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
70636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# undef dcgettext
71636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# define dcgettext(Domainname, Msgid, Category) \
7260083e2fc0f1165b7511757449f1ee3852b7229cChris Lattner    ((void) (Category), dgettext (Domainname, Msgid))
73fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner# undef ngettext
749d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukman# define ngettext(Msgid1, Msgid2, N) \
754a10645c70199c8d8567fbc46312158c419720abChris Lattner    ((N) == 1 \
764a10645c70199c8d8567fbc46312158c419720abChris Lattner     ? ((void) (Msgid2), (const char *) (Msgid1)) \
774a10645c70199c8d8567fbc46312158c419720abChris Lattner     : ((void) (Msgid1), (const char *) (Msgid2)))
784a10645c70199c8d8567fbc46312158c419720abChris Lattner# undef dngettext
794a10645c70199c8d8567fbc46312158c419720abChris Lattner# define dngettext(Domainname, Msgid1, Msgid2, N) \
804a10645c70199c8d8567fbc46312158c419720abChris Lattner    ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
814a10645c70199c8d8567fbc46312158c419720abChris Lattner# undef dcngettext
824a10645c70199c8d8567fbc46312158c419720abChris Lattner# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
834a10645c70199c8d8567fbc46312158c419720abChris Lattner    ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
844a10645c70199c8d8567fbc46312158c419720abChris Lattner# undef textdomain
854148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman# define textdomain(Domainname) ((const char *) (Domainname))
864148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman# undef bindtextdomain
877bb11547e497d7b8fc87f61c1089eee808e3a1eeChris Lattner# define bindtextdomain(Domainname, Dirname) \
884a10645c70199c8d8567fbc46312158c419720abChris Lattner    ((void) (Domainname), (const char *) (Dirname))
89636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# undef bind_textdomain_codeset
90cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner# define bind_textdomain_codeset(Domainname, Codeset) \
91b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    ((void) (Domainname), (const char *) (Codeset))
92b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
93636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke#endif
94636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke
95b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke/* Prefer gnulib's setlocale override over libintl's setlocale override.  */
96b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke#ifdef GNULIB_defined_setlocale
97636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# undef setlocale
98636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# define setlocale rpl_setlocale
99b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke#endif
100b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
101b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke/* A pseudo function call that serves as a marker for the automated
102636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke   extraction of messages, but does not call gettext().  The run-time
103636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke   translation is done at a different place in the code.
104b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke   The argument, String, should be a literal string.  Concatenated strings
105b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke   and other string expressions won't work.
106b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke   The macro's expansion is not parenthesized, so that it is suitable as
107636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke   initializer for static 'char[]' or 'const char[]' variables.  */
108636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke#define gettext_noop(String) String
109b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
110b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke/* The separator between msgctxt and msgid in a .mo file.  */
111b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke#define GETTEXT_CONTEXT_GLUE "\004"
112b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke
113b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
114b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke   MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
115769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner   short and rarely need to change.
116636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke   The letter 'p' stands for 'particular' or 'special'.  */
117636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke#ifdef DEFAULT_TEXT_DOMAIN
118769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner# define pgettext(Msgctxt, Msgid) \
119769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner   pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
120636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke#else
121636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# define pgettext(Msgctxt, Msgid) \
122769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner   pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
123769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner#endif
124636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke#define dpgettext(Domainname, Msgctxt, Msgid) \
125636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
126769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
127769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
128636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke#ifdef DEFAULT_TEXT_DOMAIN
129636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
130769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner   npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
131cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner#else
1324148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
133cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner   npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
1344a10645c70199c8d8567fbc46312158c419720abChris Lattner#endif
1354148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
1364a10645c70199c8d8567fbc46312158c419720abChris Lattner  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
137a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukman#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
1387bb11547e497d7b8fc87f61c1089eee808e3a1eeChris Lattner  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
139636df3d7ec51a8c6fd759a98853ff709ae54d64eBrian Gaeke
1407bb11547e497d7b8fc87f61c1089eee808e3a1eeChris Lattner#ifdef __GNUC__
1417bb11547e497d7b8fc87f61c1089eee808e3a1eeChris Lattner__inline
142769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner#else
143a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukman#ifdef __cplusplus
144a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukmaninline
1454a10645c70199c8d8567fbc46312158c419720abChris Lattner#endif
1464a10645c70199c8d8567fbc46312158c419720abChris Lattner#endif
1474a10645c70199c8d8567fbc46312158c419720abChris Lattnerstatic const char *
1484a10645c70199c8d8567fbc46312158c419720abChris Lattnerpgettext_aux (const char *domain,
149ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner              const char *msg_ctxt_id, const char *msgid,
150ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner              int category)
151ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner{
152ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner  const char *translation = dcgettext (domain, msg_ctxt_id, category);
153ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner  if (translation == msg_ctxt_id)
154ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner    return msgid;
15597182985d530dbef488696c95a39c14fe56c995bReid Spencer  else
15697182985d530dbef488696c95a39c14fe56c995bReid Spencer    return translation;
15797182985d530dbef488696c95a39c14fe56c995bReid Spencer}
158ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner
159ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner#ifdef __GNUC__
160ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner__inline
161ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner#else
162ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner#ifdef __cplusplus
163ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattnerinline
16497182985d530dbef488696c95a39c14fe56c995bReid Spencer#endif
165ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner#endif
166ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattnerstatic const char *
16797182985d530dbef488696c95a39c14fe56c995bReid Spencernpgettext_aux (const char *domain,
168ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner               const char *msg_ctxt_id, const char *msgid,
169ea9212ca964ff6587227016f86a44160e586a4c8Chris Lattner               const char *msgid_plural, unsigned long int n,
1704a10645c70199c8d8567fbc46312158c419720abChris Lattner               int category)
1714a10645c70199c8d8567fbc46312158c419720abChris Lattner{
1724a10645c70199c8d8567fbc46312158c419720abChris Lattner  const char *translation =
1734a10645c70199c8d8567fbc46312158c419720abChris Lattner    dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
1744a10645c70199c8d8567fbc46312158c419720abChris Lattner  if (translation == msg_ctxt_id || translation == msgid_plural)
1754a10645c70199c8d8567fbc46312158c419720abChris Lattner    return (n == 1 ? msgid : msgid_plural);
1765073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  else
177769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    return translation;
178c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke}
179c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke
180769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner/* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
181769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner   can be arbitrary expressions.  But for string literals these macros are
1824a10645c70199c8d8567fbc46312158c419720abChris Lattner   less efficient than those above.  */
1834a10645c70199c8d8567fbc46312158c419720abChris Lattner
1844a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <string.h>
18597182985d530dbef488696c95a39c14fe56c995bReid Spencer
18697182985d530dbef488696c95a39c14fe56c995bReid Spencer#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
18797182985d530dbef488696c95a39c14fe56c995bReid Spencer     /* || __STDC_VERSION__ >= 199901L */ )
1884a10645c70199c8d8567fbc46312158c419720abChris Lattner# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
1894a10645c70199c8d8567fbc46312158c419720abChris Lattner#else
1904a10645c70199c8d8567fbc46312158c419720abChris Lattner# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
1915073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#endif
1924a10645c70199c8d8567fbc46312158c419720abChris Lattner
1934a10645c70199c8d8567fbc46312158c419720abChris Lattner#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
1944a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <stdlib.h>
1954a10645c70199c8d8567fbc46312158c419720abChris Lattner#endif
1964a10645c70199c8d8567fbc46312158c419720abChris Lattner
1979709272675feaca030cce14d0f5eb7f342b3fc1dChris Lattner#define pgettext_expr(Msgctxt, Msgid) \
1989709272675feaca030cce14d0f5eb7f342b3fc1dChris Lattner  dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
1999709272675feaca030cce14d0f5eb7f342b3fc1dChris Lattner#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
2004a10645c70199c8d8567fbc46312158c419720abChris Lattner  dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
2015073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
2024a10645c70199c8d8567fbc46312158c419720abChris Lattner#ifdef __GNUC__
20397182985d530dbef488696c95a39c14fe56c995bReid Spencer__inline
20497182985d530dbef488696c95a39c14fe56c995bReid Spencer#else
20597182985d530dbef488696c95a39c14fe56c995bReid Spencer#ifdef __cplusplus
2064a10645c70199c8d8567fbc46312158c419720abChris Lattnerinline
207769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner#endif
2087dac658792425c10274594782d6fcf10208a16f0Chris Lattner#endif
209769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattnerstatic const char *
210769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattnerdcpgettext_expr (const char *domain,
211769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner                 const char *msgctxt, const char *msgid,
2124a10645c70199c8d8567fbc46312158c419720abChris Lattner                 int category)
213769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner{
2147d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  size_t msgctxt_len = strlen (msgctxt) + 1;
2157d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  size_t msgid_len = strlen (msgid) + 1;
2167d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  const char *translation;
2177d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
2187d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  char msg_ctxt_id[msgctxt_len + msgid_len];
2197d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner#else
2207d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  char buf[1024];
2217d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  char *msg_ctxt_id =
2227d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner    (msgctxt_len + msgid_len <= sizeof (buf)
2237d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner     ? buf
2247d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner     : (char *) malloc (msgctxt_len + msgid_len));
2257d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner  if (msg_ctxt_id != NULL)
2267d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner#endif
2277d91e49ff7bcc0fd10a54d45a6185bb05adf3d20Chris Lattner    {
228769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
229c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke      msg_ctxt_id[msgctxt_len - 1] = '\004';
230c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
2314a10645c70199c8d8567fbc46312158c419720abChris Lattner      translation = dcgettext (domain, msg_ctxt_id, category);
2324a10645c70199c8d8567fbc46312158c419720abChris Lattner#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
2334a10645c70199c8d8567fbc46312158c419720abChris Lattner      if (msg_ctxt_id != buf)
2344a10645c70199c8d8567fbc46312158c419720abChris Lattner        free (msg_ctxt_id);
2354a10645c70199c8d8567fbc46312158c419720abChris Lattner#endif
236c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke      if (translation != msg_ctxt_id)
237c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke        return translation;
238c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke    }
239c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke  return msgid;
240c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke}
241c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke
242c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
243c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke  dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
244c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
245c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke  dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
246c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke
247c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#ifdef __GNUC__
248c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke__inline
249c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#else
250c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#ifdef __cplusplus
251c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaekeinline
2525073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#endif
253a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner#endif
2545073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukmanstatic const char *
255a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattnerdcnpgettext_expr (const char *domain,
2565073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                  const char *msgctxt, const char *msgid,
2575073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                  const char *msgid_plural, unsigned long int n,
2585073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                  int category)
2595073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman{
2605073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  size_t msgctxt_len = strlen (msgctxt) + 1;
2615073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  size_t msgid_len = strlen (msgid) + 1;
262a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner  const char *translation;
2634148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
2645073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  char msg_ctxt_id[msgctxt_len + msgid_len];
2655073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#else
2665073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  char buf[1024];
2675073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  char *msg_ctxt_id =
2685073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman    (msgctxt_len + msgid_len <= sizeof (buf)
2695073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman     ? buf
270a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner     : (char *) malloc (msgctxt_len + msgid_len));
271769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  if (msg_ctxt_id != NULL)
272a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner#endif
2735073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman    {
2745073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
2755073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman      msg_ctxt_id[msgctxt_len - 1] = '\004';
2765073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
2776ebe44d22f6dd1ab9f7aa1f3cfd02be52145d535Chris Lattner      translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
2785073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
2795073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman      if (msg_ctxt_id != buf)
2805073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman        free (msg_ctxt_id);
2814a10645c70199c8d8567fbc46312158c419720abChris Lattner#endif
2824a10645c70199c8d8567fbc46312158c419720abChris Lattner      if (!(translation == msg_ctxt_id || translation == msgid_plural))
2834a10645c70199c8d8567fbc46312158c419720abChris Lattner        return translation;
2844a10645c70199c8d8567fbc46312158c419720abChris Lattner    }
2855073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  return (n == 1 ? msgid : msgid_plural);
2865073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman}
287640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner
288c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke#endif /* _LIBGETTEXT_H */
289c5cad211d6ec50fe90a0a716dee701c6c4721385Brian Gaeke