Blame lib/gettext.h

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