Blame lib/gettext.h

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