Home | History | Annotate | Download | only in intl
      1 /* Message catalogs for internationalization.
      2    Copyright (C) 1995-1997, 2000-2003 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
     17    USA.  */
     18 
     19 #ifndef _LIBINTL_H
     20 #define _LIBINTL_H	1
     21 
     22 #include <locale.h>
     23 
     24 /* The LC_MESSAGES locale category is the category used by the functions
     25    gettext() and dgettext().  It is specified in POSIX, but not in ANSI C.
     26    On systems that don't define it, use an arbitrary value instead.
     27    On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
     28    then includes <libintl.h> (i.e. this file!) and then only defines
     29    LC_MESSAGES.  To avoid a redefinition warning, don't define LC_MESSAGES
     30    in this case.  */
     31 #if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
     32 # define LC_MESSAGES 1729
     33 #endif
     34 
     35 /* We define an additional symbol to signal that we use the GNU
     36    implementation of gettext.  */
     37 #define __USE_GNU_GETTEXT 1
     38 
     39 /* Provide information about the supported file formats.  Returns the
     40    maximum minor revision number supported for a given major revision.  */
     41 #define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
     42   ((major) == 0 ? 1 : -1)
     43 
     44 /* Resolve a platform specific conflict on DJGPP.  GNU gettext takes
     45    precedence over _conio_gettext.  */
     46 #ifdef __DJGPP__
     47 # undef gettext
     48 #endif
     49 
     50 #ifdef __cplusplus
     51 extern "C" {
     52 #endif
     53 
     54 
     55 /* We redirect the functions to those prefixed with "libintl_".  This is
     56    necessary, because some systems define gettext/textdomain/... in the C
     57    library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
     58    If we used the unprefixed names, there would be cases where the
     59    definition in the C library would override the one in the libintl.so
     60    shared library.  Recall that on ELF systems, the symbols are looked
     61    up in the following order:
     62      1. in the executable,
     63      2. in the shared libraries specified on the link command line, in order,
     64      3. in the dependencies of the shared libraries specified on the link
     65         command line,
     66      4. in the dlopen()ed shared libraries, in the order in which they were
     67         dlopen()ed.
     68    The definition in the C library would override the one in libintl.so if
     69    either
     70      * -lc is given on the link command line and -lintl isn't, or
     71      * -lc is given on the link command line before -lintl, or
     72      * libintl.so is a dependency of a dlopen()ed shared library but not
     73        linked to the executable at link time.
     74    Since Solaris gettext() behaves differently than GNU gettext(), this
     75    would be unacceptable.
     76 
     77    The redirection happens by default through macros in C, so that &gettext
     78    is independent of the compilation unit, but through inline functions in
     79    C++, in order not to interfere with the name mangling of class fields or
     80    class methods called 'gettext'.  */
     81 
     82 /* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
     83    If he doesn't, we choose the method.  A third possible method is
     84    _INTL_REDIRECT_ASM, supported only by GCC.  */
     85 #if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
     86 # if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus)
     87 #  define _INTL_REDIRECT_ASM
     88 # else
     89 #  ifdef __cplusplus
     90 #   define _INTL_REDIRECT_INLINE
     91 #  else
     92 #   define _INTL_REDIRECT_MACROS
     93 #  endif
     94 # endif
     95 #endif
     96 /* Auxiliary macros.  */
     97 #ifdef _INTL_REDIRECT_ASM
     98 # define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
     99 # define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
    100 # define _INTL_STRINGIFY(prefix) #prefix
    101 #else
    102 # define _INTL_ASM(cname)
    103 #endif
    104 
    105 /* Look up MSGID in the current default message catalog for the current
    106    LC_MESSAGES locale.  If not found, returns MSGID itself (the default
    107    text).  */
    108 #ifdef _INTL_REDIRECT_INLINE
    109 extern char *libintl_gettext (const char *__msgid);
    110 static inline char *gettext (const char *__msgid)
    111 {
    112   return libintl_gettext (__msgid);
    113 }
    114 #else
    115 #ifdef _INTL_REDIRECT_MACROS
    116 # define gettext libintl_gettext
    117 #endif
    118 extern char *gettext (const char *__msgid)
    119        _INTL_ASM (libintl_gettext);
    120 #endif
    121 
    122 /* Look up MSGID in the DOMAINNAME message catalog for the current
    123    LC_MESSAGES locale.  */
    124 #ifdef _INTL_REDIRECT_INLINE
    125 extern char *libintl_dgettext (const char *__domainname, const char *__msgid);
    126 static inline char *dgettext (const char *__domainname, const char *__msgid)
    127 {
    128   return libintl_dgettext (__domainname, __msgid);
    129 }
    130 #else
    131 #ifdef _INTL_REDIRECT_MACROS
    132 # define dgettext libintl_dgettext
    133 #endif
    134 extern char *dgettext (const char *__domainname, const char *__msgid)
    135        _INTL_ASM (libintl_dgettext);
    136 #endif
    137 
    138 /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
    139    locale.  */
    140 #ifdef _INTL_REDIRECT_INLINE
    141 extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
    142 				int __category);
    143 static inline char *dcgettext (const char *__domainname, const char *__msgid,
    144 			       int __category)
    145 {
    146   return libintl_dcgettext (__domainname, __msgid, __category);
    147 }
    148 #else
    149 #ifdef _INTL_REDIRECT_MACROS
    150 # define dcgettext libintl_dcgettext
    151 #endif
    152 extern char *dcgettext (const char *__domainname, const char *__msgid,
    153 			int __category)
    154        _INTL_ASM (libintl_dcgettext);
    155 #endif
    156 
    157 
    158 /* Similar to `gettext' but select the plural form corresponding to the
    159    number N.  */
    160 #ifdef _INTL_REDIRECT_INLINE
    161 extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
    162 			       unsigned long int __n);
    163 static inline char *ngettext (const char *__msgid1, const char *__msgid2,
    164 			      unsigned long int __n)
    165 {
    166   return libintl_ngettext (__msgid1, __msgid2, __n);
    167 }
    168 #else
    169 #ifdef _INTL_REDIRECT_MACROS
    170 # define ngettext libintl_ngettext
    171 #endif
    172 extern char *ngettext (const char *__msgid1, const char *__msgid2,
    173 		       unsigned long int __n)
    174        _INTL_ASM (libintl_ngettext);
    175 #endif
    176 
    177 /* Similar to `dgettext' but select the plural form corresponding to the
    178    number N.  */
    179 #ifdef _INTL_REDIRECT_INLINE
    180 extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
    181 				const char *__msgid2, unsigned long int __n);
    182 static inline char *dngettext (const char *__domainname, const char *__msgid1,
    183 			       const char *__msgid2, unsigned long int __n)
    184 {
    185   return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
    186 }
    187 #else
    188 #ifdef _INTL_REDIRECT_MACROS
    189 # define dngettext libintl_dngettext
    190 #endif
    191 extern char *dngettext (const char *__domainname,
    192 			const char *__msgid1, const char *__msgid2,
    193 			unsigned long int __n)
    194        _INTL_ASM (libintl_dngettext);
    195 #endif
    196 
    197 /* Similar to `dcgettext' but select the plural form corresponding to the
    198    number N.  */
    199 #ifdef _INTL_REDIRECT_INLINE
    200 extern char *libintl_dcngettext (const char *__domainname,
    201 				 const char *__msgid1, const char *__msgid2,
    202 				 unsigned long int __n, int __category);
    203 static inline char *dcngettext (const char *__domainname,
    204 				const char *__msgid1, const char *__msgid2,
    205 				unsigned long int __n, int __category)
    206 {
    207   return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
    208 }
    209 #else
    210 #ifdef _INTL_REDIRECT_MACROS
    211 # define dcngettext libintl_dcngettext
    212 #endif
    213 extern char *dcngettext (const char *__domainname,
    214 			 const char *__msgid1, const char *__msgid2,
    215 			 unsigned long int __n, int __category)
    216        _INTL_ASM (libintl_dcngettext);
    217 #endif
    218 
    219 
    220 /* Set the current default message catalog to DOMAINNAME.
    221    If DOMAINNAME is null, return the current default.
    222    If DOMAINNAME is "", reset to the default of "messages".  */
    223 #ifdef _INTL_REDIRECT_INLINE
    224 extern char *libintl_textdomain (const char *__domainname);
    225 static inline char *textdomain (const char *__domainname)
    226 {
    227   return libintl_textdomain (__domainname);
    228 }
    229 #else
    230 #ifdef _INTL_REDIRECT_MACROS
    231 # define textdomain libintl_textdomain
    232 #endif
    233 extern char *textdomain (const char *__domainname)
    234        _INTL_ASM (libintl_textdomain);
    235 #endif
    236 
    237 /* Specify that the DOMAINNAME message catalog will be found
    238    in DIRNAME rather than in the system locale data base.  */
    239 #ifdef _INTL_REDIRECT_INLINE
    240 extern char *libintl_bindtextdomain (const char *__domainname,
    241 				     const char *__dirname);
    242 static inline char *bindtextdomain (const char *__domainname,
    243 				    const char *__dirname)
    244 {
    245   return libintl_bindtextdomain (__domainname, __dirname);
    246 }
    247 #else
    248 #ifdef _INTL_REDIRECT_MACROS
    249 # define bindtextdomain libintl_bindtextdomain
    250 #endif
    251 extern char *bindtextdomain (const char *__domainname, const char *__dirname)
    252        _INTL_ASM (libintl_bindtextdomain);
    253 #endif
    254 
    255 /* Specify the character encoding in which the messages from the
    256    DOMAINNAME message catalog will be returned.  */
    257 #ifdef _INTL_REDIRECT_INLINE
    258 extern char *libintl_bind_textdomain_codeset (const char *__domainname,
    259 					      const char *__codeset);
    260 static inline char *bind_textdomain_codeset (const char *__domainname,
    261 					     const char *__codeset)
    262 {
    263   return libintl_bind_textdomain_codeset (__domainname, __codeset);
    264 }
    265 #else
    266 #ifdef _INTL_REDIRECT_MACROS
    267 # define bind_textdomain_codeset libintl_bind_textdomain_codeset
    268 #endif
    269 extern char *bind_textdomain_codeset (const char *__domainname,
    270 				      const char *__codeset)
    271        _INTL_ASM (libintl_bind_textdomain_codeset);
    272 #endif
    273 
    274 
    275 /* Support for format strings with positions in *printf(), following the
    276    POSIX/XSI specification.
    277    Note: These replacements for the *printf() functions are visible only
    278    in source files that #include <libintl.h> or #include "gettext.h".
    279    Packages that use *printf() in source files that don't refer to _()
    280    or gettext() but for which the format string could be the return value
    281    of _() or gettext() need to add this #include.  Oh well.  */
    282 
    283 #if !@HAVE_POSIX_PRINTF@
    284 
    285 #include <stdio.h>
    286 #include <stddef.h>
    287 
    288 /* Get va_list.  */
    289 #if __STDC__ || defined __cplusplus || defined _MSC_VER
    290 # include <stdarg.h>
    291 #else
    292 # include <varargs.h>
    293 #endif
    294 
    295 #undef fprintf
    296 #define fprintf libintl_fprintf
    297 extern int fprintf (FILE *, const char *, ...);
    298 #undef vfprintf
    299 #define vfprintf libintl_vfprintf
    300 extern int vfprintf (FILE *, const char *, va_list);
    301 
    302 #undef printf
    303 #define printf libintl_printf
    304 extern int printf (const char *, ...);
    305 #undef vprintf
    306 #define vprintf libintl_vprintf
    307 extern int vprintf (const char *, va_list);
    308 
    309 #undef sprintf
    310 #define sprintf libintl_sprintf
    311 extern int sprintf (char *, const char *, ...);
    312 #undef vsprintf
    313 #define vsprintf libintl_vsprintf
    314 extern int vsprintf (char *, const char *, va_list);
    315 
    316 #if @HAVE_SNPRINTF@
    317 
    318 #undef snprintf
    319 #define snprintf libintl_snprintf
    320 extern int snprintf (char *, size_t, const char *, ...);
    321 #undef vsnprintf
    322 #define vsnprintf libintl_vsnprintf
    323 extern int vsnprintf (char *, size_t, const char *, va_list);
    324 
    325 #endif
    326 
    327 #if @HAVE_ASPRINTF@
    328 
    329 #undef asprintf
    330 #define asprintf libintl_asprintf
    331 extern int asprintf (char **, const char *, ...);
    332 #undef vasprintf
    333 #define vasprintf libintl_vasprintf
    334 extern int vasprintf (char **, const char *, va_list);
    335 
    336 #endif
    337 
    338 #if @HAVE_WPRINTF@
    339 
    340 #undef fwprintf
    341 #define fwprintf libintl_fwprintf
    342 extern int fwprintf (FILE *, const wchar_t *, ...);
    343 #undef vfwprintf
    344 #define vfwprintf libintl_vfwprintf
    345 extern int vfwprintf (FILE *, const wchar_t *, va_list);
    346 
    347 #undef wprintf
    348 #define wprintf libintl_wprintf
    349 extern int wprintf (const wchar_t *, ...);
    350 #undef vwprintf
    351 #define vwprintf libintl_vwprintf
    352 extern int vwprintf (const wchar_t *, va_list);
    353 
    354 #undef swprintf
    355 #define swprintf libintl_swprintf
    356 extern int swprintf (wchar_t *, size_t, const wchar_t *, ...);
    357 #undef vswprintf
    358 #define vswprintf libintl_vswprintf
    359 extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
    360 
    361 #endif
    362 
    363 #endif
    364 
    365 
    366 /* Support for relocatable packages.  */
    367 
    368 /* Sets the original and the current installation prefix of the package.
    369    Relocation simply replaces a pathname starting with the original prefix
    370    by the corresponding pathname with the current prefix instead.  Both
    371    prefixes should be directory names without trailing slash (i.e. use ""
    372    instead of "/").  */
    373 #define libintl_set_relocation_prefix libintl_set_relocation_prefix
    374 extern void
    375        libintl_set_relocation_prefix (const char *orig_prefix,
    376 				      const char *curr_prefix);
    377 
    378 
    379 #ifdef __cplusplus
    380 }
    381 #endif
    382 
    383 #endif /* libintl.h */
    384