Blame gl/gettext.h

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