Blame src/gettext.h

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