"Fossies" - the Fresh Open Source Software Archive

Member "scalpel-2.0/tre-0.7.5-win32/gnulib/lib/gettext.h" (20 Apr 2011, 9501 Bytes) of archive /linux/misc/scalpel-2.0.tar.gz:


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.

    1 /* Convenience header for conditional use of GNU <libintl.h>.
    2    Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc.
    3 
    4    This program is free software; you can redistribute it and/or modify
    5    it under the terms of the GNU Lesser General Public License as published by
    6    the Free Software Foundation; either version 2.1, or (at your option)
    7    any later version.
    8 
    9    This program is distributed in the hope that it will be useful,
   10    but WITHOUT ANY WARRANTY; without even the implied warranty of
   11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   12    GNU Lesser General Public License for more details.
   13 
   14    You should have received a copy of the GNU Lesser General Public License along
   15    with this program; if not, write to the Free Software Foundation,
   16    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
   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) || _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 # define gettext(Msgid) ((const char *) (Msgid))
   67 # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
   68 # define dcgettext(Domainname, Msgid, Category) \
   69     ((void) (Category), dgettext (Domainname, Msgid))
   70 # define ngettext(Msgid1, Msgid2, N) \
   71     ((N) == 1 \
   72      ? ((void) (Msgid2), (const char *) (Msgid1)) \
   73      : ((void) (Msgid1), (const char *) (Msgid2)))
   74 # define dngettext(Domainname, Msgid1, Msgid2, N) \
   75     ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
   76 # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
   77     ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N))
   78 # define textdomain(Domainname) ((const char *) (Domainname))
   79 # define bindtextdomain(Domainname, Dirname) \
   80     ((void) (Domainname), (const char *) (Dirname))
   81 # define bind_textdomain_codeset(Domainname, Codeset) \
   82     ((void) (Domainname), (const char *) (Codeset))
   83 
   84 #endif
   85 
   86 /* A pseudo function call that serves as a marker for the automated
   87    extraction of messages, but does not call gettext().  The run-time
   88    translation is done at a different place in the code.
   89    The argument, String, should be a literal string.  Concatenated strings
   90    and other string expressions won't work.
   91    The macro's expansion is not parenthesized, so that it is suitable as
   92    initializer for static 'char[]' or 'const char[]' variables.  */
   93 #define gettext_noop(String) String
   94 
   95 /* The separator between msgctxt and msgid in a .mo file.  */
   96 #define GETTEXT_CONTEXT_GLUE "\004"
   97 
   98 /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
   99    MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
  100    short and rarely need to change.
  101    The letter 'p' stands for 'particular' or 'special'.  */
  102 #ifdef DEFAULT_TEXT_DOMAIN
  103 # define pgettext(Msgctxt, Msgid) \
  104    pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
  105 #else
  106 # define pgettext(Msgctxt, Msgid) \
  107    pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
  108 #endif
  109 #define dpgettext(Domainname, Msgctxt, Msgid) \
  110   pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
  111 #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
  112   pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
  113 #ifdef DEFAULT_TEXT_DOMAIN
  114 # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
  115    npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
  116 #else
  117 # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
  118    npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
  119 #endif
  120 #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
  121   npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
  122 #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
  123   npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
  124 
  125 #ifdef __GNUC__
  126 __inline
  127 #else
  128 #ifdef __cplusplus
  129 inline
  130 #endif
  131 #endif
  132 static const char *
  133 pgettext_aux (const char *domain,
  134           const char *msg_ctxt_id, const char *msgid,
  135           int category)
  136 {
  137   const char *translation = dcgettext (domain, msg_ctxt_id, category);
  138   if (translation == msg_ctxt_id)
  139     return msgid;
  140   else
  141     return translation;
  142 }
  143 
  144 #ifdef __GNUC__
  145 __inline
  146 #else
  147 #ifdef __cplusplus
  148 inline
  149 #endif
  150 #endif
  151 static const char *
  152 npgettext_aux (const char *domain,
  153            const char *msg_ctxt_id, const char *msgid,
  154            const char *msgid_plural, unsigned long int n,
  155            int category)
  156 {
  157   const char *translation =
  158     dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
  159   if (translation == msg_ctxt_id || translation == msgid_plural)
  160     return (n == 1 ? msgid : msgid_plural);
  161   else
  162     return translation;
  163 }
  164 
  165 /* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
  166    can be arbitrary expressions.  But for string literals these macros are
  167    less efficient than those above.  */
  168 
  169 #include <string.h>
  170 
  171 #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
  172   (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \
  173    /* || __STDC_VERSION__ >= 199901L */ )
  174 
  175 #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  176 #include <stdlib.h>
  177 #endif
  178 
  179 #define pgettext_expr(Msgctxt, Msgid) \
  180   dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
  181 #define dpgettext_expr(Domainname, Msgctxt, Msgid) \
  182   dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
  183 
  184 #ifdef __GNUC__
  185 __inline
  186 #else
  187 #ifdef __cplusplus
  188 inline
  189 #endif
  190 #endif
  191 static const char *
  192 dcpgettext_expr (const char *domain,
  193          const char *msgctxt, const char *msgid,
  194          int category)
  195 {
  196   size_t msgctxt_len = strlen (msgctxt) + 1;
  197   size_t msgid_len = strlen (msgid) + 1;
  198   const char *translation;
  199 #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  200   char msg_ctxt_id[msgctxt_len + msgid_len];
  201 #else
  202   char buf[1024];
  203   char *msg_ctxt_id =
  204     (msgctxt_len + msgid_len <= sizeof (buf)
  205      ? buf
  206      : (char *) malloc (msgctxt_len + msgid_len));
  207   if (msg_ctxt_id != NULL)
  208 #endif
  209     {
  210       memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
  211       msg_ctxt_id[msgctxt_len - 1] = '\004';
  212       memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
  213       translation = dcgettext (domain, msg_ctxt_id, category);
  214 #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  215       if (msg_ctxt_id != buf)
  216     free (msg_ctxt_id);
  217 #endif
  218       if (translation != msg_ctxt_id)
  219     return translation;
  220     }
  221   return msgid;
  222 }
  223 
  224 #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
  225   dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
  226 #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
  227   dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
  228 
  229 #ifdef __GNUC__
  230 __inline
  231 #else
  232 #ifdef __cplusplus
  233 inline
  234 #endif
  235 #endif
  236 static const char *
  237 dcnpgettext_expr (const char *domain,
  238           const char *msgctxt, const char *msgid,
  239           const char *msgid_plural, unsigned long int n,
  240           int category)
  241 {
  242   size_t msgctxt_len = strlen (msgctxt) + 1;
  243   size_t msgid_len = strlen (msgid) + 1;
  244   const char *translation;
  245 #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  246   char msg_ctxt_id[msgctxt_len + msgid_len];
  247 #else
  248   char buf[1024];
  249   char *msg_ctxt_id =
  250     (msgctxt_len + msgid_len <= sizeof (buf)
  251      ? buf
  252      : (char *) malloc (msgctxt_len + msgid_len));
  253   if (msg_ctxt_id != NULL)
  254 #endif
  255     {
  256       memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
  257       msg_ctxt_id[msgctxt_len - 1] = '\004';
  258       memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
  259       translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
  260 #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
  261       if (msg_ctxt_id != buf)
  262     free (msg_ctxt_id);
  263 #endif
  264       if (!(translation == msg_ctxt_id || translation == msgid_plural))
  265     return translation;
  266     }
  267   return (n == 1 ? msgid : msgid_plural);
  268 }
  269 
  270 #endif /* _LIBGETTEXT_H */