Update copyright notices with scripts/update-copyrights.
[jlayton/glibc.git] / locale / programs / localedef.h
1 /* General definitions for localedef(1).
2    Copyright (C) 1998-2013 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    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published
8    by the Free Software Foundation; version 2 of the License, or
9    (at your option) any later version.
10
11    This program 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
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, see <http://www.gnu.org/licenses/>.  */
18
19 #ifndef _LOCALEDEF_H
20 #define _LOCALEDEF_H    1
21
22 /* Get the basic locale definitions.  */
23 #include <errno.h>
24 #include <locale.h>
25 #include <stdbool.h>
26 #include <stddef.h>
27
28 #include "repertoire.h"
29 #include "../locarchive.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 extern int max_locarchive_open_retry;
118 extern bool no_archive;
119 extern const char *alias_file;
120
121
122 /* Prototypes for a few program-wide used functions.  */
123 extern void *xmalloc (size_t n)
124   __attribute_malloc__ __attribute_alloc_size (1);
125 extern void *xcalloc (size_t n, size_t s)
126   __attribute_malloc__ __attribute_alloc_size (1, 2);
127 extern void *xrealloc (void *o, size_t n)
128   __attribute_malloc__ __attribute_alloc_size (2);
129 extern char *xstrdup (const char *) __attribute_malloc__;
130
131
132 /* Wrapper to switch LC_CTYPE back to the locale specified in the
133    environment for output.  */
134 #define WITH_CUR_LOCALE(stmt)                                   \
135   do {                                                          \
136       int saved_errno = errno;                                  \
137       const char *cur_locale_ = setlocale (LC_CTYPE, NULL);     \
138       setlocale (LC_CTYPE, "");                                 \
139       errno = saved_errno;                                      \
140       stmt;                                                     \
141       setlocale (LC_CTYPE, cur_locale_);                        \
142   } while (0)
143
144
145 /* Mark given locale as to be read.  */
146 extern struct localedef_t *add_to_readlist (int locale, const char *name,
147                                             const char *repertoire_name,
148                                             int generate,
149                                             struct localedef_t *copy_locale);
150
151 /* Find the information for the locale NAME.  */
152 extern struct localedef_t *find_locale (int locale, const char *name,
153                                         const char *repertoire_name,
154                                         const struct charmap_t *charmap);
155
156 /* Load (if necessary) the information for the locale NAME.  */
157 extern struct localedef_t *load_locale (int locale, const char *name,
158                                         const char *repertoire_name,
159                                         const struct charmap_t *charmap,
160                                         struct localedef_t *copy_locale);
161
162
163 /* Open the locale archive.  */
164 extern void open_archive (struct locarhandle *ah, bool readonly);
165
166 /* Close the locale archive.  */
167 extern void close_archive (struct locarhandle *ah);
168
169 /* Add given locale data to the archive.  */
170 extern int add_locale_to_archive (struct locarhandle *ah, const char *name,
171                                   locale_data_t data, bool replace);
172
173 /* Add content of named directories to locale archive.  */
174 extern int add_locales_to_archive (size_t nlist, char *list[], bool replace);
175
176 /* Removed named locales from archive.  */
177 extern int delete_locales_from_archive (size_t nlist, char *list[]);
178
179 /* List content of locale archive.  */
180 extern void show_archive_content (int verbose) __attribute__ ((noreturn));
181
182 #endif /* localedef.h */