Blame gettext.h

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