(WITH_CUR_LOCALE): Define.
[kopensolaris-gnu/glibc.git] / locale / programs / localedef.h
1 /* General definitions for localedef(1).
2    Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 #ifndef _LOCALEDEF_H
22 #define _LOCALEDEF_H    1
23
24 /* Get the basic locale definitions.  */
25 #include <locale.h>
26 #include <stddef.h>
27 #include <errno.h>
28
29 #include "repertoire.h"
30
31
32 /* We need a bitmask for the locales.  */
33 enum
34 {
35   CTYPE_LOCALE = 1 << LC_CTYPE,
36   NUMERIC_LOCALE = 1 << LC_NUMERIC,
37   TIME_LOCALE = 1 << LC_TIME,
38   COLLATE_LOCALE = 1 << LC_COLLATE,
39   MONETARY_LOCALE = 1 << LC_MONETARY,
40   MESSAGES_LOCALE = 1 << LC_MESSAGES,
41   PAPER_LOCALE = 1 << LC_PAPER,
42   NAME_LOCALE = 1 << LC_NAME,
43   ADDRESS_LOCALE = 1 << LC_ADDRESS,
44   TELEPHONE_LOCALE = 1 << LC_TELEPHONE,
45   MEASUREMENT_LOCALE = 1 << LC_MEASUREMENT,
46   IDENTIFICATION_LOCALE = 1 << LC_IDENTIFICATION,
47   ALL_LOCALES = (1 << LC_CTYPE
48                  | 1 << LC_NUMERIC
49                  | 1 << LC_TIME
50                  | 1 << LC_COLLATE
51                  | 1 << LC_MONETARY
52                  | 1 << LC_MESSAGES
53                  | 1 << LC_PAPER
54                  | 1 << LC_NAME
55                  | 1 << LC_ADDRESS
56                  | 1 << LC_TELEPHONE
57                  | 1 << LC_MEASUREMENT
58                  | 1 << LC_IDENTIFICATION)
59 };
60
61
62 /* Opaque types for the different locales.  */
63 struct locale_ctype_t;
64 struct locale_collate_t;
65 struct locale_monetary_t;
66 struct locale_numeric_t;
67 struct locale_time_t;
68 struct locale_messages_t;
69 struct locale_paper_t;
70 struct locale_name_t;
71 struct locale_address_t;
72 struct locale_telephone_t;
73 struct locale_measurement_t;
74 struct locale_identification_t;
75
76
77 /* Definitions for the locale.  */
78 struct localedef_t
79 {
80   struct localedef_t *next;
81
82   const char *name;
83
84   int needed;
85   int avail;
86
87   union
88   {
89     void *generic;
90     struct locale_ctype_t *ctype;
91     struct locale_collate_t *collate;
92     struct locale_monetary_t *monetary;
93     struct locale_numeric_t *numeric;
94     struct locale_time_t *time;
95     struct locale_messages_t *messages;
96     struct locale_paper_t *paper;
97     struct locale_name_t *name;
98     struct locale_address_t *address;
99     struct locale_telephone_t *telephone;
100     struct locale_measurement_t *measurement;
101     struct locale_identification_t *identification;
102   } categories[__LC_LAST];
103
104   size_t len[__LC_LAST];
105
106   const char *copy_name[__LC_LAST];
107
108   const char *repertoire_name;
109 };
110
111
112 /* Global variables of the localedef program.  */
113 extern int verbose;
114 extern int be_quiet;
115 extern int oldstyle_tables;
116 extern const char *repertoire_global;
117
118
119 /* Prototypes for a few program-wide used functions.  */
120 extern void *xmalloc (size_t __n);
121 extern void *xcalloc (size_t __n, size_t __size);
122 extern void *xrealloc (void *__p, size_t __n);
123 extern char *xstrdup (const char *__str);
124
125
126 /* Wrapper to switch LC_CTYPE back to the locale specified in the
127    environment for output.  */
128 #define WITH_CUR_LOCALE(stmt)                                   \
129   do {                                                          \
130       int saved_errno = errno;                                  \
131       const char *cur_locale_ = setlocale (LC_CTYPE, NULL);     \
132       setlocale (LC_CTYPE, "");                                 \
133       errno = saved_errno;                                      \
134       stmt;                                                     \
135       setlocale (LC_CTYPE, cur_locale_);                        \
136   } while (0)
137
138
139 /* Mark given locale as to be read.  */
140 extern struct localedef_t *add_to_readlist (int locale, const char *name,
141                                             const char *repertoire_name,
142                                             int generate,
143                                             struct localedef_t *copy_locale);
144
145 /* Find the information for the locale NAME.  */
146 extern struct localedef_t *find_locale (int locale, const char *name,
147                                         const char *repertoire_name,
148                                         const struct charmap_t *charmap);
149
150 /* Load (if necessary) the information for the locale NAME.  */
151 extern struct localedef_t *load_locale (int locale, const char *name,
152                                         const char *repertoire_name,
153                                         const struct charmap_t *charmap,
154                                         struct localedef_t *copy_locale);
155
156 #endif /* localedef.h */