Blame lib/gettext.h

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