Blame gnulib/lib/gettext.h

Packit Service 51e54d
/* Convenience header for conditional use of GNU <libintl.h>.
Packit Service 51e54d
   Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2014 Free Software
Packit Service 51e54d
   Foundation, Inc.
Packit Service 51e54d
Packit Service 51e54d
   This program is free software; you can redistribute it and/or modify
Packit Service 51e54d
   it under the terms of the GNU General Public License as published by
Packit Service 51e54d
   the Free Software Foundation; either version 3, or (at your option)
Packit Service 51e54d
   any later version.
Packit Service 51e54d
Packit Service 51e54d
   This program is distributed in the hope that it will be useful,
Packit Service 51e54d
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 51e54d
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 51e54d
   GNU General Public License for more details.
Packit Service 51e54d
Packit Service 51e54d
   You should have received a copy of the GNU General Public License along
Packit Service 51e54d
   with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit Service 51e54d
Packit Service 51e54d
#ifndef _LIBGETTEXT_H
Packit Service 51e54d
#define _LIBGETTEXT_H 1
Packit Service 51e54d
Packit Service 51e54d
/* NLS can be disabled through the configure --disable-nls option.  */
Packit Service 51e54d
#if ENABLE_NLS
Packit Service 51e54d
Packit Service 51e54d
/* Get declarations of GNU message catalog functions.  */
Packit Service 51e54d
# include <libintl.h>
Packit Service 51e54d
Packit Service 51e54d
/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
Packit Service 51e54d
   the gettext() and ngettext() macros.  This is an alternative to calling
Packit Service 51e54d
   textdomain(), and is useful for libraries.  */
Packit Service 51e54d
# ifdef DEFAULT_TEXT_DOMAIN
Packit Service 51e54d
#  undef gettext
Packit Service 51e54d
#  define gettext(Msgid) \
Packit Service 51e54d
     dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
Packit Service 51e54d
#  undef ngettext
Packit Service 51e54d
#  define ngettext(Msgid1, Msgid2, N) \
Packit Service 51e54d
     dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
Packit Service 51e54d
# endif
Packit Service 51e54d
Packit Service 51e54d
#else
Packit Service 51e54d
Packit Service 51e54d
/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
Packit Service 51e54d
   chokes if dcgettext is defined as a macro.  So include it now, to make
Packit Service 51e54d
   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
Packit Service 51e54d
   as well because people using "gettext.h" will not include <libintl.h>,
Packit Service 51e54d
   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
Packit Service 51e54d
   is OK.  */
Packit Service 51e54d
#if defined(__sun)
Packit Service 51e54d
# include <locale.h>
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
Packit Service 51e54d
   <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
Packit Service 51e54d
   it now, to make later inclusions of <libintl.h> a NOP.  */
Packit Service 51e54d
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
Packit Service 51e54d
# include <cstdlib>
Packit Service 51e54d
# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
Packit Service 51e54d
#  include <libintl.h>
Packit Service 51e54d
# endif
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
/* Disabled NLS.
Packit Service 51e54d
   The casts to 'const char *' serve the purpose of producing warnings
Packit Service 51e54d
   for invalid uses of the value returned from these functions.
Packit Service 51e54d
   On pre-ANSI systems without 'const', the config.h file is supposed to
Packit Service 51e54d
   contain "#define const".  */
Packit Service 51e54d
# undef gettext
Packit Service 51e54d
# define gettext(Msgid) ((const char *) (Msgid))
Packit Service 51e54d
# undef dgettext
Packit Service 51e54d
# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
Packit Service 51e54d
# undef dcgettext
Packit Service 51e54d
# define dcgettext(Domainname, Msgid, Category) \
Packit Service 51e54d
    ((void) (Category), dgettext (Domainname, Msgid))
Packit Service 51e54d
# undef ngettext
Packit Service 51e54d
# define ngettext(Msgid1, Msgid2, N) \
Packit Service 51e54d
    ((N) == 1 \
Packit Service 51e54d
     ? ((void) (Msgid2), (const char *) (Msgid1)) \
Packit Service 51e54d
     : ((void) (Msgid1), (const char *) (Msgid2)))
Packit Service 51e54d
# undef dngettext
Packit Service 51e54d
# define dngettext(Domainname, Msgid1, Msgid2, N) \
Packit Service 51e54d
    ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
Packit Service 51e54d
# undef dcngettext
Packit Service 51e54d
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
Packit Service 51e54d
    ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
Packit Service 51e54d
# undef textdomain
Packit Service 51e54d
# define textdomain(Domainname) ((const char *) (Domainname))
Packit Service 51e54d
# undef bindtextdomain
Packit Service 51e54d
# define bindtextdomain(Domainname, Dirname) \
Packit Service 51e54d
    ((void) (Domainname), (const char *) (Dirname))
