Blame gettext-tools/libgettextpo/gettext.h

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