Blame gettext-runtime/gnulib-lib/gettext.h

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