"Fossies" - the Fresh Open Source Software Archive

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