xref: /netbsd-src/external/gpl3/gcc.old/dist/intl/libgnuintl.h (revision c0a68be459da21030695f60d10265c2fc49758f8)
136ac495dSmrg /* Message catalogs for internationalization.
236ac495dSmrg    Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
336ac495dSmrg 
436ac495dSmrg    This program is free software; you can redistribute it and/or modify it
536ac495dSmrg    under the terms of the GNU Library General Public License as published
636ac495dSmrg    by the Free Software Foundation; either version 2, or (at your option)
736ac495dSmrg    any later version.
836ac495dSmrg 
936ac495dSmrg    This program is distributed in the hope that it will be useful,
1036ac495dSmrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
1136ac495dSmrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1236ac495dSmrg    Library General Public License for more details.
1336ac495dSmrg 
1436ac495dSmrg    You should have received a copy of the GNU Library General Public
1536ac495dSmrg    License along with this program; if not, write to the Free Software
1636ac495dSmrg    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
1736ac495dSmrg    USA.  */
1836ac495dSmrg 
1936ac495dSmrg #ifndef _LIBINTL_H
2036ac495dSmrg #define _LIBINTL_H	1
2136ac495dSmrg 
2236ac495dSmrg #include <locale.h>
2336ac495dSmrg 
2436ac495dSmrg /* The LC_MESSAGES locale category is the category used by the functions
2536ac495dSmrg    gettext() and dgettext().  It is specified in POSIX, but not in ANSI C.
2636ac495dSmrg    On systems that don't define it, use an arbitrary value instead.
2736ac495dSmrg    On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
2836ac495dSmrg    then includes <libintl.h> (i.e. this file!) and then only defines
2936ac495dSmrg    LC_MESSAGES.  To avoid a redefinition warning, don't define LC_MESSAGES
3036ac495dSmrg    in this case.  */
3136ac495dSmrg #if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
3236ac495dSmrg # define LC_MESSAGES 1729
3336ac495dSmrg #endif
3436ac495dSmrg 
3536ac495dSmrg /* We define an additional symbol to signal that we use the GNU
3636ac495dSmrg    implementation of gettext.  */
3736ac495dSmrg #define __USE_GNU_GETTEXT 1
3836ac495dSmrg 
3936ac495dSmrg /* Provide information about the supported file formats.  Returns the
4036ac495dSmrg    maximum minor revision number supported for a given major revision.  */
4136ac495dSmrg #define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
4236ac495dSmrg   ((major) == 0 ? 1 : -1)
4336ac495dSmrg 
4436ac495dSmrg /* Resolve a platform specific conflict on DJGPP.  GNU gettext takes
4536ac495dSmrg    precedence over _conio_gettext.  */
4636ac495dSmrg #ifdef __DJGPP__
4736ac495dSmrg # undef gettext
4836ac495dSmrg #endif
4936ac495dSmrg 
5036ac495dSmrg /* Use _INTL_PARAMS, not PARAMS, in order to avoid clashes with identifiers
5136ac495dSmrg    used by programs.  Similarly, test __PROTOTYPES, not PROTOTYPES.  */
5236ac495dSmrg #ifndef _INTL_PARAMS
5336ac495dSmrg # if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
5436ac495dSmrg #  define _INTL_PARAMS(args) args
5536ac495dSmrg # else
5636ac495dSmrg #  define _INTL_PARAMS(args) ()
5736ac495dSmrg # endif
5836ac495dSmrg #endif
5936ac495dSmrg 
6036ac495dSmrg #ifdef __cplusplus
6136ac495dSmrg extern "C" {
6236ac495dSmrg #endif
6336ac495dSmrg 
6436ac495dSmrg 
6536ac495dSmrg /* We redirect the functions to those prefixed with "libintl_".  This is
6636ac495dSmrg    necessary, because some systems define gettext/textdomain/... in the C
6736ac495dSmrg    library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
6836ac495dSmrg    If we used the unprefixed names, there would be cases where the
6936ac495dSmrg    definition in the C library would override the one in the libintl.so
7036ac495dSmrg    shared library.  Recall that on ELF systems, the symbols are looked
7136ac495dSmrg    up in the following order:
7236ac495dSmrg      1. in the executable,
7336ac495dSmrg      2. in the shared libraries specified on the link command line, in order,
7436ac495dSmrg      3. in the dependencies of the shared libraries specified on the link
7536ac495dSmrg         command line,
7636ac495dSmrg      4. in the dlopen()ed shared libraries, in the order in which they were
7736ac495dSmrg         dlopen()ed.
7836ac495dSmrg    The definition in the C library would override the one in libintl.so if
7936ac495dSmrg    either
8036ac495dSmrg      * -lc is given on the link command line and -lintl isn't, or
8136ac495dSmrg      * -lc is given on the link command line before -lintl, or
8236ac495dSmrg      * libintl.so is a dependency of a dlopen()ed shared library but not
8336ac495dSmrg        linked to the executable at link time.
8436ac495dSmrg    Since Solaris gettext() behaves differently than GNU gettext(), this
8536ac495dSmrg    would be unacceptable.
8636ac495dSmrg 
8736ac495dSmrg    The redirection happens by default through macros in C, so that &gettext
8836ac495dSmrg    is independent of the compilation unit, but through inline functions in
8936ac495dSmrg    C++, in order not to interfere with the name mangling of class fields or
9036ac495dSmrg    class methods called 'gettext'.  */
9136ac495dSmrg 
9236ac495dSmrg /* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
9336ac495dSmrg    If he doesn't, we choose the method.  A third possible method is
9436ac495dSmrg    _INTL_REDIRECT_ASM, supported only by GCC.  */
9536ac495dSmrg #if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
9636ac495dSmrg # if __GNUC__ >= 2 && !defined __APPLE_CC__ && (defined __STDC__ || defined __cplusplus)
9736ac495dSmrg #  define _INTL_REDIRECT_ASM
9836ac495dSmrg # else
9936ac495dSmrg #  ifdef __cplusplus
10036ac495dSmrg #   define _INTL_REDIRECT_INLINE
10136ac495dSmrg #  else
10236ac495dSmrg #   define _INTL_REDIRECT_MACROS
10336ac495dSmrg #  endif
10436ac495dSmrg # endif
10536ac495dSmrg #endif
10636ac495dSmrg /* Auxiliary macros.  */
10736ac495dSmrg #ifdef _INTL_REDIRECT_ASM
10836ac495dSmrg # define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
10936ac495dSmrg # define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
11036ac495dSmrg # define _INTL_STRINGIFY(prefix) #prefix
11136ac495dSmrg #else
11236ac495dSmrg # define _INTL_ASM(cname)
11336ac495dSmrg #endif
11436ac495dSmrg 
11536ac495dSmrg /* _INTL_MAY_RETURN_STRING_ARG(n) declares that the given function may return
11636ac495dSmrg    its n-th argument literally.  This enables GCC to warn for example about
11736ac495dSmrg    printf (gettext ("foo %y")).  */
118*c0a68be4Smrg #if defined __GNUC__ && __GNUC__ >= 3 && !(defined __APPLE_CC__ && __APPLE_CC__ > 1 && !(defined __clang__ && __clang__ && __clang_major__ >= 3) && defined __cplusplus)
11936ac495dSmrg # define _INTL_MAY_RETURN_STRING_ARG(n) __attribute__ ((__format_arg__ (n)))
12036ac495dSmrg #else
12136ac495dSmrg # define _INTL_MAY_RETURN_STRING_ARG(n)
12236ac495dSmrg #endif
12336ac495dSmrg 
12436ac495dSmrg /* Look up MSGID in the current default message catalog for the current
12536ac495dSmrg    LC_MESSAGES locale.  If not found, returns MSGID itself (the default
12636ac495dSmrg    text).  */
12736ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
12836ac495dSmrg extern char *libintl_gettext (const char *__msgid)
12936ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (1);
130*c0a68be4Smrg static inline
131*c0a68be4Smrg _INTL_MAY_RETURN_STRING_ARG (1)
gettext(const char * __msgid)132*c0a68be4Smrg char *gettext (const char *__msgid)
13336ac495dSmrg {
13436ac495dSmrg   return libintl_gettext (__msgid);
13536ac495dSmrg }
13636ac495dSmrg #else
13736ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
13836ac495dSmrg # define gettext libintl_gettext
13936ac495dSmrg #endif
14036ac495dSmrg extern char *gettext _INTL_PARAMS ((const char *__msgid))
14136ac495dSmrg        _INTL_ASM (libintl_gettext)
14236ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (1);
14336ac495dSmrg #endif
14436ac495dSmrg 
14536ac495dSmrg /* Look up MSGID in the DOMAINNAME message catalog for the current
14636ac495dSmrg    LC_MESSAGES locale.  */
14736ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
14836ac495dSmrg extern char *libintl_dgettext (const char *__domainname, const char *__msgid)
14936ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2);
150*c0a68be4Smrg static inline
151*c0a68be4Smrg _INTL_MAY_RETURN_STRING_ARG (2)
dgettext(const char * __domainname,const char * __msgid)152*c0a68be4Smrg char *dgettext (const char *__domainname, const char *__msgid)
15336ac495dSmrg {
15436ac495dSmrg   return libintl_dgettext (__domainname, __msgid);
15536ac495dSmrg }
15636ac495dSmrg #else
15736ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
15836ac495dSmrg # define dgettext libintl_dgettext
15936ac495dSmrg #endif
16036ac495dSmrg extern char *dgettext _INTL_PARAMS ((const char *__domainname,
16136ac495dSmrg 				     const char *__msgid))
16236ac495dSmrg        _INTL_ASM (libintl_dgettext)
16336ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2);
16436ac495dSmrg #endif
16536ac495dSmrg 
16636ac495dSmrg /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
16736ac495dSmrg    locale.  */
16836ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
16936ac495dSmrg extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
17036ac495dSmrg 				int __category)
17136ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2);
172*c0a68be4Smrg static inline
173*c0a68be4Smrg _INTL_MAY_RETURN_STRING_ARG (2)
dcgettext(const char * __domainname,const char * __msgid,int __category)174*c0a68be4Smrg char *dcgettext (const char *__domainname, const char *__msgid, int __category)
17536ac495dSmrg {
17636ac495dSmrg   return libintl_dcgettext (__domainname, __msgid, __category);
17736ac495dSmrg }
17836ac495dSmrg #else
17936ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
18036ac495dSmrg # define dcgettext libintl_dcgettext
18136ac495dSmrg #endif
18236ac495dSmrg extern char *dcgettext _INTL_PARAMS ((const char *__domainname,
18336ac495dSmrg 				      const char *__msgid,
18436ac495dSmrg 				      int __category))
18536ac495dSmrg        _INTL_ASM (libintl_dcgettext)
18636ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2);
18736ac495dSmrg #endif
18836ac495dSmrg 
18936ac495dSmrg 
19036ac495dSmrg /* Similar to `gettext' but select the plural form corresponding to the
19136ac495dSmrg    number N.  */
19236ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
19336ac495dSmrg extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
19436ac495dSmrg 			       unsigned long int __n)
19536ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
196*c0a68be4Smrg static inline
197*c0a68be4Smrg _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2)
ngettext(const char * __msgid1,const char * __msgid2,unsigned long int __n)198*c0a68be4Smrg char *ngettext (const char *__msgid1, const char *__msgid2,
19936ac495dSmrg 		unsigned long int __n)
20036ac495dSmrg {
20136ac495dSmrg   return libintl_ngettext (__msgid1, __msgid2, __n);
20236ac495dSmrg }
20336ac495dSmrg #else
20436ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
20536ac495dSmrg # define ngettext libintl_ngettext
20636ac495dSmrg #endif
20736ac495dSmrg extern char *ngettext _INTL_PARAMS ((const char *__msgid1,
20836ac495dSmrg 				     const char *__msgid2,
20936ac495dSmrg 				     unsigned long int __n))
21036ac495dSmrg        _INTL_ASM (libintl_ngettext)
21136ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
21236ac495dSmrg #endif
21336ac495dSmrg 
21436ac495dSmrg /* Similar to `dgettext' but select the plural form corresponding to the
21536ac495dSmrg    number N.  */
21636ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
21736ac495dSmrg extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
21836ac495dSmrg 				const char *__msgid2, unsigned long int __n)
21936ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
220*c0a68be4Smrg static inline
221*c0a68be4Smrg _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3)
dngettext(const char * __domainname,const char * __msgid1,const char * __msgid2,unsigned long int __n)222*c0a68be4Smrg char *dngettext (const char *__domainname, const char *__msgid1,
22336ac495dSmrg 		 const char *__msgid2, unsigned long int __n)
22436ac495dSmrg {
22536ac495dSmrg   return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
22636ac495dSmrg }
22736ac495dSmrg #else
22836ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
22936ac495dSmrg # define dngettext libintl_dngettext
23036ac495dSmrg #endif
23136ac495dSmrg extern char *dngettext _INTL_PARAMS ((const char *__domainname,
23236ac495dSmrg 				      const char *__msgid1,
23336ac495dSmrg 				      const char *__msgid2,
23436ac495dSmrg 				      unsigned long int __n))
23536ac495dSmrg        _INTL_ASM (libintl_dngettext)
23636ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
23736ac495dSmrg #endif
23836ac495dSmrg 
23936ac495dSmrg /* Similar to `dcgettext' but select the plural form corresponding to the
24036ac495dSmrg    number N.  */
24136ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
24236ac495dSmrg extern char *libintl_dcngettext (const char *__domainname,
24336ac495dSmrg 				 const char *__msgid1, const char *__msgid2,
24436ac495dSmrg 				 unsigned long int __n, int __category)
24536ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
246*c0a68be4Smrg static inline
247*c0a68be4Smrg _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3)
dcngettext(const char * __domainname,const char * __msgid1,const char * __msgid2,unsigned long int __n,int __category)248*c0a68be4Smrg char *dcngettext (const char *__domainname,
24936ac495dSmrg 		  const char *__msgid1, const char *__msgid2,
25036ac495dSmrg 		  unsigned long int __n, int __category)
25136ac495dSmrg {
25236ac495dSmrg   return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
25336ac495dSmrg }
25436ac495dSmrg #else
25536ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
25636ac495dSmrg # define dcngettext libintl_dcngettext
25736ac495dSmrg #endif
25836ac495dSmrg extern char *dcngettext _INTL_PARAMS ((const char *__domainname,
25936ac495dSmrg 				       const char *__msgid1,
26036ac495dSmrg 				       const char *__msgid2,
26136ac495dSmrg 				       unsigned long int __n,
26236ac495dSmrg 				       int __category))
26336ac495dSmrg        _INTL_ASM (libintl_dcngettext)
26436ac495dSmrg        _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
26536ac495dSmrg #endif
26636ac495dSmrg 
26736ac495dSmrg 
26836ac495dSmrg /* Set the current default message catalog to DOMAINNAME.
26936ac495dSmrg    If DOMAINNAME is null, return the current default.
27036ac495dSmrg    If DOMAINNAME is "", reset to the default of "messages".  */
27136ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
27236ac495dSmrg extern char *libintl_textdomain (const char *__domainname);
textdomain(const char * __domainname)27336ac495dSmrg static inline char *textdomain (const char *__domainname)
27436ac495dSmrg {
27536ac495dSmrg   return libintl_textdomain (__domainname);
27636ac495dSmrg }
27736ac495dSmrg #else
27836ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
27936ac495dSmrg # define textdomain libintl_textdomain
28036ac495dSmrg #endif
28136ac495dSmrg extern char *textdomain _INTL_PARAMS ((const char *__domainname))
28236ac495dSmrg        _INTL_ASM (libintl_textdomain);
28336ac495dSmrg #endif
28436ac495dSmrg 
28536ac495dSmrg /* Specify that the DOMAINNAME message catalog will be found
28636ac495dSmrg    in DIRNAME rather than in the system locale data base.  */
28736ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
28836ac495dSmrg extern char *libintl_bindtextdomain (const char *__domainname,
28936ac495dSmrg 				     const char *__dirname);
bindtextdomain(const char * __domainname,const char * __dirname)29036ac495dSmrg static inline char *bindtextdomain (const char *__domainname,
29136ac495dSmrg 				    const char *__dirname)
29236ac495dSmrg {
29336ac495dSmrg   return libintl_bindtextdomain (__domainname, __dirname);
29436ac495dSmrg }
29536ac495dSmrg #else
29636ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
29736ac495dSmrg # define bindtextdomain libintl_bindtextdomain
29836ac495dSmrg #endif
29936ac495dSmrg extern char *bindtextdomain _INTL_PARAMS ((const char *__domainname,
30036ac495dSmrg 					   const char *__dirname))
30136ac495dSmrg        _INTL_ASM (libintl_bindtextdomain);
30236ac495dSmrg #endif
30336ac495dSmrg 
30436ac495dSmrg /* Specify the character encoding in which the messages from the
30536ac495dSmrg    DOMAINNAME message catalog will be returned.  */
30636ac495dSmrg #ifdef _INTL_REDIRECT_INLINE
30736ac495dSmrg extern char *libintl_bind_textdomain_codeset (const char *__domainname,
30836ac495dSmrg 					      const char *__codeset);
bind_textdomain_codeset(const char * __domainname,const char * __codeset)30936ac495dSmrg static inline char *bind_textdomain_codeset (const char *__domainname,
31036ac495dSmrg 					     const char *__codeset)
31136ac495dSmrg {
31236ac495dSmrg   return libintl_bind_textdomain_codeset (__domainname, __codeset);
31336ac495dSmrg }
31436ac495dSmrg #else
31536ac495dSmrg #ifdef _INTL_REDIRECT_MACROS
31636ac495dSmrg # define bind_textdomain_codeset libintl_bind_textdomain_codeset
31736ac495dSmrg #endif
31836ac495dSmrg extern char *bind_textdomain_codeset _INTL_PARAMS ((const char *__domainname,
31936ac495dSmrg 						    const char *__codeset))
32036ac495dSmrg        _INTL_ASM (libintl_bind_textdomain_codeset);
32136ac495dSmrg #endif
32236ac495dSmrg 
32336ac495dSmrg 
32436ac495dSmrg /* Support for relocatable packages.  */
32536ac495dSmrg 
32636ac495dSmrg /* Sets the original and the current installation prefix of the package.
32736ac495dSmrg    Relocation simply replaces a pathname starting with the original prefix
32836ac495dSmrg    by the corresponding pathname with the current prefix instead.  Both
32936ac495dSmrg    prefixes should be directory names without trailing slash (i.e. use ""
33036ac495dSmrg    instead of "/").  */
33136ac495dSmrg #define libintl_set_relocation_prefix libintl_set_relocation_prefix
33236ac495dSmrg extern void
33336ac495dSmrg        libintl_set_relocation_prefix _INTL_PARAMS ((const char *orig_prefix,
33436ac495dSmrg 						    const char *curr_prefix));
33536ac495dSmrg 
33636ac495dSmrg 
33736ac495dSmrg #ifdef __cplusplus
33836ac495dSmrg }
33936ac495dSmrg #endif
34036ac495dSmrg 
34136ac495dSmrg #endif /* libintl.h */
342