Blame src/gl/gettext.h

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