1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Convenience header for conditional use of GNU <libintl.h>. 205436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2012 Free Software 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Foundation, Inc. 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is free software; you can redistribute it and/or modify 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation; either version 3, or (at your option) 8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project any later version. 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is distributed in the hope that it will be useful, 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License along 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang with this program; if not, see <http://www.gnu.org/licenses/>. */ 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef _LIBGETTEXT_H 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define _LIBGETTEXT_H 1 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* NLS can be disabled through the configure --disable-nls option. */ 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if ENABLE_NLS 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Get declarations of GNU message catalog functions. */ 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <libintl.h> 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang the gettext() and ngettext() macros. This is an alternative to calling 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang textdomain(), and is useful for libraries. */ 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# ifdef DEFAULT_TEXT_DOMAIN 3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef gettext 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define gettext(Msgid) \ 3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang dgettext (DEFAULT_TEXT_DOMAIN, Msgid) 3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef ngettext 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define ngettext(Msgid1, Msgid2, N) \ 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project chokes if dcgettext is defined as a macro. So include it now, to make 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project later inclusions of <locale.h> a NOP. We don't include <libintl.h> 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project as well because people using "gettext.h" will not include <libintl.h>, 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project is OK. */ 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined(__sun) 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <locale.h> 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Many header files from the libstdc++ coming with g++ 3.3 or newer include 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project <libintl.h>, which chokes if dcgettext is defined as a macro. So include 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it now, to make later inclusions of <libintl.h> a NOP. */ 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <cstdlib> 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <libintl.h> 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Disabled NLS. 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project The casts to 'const char *' serve the purpose of producing warnings 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for invalid uses of the value returned from these functions. 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project On pre-ANSI systems without 'const', the config.h file is supposed to 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project contain "#define const". */ 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef gettext 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define gettext(Msgid) ((const char *) (Msgid)) 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef dgettext 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef dcgettext 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define dcgettext(Domainname, Msgid, Category) \ 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((void) (Category), dgettext (Domainname, Msgid)) 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef ngettext 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define ngettext(Msgid1, Msgid2, N) \ 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((N) == 1 \ 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang ? ((void) (Msgid2), (const char *) (Msgid1)) \ 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang : ((void) (Msgid1), (const char *) (Msgid2))) 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef dngettext 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define dngettext(Domainname, Msgid1, Msgid2, N) \ 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef dcngettext 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef textdomain 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define textdomain(Domainname) ((const char *) (Domainname)) 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef bindtextdomain 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define bindtextdomain(Domainname, Dirname) \ 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((void) (Domainname), (const char *) (Dirname)) 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef bind_textdomain_codeset 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define bind_textdomain_codeset(Domainname, Codeset) \ 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((void) (Domainname), (const char *) (Codeset)) 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Prefer gnulib's setlocale override over libintl's setlocale override. */ 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef GNULIB_defined_setlocale 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef setlocale 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define setlocale rpl_setlocale 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A pseudo function call that serves as a marker for the automated 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project extraction of messages, but does not call gettext(). The run-time 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project translation is done at a different place in the code. 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project The argument, String, should be a literal string. Concatenated strings 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project and other string expressions won't work. 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project The macro's expansion is not parenthesized, so that it is suitable as 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project initializer for static 'char[]' or 'const char[]' variables. */ 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define gettext_noop(String) String 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The separator between msgctxt and msgid in a .mo file. */ 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define GETTEXT_CONTEXT_GLUE "\004" 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang short and rarely need to change. 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang The letter 'p' stands for 'particular' or 'special'. */ 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef DEFAULT_TEXT_DOMAIN 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define pgettext(Msgctxt, Msgid) \ 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define pgettext(Msgctxt, Msgid) \ 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define dpgettext(Domainname, Msgctxt, Msgid) \ 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef DEFAULT_TEXT_DOMAIN 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __GNUC__ 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang__inline 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wanginline 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wangpgettext_aux (const char *domain, 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *msg_ctxt_id, const char *msgid, 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang int category) 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *translation = dcgettext (domain, msg_ctxt_id, category); 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (translation == msg_ctxt_id) 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return msgid; 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang return translation; 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __GNUC__ 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang__inline 16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wanginline 16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * 16705436638acc7c010349a69c3395f1a57c642dc62Ying Wangnpgettext_aux (const char *domain, 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *msg_ctxt_id, const char *msgid, 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *msgid_plural, unsigned long int n, 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang int category) 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *translation = 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (translation == msg_ctxt_id || translation == msgid_plural) 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (n == 1 ? msgid : msgid_plural); 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return translation; 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID 18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang can be arbitrary expressions. But for string literals these macros are 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang less efficient than those above. */ 18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <string.h> 18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \ 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* || __STDC_VERSION__ >= 199901L */ ) 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1 18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stdlib.h> 19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define pgettext_expr(Msgctxt, Msgid) \ 19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) 19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define dpgettext_expr(Domainname, Msgctxt, Msgid) \ 20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __GNUC__ 20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang__inline 20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus 20605436638acc7c010349a69c3395f1a57c642dc62Ying Wanginline 20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 20905436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wangdcpgettext_expr (const char *domain, 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *msgctxt, const char *msgid, 21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang int category) 21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t msgctxt_len = strlen (msgctxt) + 1; 21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t msgid_len = strlen (msgid) + 1; 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *translation; 21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang char msg_ctxt_id[msgctxt_len + msgid_len]; 21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang char buf[1024]; 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang char *msg_ctxt_id = 22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang (msgctxt_len + msgid_len <= sizeof (buf) 22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang ? buf 22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang : (char *) malloc (msgctxt_len + msgid_len)); 22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (msg_ctxt_id != NULL) 22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang msg_ctxt_id[msgctxt_len - 1] = '\004'; 23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); 23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang translation = dcgettext (domain, msg_ctxt_id, category); 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (msg_ctxt_id != buf) 23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (msg_ctxt_id); 23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (translation != msg_ctxt_id) 23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return translation; 23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return msgid; 24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ 24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) 24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ 24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) 24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __GNUC__ 24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang__inline 24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wanginline 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 25405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic const char * 25505436638acc7c010349a69c3395f1a57c642dc62Ying Wangdcnpgettext_expr (const char *domain, 25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *msgctxt, const char *msgid, 25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *msgid_plural, unsigned long int n, 25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang int category) 25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t msgctxt_len = strlen (msgctxt) + 1; 26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t msgid_len = strlen (msgid) + 1; 26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang const char *translation; 26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang char msg_ctxt_id[msgctxt_len + msgid_len]; 26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang char buf[1024]; 26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang char *msg_ctxt_id = 26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang (msgctxt_len + msgid_len <= sizeof (buf) 26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang ? buf 27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang : (char *) malloc (msgctxt_len + msgid_len)); 27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (msg_ctxt_id != NULL) 27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); 27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang msg_ctxt_id[msgctxt_len - 1] = '\004'; 27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); 27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); 27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (msg_ctxt_id != buf) 28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang free (msg_ctxt_id); 28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!(translation == msg_ctxt_id || translation == msgid_plural)) 28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang return translation; 28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (n == 1 ? msgid : msgid_plural); 28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* _LIBGETTEXT_H */ 289