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