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