(struct expression): Define.
[kopensolaris-gnu/glibc.git] / intl / gettextP.h
1 /* Header describing internals of gettext library
2    Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
3    Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    The GNU C Library 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 the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #ifndef _GETTEXTP_H
21 #define _GETTEXTP_H
22
23 #ifdef _LIBC
24 # include "../iconv/gconv_int.h"
25 #else
26 # if HAVE_ICONV
27 #  include <iconv.h>
28 # endif
29 #endif
30
31 #include "loadinfo.h"
32
33 /* @@ end of prolog @@ */
34
35 #ifndef PARAMS
36 # if __STDC__
37 #  define PARAMS(args) args
38 # else
39 #  define PARAMS(args) ()
40 # endif
41 #endif
42
43 #ifndef internal_function
44 # define internal_function
45 #endif
46
47 #ifndef W
48 # define W(flag, data) ((flag) ? SWAP (data) : (data))
49 #endif
50
51
52 #ifdef _LIBC
53 # include <byteswap.h>
54 # define SWAP(i) bswap_32 (i)
55 #else
56 static nls_uint32 SWAP PARAMS ((nls_uint32 i));
57
58 static inline nls_uint32
59 SWAP (i)
60      nls_uint32 i;
61 {
62   return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
63 }
64 #endif
65
66
67 /* This is the representation of the expressions to determine the
68    plural form.  */
69 struct expression
70 {
71   enum operator
72   {
73     var,                        /* The variable "n".  */
74     num,                        /* Decimal number.  */
75     mult,                       /* Multiplication.  */
76     divide,                     /* Division.  */
77     module,                     /* Module operation.  */
78     plus,                       /* Addition.  */
79     minus,                      /* Subtraction.  */
80     equal,                      /* Comparision for equality.  */
81     not_equal,                  /* Comparision for inequality.  */
82     land,                       /* Logical AND.  */
83     lor,                        /* Logical OR.  */
84     qmop                        /* Question mark operator.  */
85   } operation;
86   union
87   {
88     unsigned long int num;      /* Number value for `num'.  */
89     struct
90     {
91       struct expression *left;  /* Left expression in binary operation.  */
92       struct expression *right; /* Right expression in binary operation.  */
93     } args2;
94     struct
95     {
96       struct expression *bexp;  /* Boolean expression in ?: operation.  */
97       struct expression *tbranch; /* True-branch in ?: operation.  */
98       struct expression *fbranch; /* False-branch in ?: operation.  */
99     } args3;
100   } val;
101 };
102
103 /* This is the data structure to pass information to the parser and get
104    the result in a thread-safe way.  */
105 struct parse_args
106 {
107   const char *cp;
108   struct expression *res;
109 };
110
111
112 struct loaded_domain
113 {
114   const char *data;
115   int use_mmap;
116   size_t mmap_size;
117   int must_swap;
118   nls_uint32 nstrings;
119   struct string_desc *orig_tab;
120   struct string_desc *trans_tab;
121   nls_uint32 hash_size;
122   nls_uint32 *hash_tab;
123 #ifdef _LIBC
124   __gconv_t conv;
125 #else
126 # if HAVE_ICONV
127   iconv_t conv;
128 # endif
129 #endif
130   char **conv_tab;
131
132   struct expression *plural;
133   unsigned long int nplurals;
134 };
135
136 struct binding
137 {
138   struct binding *next;
139   char *domainname;
140   char *dirname;
141 };
142
143 extern int _nl_msg_cat_cntr;
144
145 struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
146                                                  char *__locale,
147                                                  const char *__domainname))
148      internal_function;
149 void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain))
150      internal_function;
151 void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
152      internal_function;
153
154 #ifdef _LIBC
155 extern char *__ngettext PARAMS ((const char *msgid1, const char *msgid2,
156                                  unsigned long int n));
157 extern char *__dngettext PARAMS ((const char *domainname, const char *msgid1,
158                                   const char *msgid2, unsigned long int n));
159 extern char *__dcngettext PARAMS ((const char *domainname, const char *msgid1,
160                                    const char *msgid2, unsigned long int n,
161                                    int category));
162 extern char *__dcigettext PARAMS ((const char *domainname, const char *msgid1,
163                                    const char *msgid2, int plural,
164                                    unsigned long int n, int category));
165 #else
166 extern char *ngettext__ PARAMS ((const char *msgid1, const char *msgid2,
167                                  unsigned long int n));
168 extern char *dngettext__ PARAMS ((const char *domainname, const char *msgid1,
169                                   const char *msgid2, unsigned long int n));
170 extern char *dcngettext__ PARAMS ((const char *domainname, const char *msgid1,
171                                    const char *msgid2, unsigned long int n,
172                                    int category));
173 extern char *dcigettext__ PARAMS ((const char *domainname, const char *msgid1,
174                                    const char *msgid2, int plural,
175                                    unsigned long int n, int category));
176 #endif
177
178 extern int __gettextdebug;
179 extern void __gettext_free_exp (struct expression *exp) internal_function;
180 extern int __gettextparse (void *arg);
181
182 /* @@ begin of epilog @@ */
183
184 #endif /* gettextP.h  */