Blame lib/gettext.h

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