1/*	$NetBSD: gettextP.h,v 1.1.1.1 2016/01/14 00:11:27 christos Exp $	*/
2
3/* Header describing internals of libintl library.
4   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
5   Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
6
7   This program is free software; you can redistribute it and/or modify it
8   under the terms of the GNU Library General Public License as published
9   by the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15   Library General Public License for more details.
16
17   You should have received a copy of the GNU Library General Public
18   License along with this program; if not, write to the Free Software
19   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20   USA.  */
21
22#ifndef _GETTEXTP_H
23#define _GETTEXTP_H
24
25#include <stddef.h>		/* Get size_t.  */
26
27#ifdef _LIBC
28# include "../iconv/gconv_int.h"
29#else
30# if HAVE_ICONV
31#  include <iconv.h>
32# endif
33#endif
34
35#include "loadinfo.h"
36
37#include "gmo.h"		/* Get nls_uint32.  */
38
39/* @@ end of prolog @@ */
40
41#ifndef internal_function
42# define internal_function
43#endif
44
45#ifndef attribute_hidden
46# define attribute_hidden
47#endif
48
49/* Tell the compiler when a conditional or integer expression is
50   almost always true or almost always false.  */
51#ifndef HAVE_BUILTIN_EXPECT
52# define __builtin_expect(expr, val) (expr)
53#endif
54
55#ifndef W
56# define W(flag, data) ((flag) ? SWAP (data) : (data))
57#endif
58
59
60#ifdef _LIBC
61# include <byteswap.h>
62# define SWAP(i) bswap_32 (i)
63#else
64static inline nls_uint32
65SWAP (i)
66     nls_uint32 i;
67{
68  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
69}
70#endif
71
72
73/* In-memory representation of system dependent string.  */
74struct sysdep_string_desc
75{
76  /* Length of addressed string, including the trailing NUL.  */
77  size_t length;
78  /* Pointer to addressed string.  */
79  const char *pointer;
80};
81
82/* The representation of an opened message catalog.  */
83struct loaded_domain
84{
85  /* Pointer to memory containing the .mo file.  */
86  const char *data;
87  /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed.  */
88  int use_mmap;
89  /* Size of mmap()ed memory.  */
90  size_t mmap_size;
91  /* 1 if the .mo file uses a different endianness than this machine.  */
92  int must_swap;
93  /* Pointer to additional malloc()ed memory.  */
94  void *malloced;
95
96  /* Number of static strings pairs.  */
97  nls_uint32 nstrings;
98  /* Pointer to descriptors of original strings in the file.  */
99  const struct string_desc *orig_tab;
100  /* Pointer to descriptors of translated strings in the file.  */
101  const struct string_desc *trans_tab;
102
103  /* Number of system dependent strings pairs.  */
104  nls_uint32 n_sysdep_strings;
105  /* Pointer to descriptors of original sysdep strings.  */
106  const struct sysdep_string_desc *orig_sysdep_tab;
107  /* Pointer to descriptors of translated sysdep strings.  */
108  const struct sysdep_string_desc *trans_sysdep_tab;
109
110  /* Size of hash table.  */
111  nls_uint32 hash_size;
112  /* Pointer to hash table.  */
113  const nls_uint32 *hash_tab;
114  /* 1 if the hash table uses a different endianness than this machine.  */
115  int must_swap_hash_tab;
116
117  int codeset_cntr;
118#ifdef _LIBC
119  __gconv_t conv;
120#else
121# if HAVE_ICONV
122  iconv_t conv;
123# endif
124#endif
125  char **conv_tab;
126
127  struct expression *plural;
128  unsigned long int nplurals;
129};
130
131/* We want to allocate a string at the end of the struct.  But ISO C
132   doesn't allow zero sized arrays.  */
133#ifdef __GNUC__
134# define ZERO 0
135#else
136# define ZERO 1
137#endif
138
139/* A set of settings bound to a message domain.  Used to store settings
140   from bindtextdomain() and bind_textdomain_codeset().  */
141struct binding
142{
143  struct binding *next;
144  char *dirname;
145  int codeset_cntr;	/* Incremented each time codeset changes.  */
146  char *codeset;
147  char domainname[ZERO];
148};
149
150/* A counter which is incremented each time some previous translations
151   become invalid.
152   This variable is part of the external ABI of the GNU libintl.  */
153extern int _nl_msg_cat_cntr;
154
155#ifndef _LIBC
156const char *_nl_locale_name (int category, const char *categoryname);
157#endif
158
159struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale,
160					 const char *__domainname,
161					 struct binding *__domainbinding)
162     internal_function;
163void _nl_load_domain (struct loaded_l10nfile *__domain,
164		      struct binding *__domainbinding)
165     internal_function;
166void _nl_unload_domain (struct loaded_domain *__domain)
167     internal_function;
168const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file,
169				  struct loaded_domain *__domain,
170				  struct binding *__domainbinding)
171     internal_function;
172void _nl_free_domain_conv (struct loaded_domain *__domain)
173     internal_function;
174
175char *_nl_find_msg (struct loaded_l10nfile *domain_file,
176		    struct binding *domainbinding, const char *msgid,
177		    size_t *lengthp)
178     internal_function;
179
180#ifdef _LIBC
181extern char *__gettext (const char *__msgid);
182extern char *__dgettext (const char *__domainname, const char *__msgid);
183extern char *__dcgettext (const char *__domainname, const char *__msgid,
184			  int __category);
185extern char *__ngettext (const char *__msgid1, const char *__msgid2,
186			 unsigned long int __n);
187extern char *__dngettext (const char *__domainname,
188			  const char *__msgid1, const char *__msgid2,
189			  unsigned long int n);
190extern char *__dcngettext (const char *__domainname,
191			   const char *__msgid1, const char *__msgid2,
192			   unsigned long int __n, int __category);
193extern char *__dcigettext (const char *__domainname,
194			   const char *__msgid1, const char *__msgid2,
195			   int __plural, unsigned long int __n,
196			   int __category);
197extern char *__textdomain (const char *__domainname);
198extern char *__bindtextdomain (const char *__domainname,
199			       const char *__dirname);
200extern char *__bind_textdomain_codeset (const char *__domainname,
201					const char *__codeset);
202#else
203/* Declare the exported libintl_* functions, in a way that allows us to
204   call them under their real name.  */
205# undef _INTL_REDIRECT_INLINE
206# undef _INTL_REDIRECT_MACROS
207# define _INTL_REDIRECT_MACROS
208# include "libgnuintl.h"
209extern char *libintl_dcigettext (const char *__domainname,
210				 const char *__msgid1, const char *__msgid2,
211				 int __plural, unsigned long int __n,
212				 int __category);
213#endif
214
215/* @@ begin of epilog @@ */
216
217#endif /* gettextP.h  */
218