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