1/* Header describing internals of libintl library.
2   Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
3   Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
4
5   This program is free software; you can redistribute it and/or modify it
6   under the terms of the GNU Library General Public License as published
7   by the Free Software Foundation; either version 2, or (at your option)
8   any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   Library General Public License for more details.
14
15   You should have received a copy of the GNU Library General Public
16   License along with this program; if not, write to the Free Software
17   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
18   USA.  */
19
20#ifndef _GETTEXTP_H
21#define _GETTEXTP_H
22
23#include <stddef.h>		/* Get size_t.  */
24
25#ifdef _LIBC
26# include "../iconv/gconv_int.h"
27#else
28# if HAVE_ICONV
29#  include <iconv.h>
30# endif
31#endif
32
33#include "loadinfo.h"
34
35#include "gettext.h"		/* Get nls_uint32.  */
36
37/* @@ end of prolog @@ */
38
39#ifndef PARAMS
40# if __STDC__
41#  define PARAMS(args) args
42# else
43#  define PARAMS(args) ()
44# endif
45#endif
46
47#ifndef internal_function
48# define internal_function
49#endif
50
51/* Tell the compiler when a conditional or integer expression is
52   almost always true or almost always false.  */
53#ifndef HAVE_BUILTIN_EXPECT
54# define __builtin_expect(expr, val) (expr)
55#endif
56
57#ifndef W
58# define W(flag, data) ((flag) ? SWAP (data) : (data))
59#endif
60
61
62#ifdef _LIBC
63# include <byteswap.h>
64# define SWAP(i) bswap_32 (i)
65#else
66/* GCC LOCAL: Prototype first to avoid warnings; change argument to
67   unsigned int to avoid K&R type promotion errors with 64-bit "int".  */
68static inline nls_uint32 SWAP PARAMS ((unsigned int));
69static inline nls_uint32
70SWAP (ii)
71     unsigned int ii;
72{
73  nls_uint32 i = ii;
74  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
75}
76#endif
77
78
79/* This is the representation of the expressions to determine the
80   plural form.  */
81struct expression
82{
83  int nargs;			/* Number of arguments.  */
84  enum operator
85  {
86    /* Without arguments:  */
87    var,			/* The variable "n".  */
88    num,			/* Decimal number.  */
89    /* Unary operators:  */
90    lnot,			/* Logical NOT.  */
91    /* Binary operators:  */
92    mult,			/* Multiplication.  */
93    divide,			/* Division.  */
94    module,			/* Module operation.  */
95    plus,			/* Addition.  */
96    minus,			/* Subtraction.  */
97    less_than,			/* Comparison.  */
98    greater_than,		/* Comparison.  */
99    less_or_equal,		/* Comparison.  */
100    greater_or_equal,		/* Comparison.  */
101    equal,			/* Comparision for equality.  */
102    not_equal,			/* Comparision for inequality.  */
103    land,			/* Logical AND.  */
104    lor,			/* Logical OR.  */
105    /* Ternary operators:  */
106    qmop			/* Question mark operator.  */
107  } operation;
108  union
109  {
110    unsigned long int num;	/* Number value for `num'.  */
111    struct expression *args[3];	/* Up to three arguments.  */
112  } val;
113};
114
115/* This is the data structure to pass information to the parser and get
116   the result in a thread-safe way.  */
117struct parse_args
118{
119  const char *cp;
120  struct expression *res;
121};
122
123
124/* The representation of an opened message catalog.  */
125struct loaded_domain
126{
127  const char *data;
128  int use_mmap;
129  size_t mmap_size;
130  int must_swap;
131  nls_uint32 nstrings;
132  struct string_desc *orig_tab;
133  struct string_desc *trans_tab;
134  nls_uint32 hash_size;
135  nls_uint32 *hash_tab;
136  int codeset_cntr;
137#ifdef _LIBC
138  __gconv_t conv;
139#else
140# if HAVE_ICONV
141  iconv_t conv;
142# endif
143#endif
144  char **conv_tab;
145
146  struct expression *plural;
147  unsigned long int nplurals;
148};
149
150/* We want to allocate a string at the end of the struct.  But ISO C
151   doesn't allow zero sized arrays.
152   GCC LOCAL: Always use 1, to avoid warnings.  */
153/*#ifdef __GNUC__*/
154/*# define ZERO 0*/
155/*#else*/
156# define ZERO 1
157/*#endif*/
158
159/* A set of settings bound to a message domain.  Used to store settings
160   from bindtextdomain() and bind_textdomain_codeset().  */
161struct binding
162{
163  struct binding *next;
164  char *dirname;
165  int codeset_cntr;	/* Incremented each time codeset changes.  */
166  char *codeset;
167  char domainname[ZERO];
168};
169
170/* A counter which is incremented each time some previous translations
171   become invalid.
172   This variable is part of the external ABI of the GNU libintl.  */
173extern int _nl_msg_cat_cntr;
174
175struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
176						 char *__locale,
177						 const char *__domainname,
178					      struct binding *__domainbinding))
179     internal_function;
180void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain,
181			      struct binding *__domainbinding))
182     internal_function;
183void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
184     internal_function;
185const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file,
186					  struct loaded_domain *__domain,
187					  struct binding *__domainbinding))
188     internal_function;
189void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain))
190     internal_function;
191
192char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file,
193			    struct binding *domainbinding,
194			    const char *msgid, size_t *lengthp))
195     internal_function;
196
197/* GCC LOCAL: This prototype moved here from next to its
198   use in loadmsgcat.c.  */
199extern const char *locale_charset PARAMS ((void)) internal_function;
200
201#ifdef _LIBC
202extern char *__gettext PARAMS ((const char *__msgid));
203extern char *__dgettext PARAMS ((const char *__domainname,
204				 const char *__msgid));
205extern char *__dcgettext PARAMS ((const char *__domainname,
206				  const char *__msgid, int __category));
207extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2,
208				 unsigned long int __n));
209extern char *__dngettext PARAMS ((const char *__domainname,
210				  const char *__msgid1, const char *__msgid2,
211				  unsigned long int n));
212extern char *__dcngettext PARAMS ((const char *__domainname,
213				   const char *__msgid1, const char *__msgid2,
214				   unsigned long int __n, int __category));
215extern char *__dcigettext PARAMS ((const char *__domainname,
216				   const char *__msgid1, const char *__msgid2,
217				   int __plural, unsigned long int __n,
218				   int __category));
219extern char *__textdomain PARAMS ((const char *__domainname));
220extern char *__bindtextdomain PARAMS ((const char *__domainname,
221				       const char *__dirname));
222extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname,
223						const char *__codeset));
224#else
225extern char *gettext__ PARAMS ((const char *__msgid));
226extern char *dgettext__ PARAMS ((const char *__domainname,
227				 const char *__msgid));
228extern char *dcgettext__ PARAMS ((const char *__domainname,
229				  const char *__msgid, int __category));
230extern char *ngettext__ PARAMS ((const char *__msgid1, const char *__msgid2,
231				 unsigned long int __n));
232extern char *dngettext__ PARAMS ((const char *__domainname,
233				  const char *__msgid1, const char *__msgid2,
234				  unsigned long int __n));
235extern char *dcngettext__ PARAMS ((const char *__domainname,
236				   const char *__msgid1, const char *__msgid2,
237				   unsigned long int __n, int __category));
238extern char *dcigettext__ PARAMS ((const char *__domainname,
239				   const char *__msgid1, const char *__msgid2,
240				   int __plural, unsigned long int __n,
241				   int __category));
242extern char *textdomain__ PARAMS ((const char *__domainname));
243extern char *bindtextdomain__ PARAMS ((const char *__domainname,
244				       const char *__dirname));
245extern char *bind_textdomain_codeset__ PARAMS ((const char *__domainname,
246						const char *__codeset));
247#endif
248
249#ifdef _LIBC
250extern void __gettext_free_exp PARAMS ((struct expression *exp))
251     internal_function;
252extern int __gettextparse PARAMS ((void *arg));
253#else
254extern void gettext_free_exp__ PARAMS ((struct expression *exp))
255     internal_function;
256extern int gettextparse__ PARAMS ((void *arg));
257#endif
258
259/* @@ begin of epilog @@ */
260
261#endif /* gettextP.h  */
262