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