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