"Fossies" - the Fresh Open Source Software Archive

Member "msmtp-1.8.5/src/gettext.h" (12 Dec 2018, 10164 Bytes) of package /linux/privat/msmtp-1.8.5.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "gettext.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.8.1_vs_1.8.2.

    1 /* Convenience header for conditional use of GNU <libintl.h>.
    2    Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2016 Free Software
    3    Foundation, Inc.
    4 
    5    This program is free software: you can redistribute it and/or modify
    6    it under the terms of the GNU General Public License as published by
    7    the Free Software Foundation; either version 3 of the License, or
    8    (at your option) any later version.
    9 
   10    This program is distributed in the hope that it will be useful,
   11    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13    GNU General Public License for more details.
   14 
   15    You should have received a copy of the GNU General Public License
   16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   17 
   18 #ifndef _LIBGETTEXT_H
   19 #define _LIBGETTEXT_H 1
   20 
   21 /* NLS can be disabled through the configure --disable-nls option.  */
   22 #if ENABLE_NLS
   23 
   24 /* Get declarations of GNU message catalog functions.  */
   25 # include <libintl.h>
   26 
   27 /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
   28    the gettext() and ngettext() macros.  This is an alternative to calling
   29    textdomain(), and is useful for libraries.  */
   30 # ifdef DEFAULT_TEXT_DOMAIN
   31 #  undef gettext
   32 #  define gettext(Msgid) \
   33      dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
   34 #  undef ngettext
   35 #  define ngettext(Msgid1, Msgid2, N) \
   36      dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
   37 # endif
   38 
   39 #else
   40 
   41 /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
   42    chokes if dcgettext is defined as a macro.  So include it now, to make
   43    later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
   44    as well because people using "gettext.h" will not include <libintl.h>,
   45    and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
   46    is OK.  */
   47 #if defined(__sun)
   48 # include <locale.h>
   49 #endif
   50 
   51 /* Many header files from the libstdc++ coming with g++ 3.3 or newer include
   52    <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
   53    it now, to make later inclusions of <libintl.h> a NOP.  */
   54 #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
   55 # include <cstdlib>
   56 # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
   57 #  include <libintl.h>
   58 # endif
   59 #endif
   60 
   61 /* Disabled NLS.
   62    The casts to 'const char *' serve the purpose of producing warnings
   63    for invalid uses of the value returned from these functions.
   64    On pre-ANSI systems without 'const', the config.h file is supposed to
   65    contain "#define const".  */
   66 # undef gettext
   67 # define gettext(Msgid) ((const char *) (Msgid))
   68 # undef dgettext
   69 # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
   70 # undef dcgettext
   71 # define dcgettext(Domainname, Msgid, Category) \
   72     ((void) (Category), dgettext (Domainname, Msgid))
   73 # undef ngettext
   74 # define ngettext(Msgid1, Msgid2, N) \
   75     ((N) == 1 \
   76      ? ((void) (Msgid2), (const char *) (Msgid1)) \
   77      : ((void) (Msgid1), (const char *) (Msgid2)))
   78 # undef dngettext
   79 # define dngettext(Domainname, Msgid1, Msgid2, N) \
   80     ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
   81 # undef dcngettext
   82 # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
   83     ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
   84 # undef textdomain
   85 # define textdomain(Domainname) ((const char *) (Domainname))
   86 # undef bindtextdomain
   87 # define bindtextdomain(Domainname, Dirname) \
   88     ((void) (Domainname), (const char *) (Dirname))
   89 # undef bind_textdomain_codeset
   90 # define bind_textdomain_codeset(Domainname, Codeset) \
   91     ((void) (Domainname), (const char *) (Codeset))
   92 
   93 #endif
   94 
   95 /* Prefer gnulib's setlocale override over libintl's setlocale override.  */
   96 #ifdef GNULIB_defined_setlocale
   97 # undef setlocale
   98 # define setlocale rpl_setlocale
   99 #endif
  100 
  101 /* A pseudo function call that serves as a marker for the automated
  102    extraction of messages, but does not call gettext().  The run-time
  103    translation is done at a different place in the code.
  104    The argument, String, should be a literal string.  Concatenated strings
  105    and other string expressions won't work.
  106    The macro's expansion is not parenthesized, so that it is suitable as
  107    initializer for static 'char[]' or 'const char[]' variables.  */
  108 #define gettext_noop(String) String
  109 
  110 /* The separator between msgctxt and msgid in a .mo file.  */
  111 #define GETTEXT_CONTEXT_GLUE "\004"
  112 
  113 /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
  114    MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
  115    short and rarely need to change.
  116    The letter 'p' stands for 'particular' or 'special'.  */
  117 #ifdef DEFAULT_TEXT_DOMAIN
  118 # define pgettext(Msgctxt, Msgid) \
  119    pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
  120 #else
  121 # define pgettext(Msgctxt, Msgid) \
  122    pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
  123 #endif
  124 #define dpgettext(Domainname, Msgctxt, Msgid) \
  125   pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
  126 #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
  127   pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
  128 #ifdef DEFAULT_TEXT_DOMAIN
  129 # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
  130    npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
  131 #else
  132 # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
  133    npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
  134 #endif
  135 #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
  136   npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
  137 #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
  138   npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
  139 
  140 #ifdef __GNUC__
  141 __inline
  142 #else
  143 #ifdef __cplusplus
  144 inline
  145 #endif
  146 #endif
  147 static const char *
  148 pgettext_aux (const char *domain,
  149               const char *msg_ctxt_id, const char *msgid,
  150               int category)
  151 {
  152   const char *translation = dcgettext (domain, msg_ctxt_id, category);
  153   if (translation == msg_ctxt_id)
  154     return msgid;
  155   else
  156     return translation;
  157 }
  158 
  159 #ifdef __GNUC__
  160 __inline
  161 #else
  162 #ifdef __cplusplus
  163 inline
  164 #endif
  165 #endif
  166 static const char *
  167 npgettext_aux (const char *domain,
  168                const char *msg_ctxt_id, const char *msgid,
  169                const char *msgid_plural, unsigned long int n,
  170                int category)
  171 {
  172   const char *translation =
  173     dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
  174   if (translation == msg_ctxt_id || translation == msgid_plural)
  175     return (n == 1 ? msgid : msgid_plural);
  176   else
  177     return translation;
  178 }
  179 
  180 /* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
  181    can be arbitrary expressions.  But for string literals these macros are
  182    less efficient than those above.  */
  183 
  184 #include <string.h>
  185 
  186 #if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
  187      /* || __STDC_VERSION__ >= 199901L */ )
  188 # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
  189 #else
  190 # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
  191 #endif
  192 
  193 #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  194 #include <stdlib.h>
  195 #endif
  196 
  197 #define pgettext_expr(Msgctxt, Msgid) \
  198   dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
  199 #define dpgettext_expr(Domainname, Msgctxt, Msgid) \
  200   dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
  201 
  202 #ifdef __GNUC__
  203 __inline
  204 #else
  205 #ifdef __cplusplus
  206 inline
  207 #endif
  208 #endif
  209 static const char *
  210 dcpgettext_expr (const char *domain,
  211                  const char *msgctxt, const char *msgid,
  212                  int category)
  213 {
  214   size_t msgctxt_len = strlen (msgctxt) + 1;
  215   size_t msgid_len = strlen (msgid) + 1;
  216   const char *translation;
  217 #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  218   char msg_ctxt_id[msgctxt_len + msgid_len];
  219 #else
  220   char buf[1024];
  221   char *msg_ctxt_id =
  222     (msgctxt_len + msgid_len <= sizeof (buf)
  223      ? buf
  224      : (char *) malloc (msgctxt_len + msgid_len));
  225   if (msg_ctxt_id != NULL)
  226 #endif
  227     {
  228       int found_translation;
  229       memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
  230       msg_ctxt_id[msgctxt_len - 1] = '\004';
  231       memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
  232       translation = dcgettext (domain, msg_ctxt_id, category);
  233       found_translation = (translation != msg_ctxt_id);
  234 #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  235       if (msg_ctxt_id != buf)
  236         free (msg_ctxt_id);
  237 #endif
  238       if (found_translation)
  239         return translation;
  240     }
  241   return msgid;
  242 }
  243 
  244 #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
  245   dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
  246 #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
  247   dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
  248 
  249 #ifdef __GNUC__
  250 __inline
  251 #else
  252 #ifdef __cplusplus
  253 inline
  254 #endif
  255 #endif
  256 static const char *
  257 dcnpgettext_expr (const char *domain,
  258                   const char *msgctxt, const char *msgid,
  259                   const char *msgid_plural, unsigned long int n,
  260                   int category)
  261 {
  262   size_t msgctxt_len = strlen (msgctxt) + 1;
  263   size_t msgid_len = strlen (msgid) + 1;
  264   const char *translation;
  265 #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  266   char msg_ctxt_id[msgctxt_len + msgid_len];
  267 #else
  268   char buf[1024];
  269   char *msg_ctxt_id =
  270     (msgctxt_len + msgid_len <= sizeof (buf)
  271      ? buf
  272      : (char *) malloc (msgctxt_len + msgid_len));
  273   if (msg_ctxt_id != NULL)
  274 #endif
  275     {
  276       int found_translation;
  277       memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
  278       msg_ctxt_id[msgctxt_len - 1] = '\004';
  279       memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
  280       translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
  281       found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
  282 #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  283       if (msg_ctxt_id != buf)
  284         free (msg_ctxt_id);
  285 #endif
  286       if (found_translation)
  287         return translation;
  288     }
  289   return (n == 1 ? msgid : msgid_plural);
  290 }
  291 
  292 #endif /* _LIBGETTEXT_H */