Packit Service 51e54d
# undef bind_textdomain_codeset
Packit Service 51e54d
# define bind_textdomain_codeset(Domainname, Codeset) \
Packit Service 51e54d
    ((void) (Domainname), (const char *) (Codeset))
Packit Service 51e54d
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
/* Prefer gnulib's setlocale override over libintl's setlocale override.  */
Packit Service 51e54d
#ifdef GNULIB_defined_setlocale
Packit Service 51e54d
# undef setlocale
Packit Service 51e54d
# define setlocale rpl_setlocale
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
/* A pseudo function call that serves as a marker for the automated
Packit Service 51e54d
   extraction of messages, but does not call gettext().  The run-time
Packit Service 51e54d
   translation is done at a different place in the code.
Packit Service 51e54d
   The argument, String, should be a literal string.  Concatenated strings
Packit Service 51e54d
   and other string expressions won't work.
Packit Service 51e54d
   The macro's expansion is not parenthesized, so that it is suitable as
Packit Service 51e54d
   initializer for static 'char[]' or 'const char[]' variables.  */
Packit Service 51e54d
#define gettext_noop(String) String
Packit Service 51e54d
Packit Service 51e54d
/* The separator between msgctxt and msgid in a .mo file.  */
Packit Service 51e54d
#define GETTEXT_CONTEXT_GLUE "\004"
Packit Service 51e54d
Packit Service 51e54d
/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
Packit Service 51e54d
   MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
Packit Service 51e54d
   short and rarely need to change.
Packit Service 51e54d
   The letter 'p' stands for 'particular' or 'special'.  */
Packit Service 51e54d
#ifdef DEFAULT_TEXT_DOMAIN
Packit Service 51e54d
# define pgettext(Msgctxt, Msgid) \
Packit Service 51e54d
   pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
Packit Service 51e54d
#else
Packit Service 51e54d
# define pgettext(Msgctxt, Msgid) \
Packit Service 51e54d
   pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
Packit Service 51e54d
#endif
Packit Service 51e54d
#define dpgettext(Domainname, Msgctxt, Msgid) \
Packit Service 51e54d
  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
Packit Service 51e54d
#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
Packit Service 51e54d
  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
Packit Service 51e54d
#ifdef DEFAULT_TEXT_DOMAIN
Packit Service 51e54d
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
Packit Service 51e54d
   npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
Packit Service 51e54d
#else
Packit Service 51e54d
# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
Packit Service 51e54d
   npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
Packit Service 51e54d
#endif
Packit Service 51e54d
#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
Packit Service 51e54d
  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
Packit Service 51e54d
#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
Packit Service 51e54d
  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
Packit Service 51e54d
Packit Service 51e54d
#ifdef __GNUC__
Packit Service 51e54d
__inline
Packit Service 51e54d
#else
Packit Service 51e54d
#ifdef __cplusplus
Packit Service 51e54d
inline
Packit Service 51e54d
#endif
Packit Service 51e54d
#endif
Packit Service 51e54d
static const char *
Packit Service 51e54d
pgettext_aux (const char *domain,
Packit Service 51e54d
              const char *msg_ctxt_id, const char *msgid,
Packit Service 51e54d
              int category)
Packit Service 51e54d
{
Packit Service 51e54d
  const char *translation = dcgettext (domain, msg_ctxt_id, category);
Packit Service 51e54d
  if (translation == msg_ctxt_id)
Packit Service 51e54d
    return msgid;
Packit Service 51e54d
  else
Packit Service 51e54d
    return translation;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
#ifdef __GNUC__
Packit Service 51e54d
__inline
Packit Service 51e54d
#else
Packit Service 51e54d
#ifdef __cplusplus
Packit Service 51e54d
inline
Packit Service 51e54d
#endif
Packit Service 51e54d
#endif
Packit Service 51e54d
static const char *
Packit Service 51e54d
npgettext_aux (const char *domain,
Packit Service 51e54d
               const char *msg_ctxt_id, const char *msgid,
Packit Service 51e54d
               const char *msgid_plural, unsigned long int n,
Packit Service 51e54d
               int category)
Packit Service 51e54d
{
Packit Service 51e54d
  const char *translation =
Packit Service 51e54d
    dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
Packit Service 51e54d
  if (translation == msg_ctxt_id || translation == msgid_plural)
Packit Service 51e54d
    return (n == 1 ? msgid : msgid_plural);
Packit Service 51e54d
  else
Packit Service 51e54d
    return translation;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
/* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
Packit Service 51e54d
   can be arbitrary expressions.  But for string literals these macros are
Packit Service 51e54d
   less efficient than those above.  */
Packit Service 51e54d
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
Packit Service 51e54d
#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
Packit Service 51e54d
     /* || __STDC_VERSION__ >= 199901L */ )
Packit Service 51e54d
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
Packit Service 51e54d
#else
Packit Service 51e54d
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
Packit Service 51e54d
#include <stdlib.h>
Packit Service 51e54d
#endif
Packit Service 51e54d
Packit Service 51e54d
#define pgettext_expr(Msgctxt, Msgid) \
Packit Service 51e54d
  dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
Packit Service 51e54d
#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
Packit Service 51e54d
  dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
Packit Service 51e54d
Packit Service 51e54d
#ifdef __GNUC__
Packit Service 51e54d
__inline
Packit Service 51e54d
#else
Packit Service 51e54d
#ifdef __cplusplus
Packit Service 51e54d
inline
Packit Service 51e54d
#endif
Packit Service 51e54d
#endif
Packit Service 51e54d
static const char *
Packit Service 51e54d
dcpgettext_expr (const char *domain,
Packit Service 51e54d
                 const char *msgctxt, const char *msgid,
Packit Service 51e54d
                 int category)
Packit Service 51e54d
{
Packit Service 51e54d
  size_t msgctxt_len = strlen (msgctxt) + 1;
Packit Service 51e54d
  size_t msgid_len = strlen (msgid) + 1;
Packit Service 51e54d
  const char *translation;
Packit Service 51e54d
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
Packit Service 51e54d
  char msg_ctxt_id[msgctxt_len + msgid_len];
Packit Service 51e54d
#else
Packit Service 51e54d
  char buf[1024];
Packit Service 51e54d
  char *msg_ctxt_id =
Packit Service 51e54d
    (msgctxt_len + msgid_len <= sizeof (buf)
Packit Service 51e54d
     ? buf
Packit Service 51e54d
     : (char *) malloc (msgctxt_len + msgid_len));
Packit Service 51e54d
  if (msg_ctxt_id != NULL)
Packit Service 51e54d
#endif
Packit Service 51e54d
    {
Packit Service 51e54d
      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
Packit Service 51e54d
      msg_ctxt_id[msgctxt_len - 1] = '\004';
Packit Service 51e54d
      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
Packit Service 51e54d
      translation = dcgettext (domain, msg_ctxt_id, category);
Packit Service 51e54d
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
Packit Service 51e54d
      if (msg_ctxt_id != buf)
Packit Service 51e54d
        free (msg_ctxt_id);
Packit Service 51e54d
#endif
Packit Service 51e54d
      if (translation != msg_ctxt_id)
Packit Service 51e54d
        return translation;
Packit Service 51e54d
    }
Packit Service 51e54d
  return msgid;
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
Packit Service 51e54d
  dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
Packit Service 51e54d
#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
Packit Service 51e54d
  dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
Packit Service 51e54d
Packit Service 51e54d
#ifdef __GNUC__
Packit Service 51e54d
__inline
Packit Service 51e54d
#else
Packit Service 51e54d
#ifdef __cplusplus
Packit Service 51e54d
inline
Packit Service 51e54d
#endif
Packit Service 51e54d
#endif
Packit Service 51e54d
static const char *
Packit Service 51e54d
dcnpgettext_expr (const char *domain,
Packit Service 51e54d
                  const char *msgctxt, const char *msgid,
Packit Service 51e54d
                  const char *msgid_plural, unsigned long int n,
Packit Service 51e54d
                  int category)
Packit Service 51e54d
{
Packit Service 51e54d
  size_t msgctxt_len = strlen (msgctxt) + 1;
Packit Service 51e54d
  size_t msgid_len = strlen (msgid) + 1;
Packit Service 51e54d
  const char *translation;
Packit Service 51e54d
#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
Packit Service 51e54d
  char msg_ctxt_id[msgctxt_len + msgid_len];
Packit Service 51e54d
#else
Packit Service 51e54d
  char buf[1024];
Packit Service 51e54d
  char *msg_ctxt_id =
Packit Service 51e54d
    (msgctxt_len + msgid_len <= sizeof (buf)
Packit Service 51e54d
     ? buf
Packit Service 51e54d
     : (char *) malloc (msgctxt_len + msgid_len));
Packit Service 51e54d
  if (msg_ctxt_id != NULL)
Packit Service 51e54d
#endif
Packit Service 51e54d
    {
Packit Service 51e54d
      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
Packit Service 51e54d
      msg_ctxt_id[msgctxt_len - 1] = '\004';
Packit Service 51e54d
      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
Packit Service 51e54d
      translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
Packit Service 51e54d
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
Packit Service 51e54d
      if (msg_ctxt_id != buf)
Packit Service 51e54d
        free (msg_ctxt_id);
Packit Service 51e54d
#endif
Packit Service 51e54d
      if (!(translation == msg_ctxt_id || translation == msgid_plural))
Packit Service 51e54d
        return translation;
Packit Service 51e54d
    }
Packit Service 51e54d
  return (n == 1 ? msgid : msgid_plural);
Packit Service 51e54d
}
Packit Service 51e54d
Packit Service 51e54d
#endif /* _LIBGETTEXT_H */