summaryrefslogtreecommitdiff
path: root/locale/localedef.h
blob: 5958a9c5d218c28d4dd8adacb8afb1fe738129d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/* Copyright (C) 1995 Free Software Foundation, Inc.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB.  If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.  */

#ifndef _LOCALEDEF_H
#define _LOCALEDEF_H 1

#define __need_wchar_t
#include <stddef.h>

#include "config.h"

#include "hash.h"


/* Needed always.  */
#define MAX(a, b) ({typeof (a) _a = (a); typeof (b) _b = (b);               \
                    _a > _b ? _a : _b; })
#define MIN(a, b) ({typeof (a) _a = (a); typeof (b) _b = (b);               \
                    _a < _b ? _a : _b; })

/* Determine number of elements in ARR.  */
#define NELEMS(arr) ((sizeof (arr)) / (sizeof (arr[0])))

/* I simply love these GCC features ... :) */
#define NO_PAREN(arg, rest...) arg, ##rest


/* The character set used in the locale is defined in a character map file.
   The information of the file is stored in the following struct.  */
struct charmap
  {
    char *filename;
    char *codeset_name;
    int mb_cur_min;
    int mb_cur_max;
    char escape_char;
    char comment_char;
    hash_table table;
    int hash_size;
    int hash_layers;
  };

/* Data structure for representing charmap database.  */
extern struct charmap charmap_data;


/* We can map the types of the entries into four categories.  */
enum value_type { none, string, stringarray, byte, bytearray, integer };

/* Definition of the data structure which represents a category and its
   items.  */
struct category
{
  int cat_id;
  const char *name;
  size_t number;
  struct cat_item
  {
    int item_id;
    const char *name;
    enum { std, opt } status;
    enum value_type value_type;
    int min;
    int max;
  } *item_desc;
  char **item_value;
  void (*infct)(int);
  void (*checkfct)(void);
  int (*outfct)(void);
  int filled;
  char *copy_locale;
};

/* This a the structure which contains all information about all
   categories.  */
extern struct category category[];


/* The function used to load the contents of a charmap file into the
   the global variable `charmap_data'.  */
void charmap_read (const char *filename);

/* Find a character constant given by its name in the hash table.  */
static inline wchar_t find_char (const char *name, size_t len)
{
  wchar_t retval;
  if (find_entry (&charmap_data.table, name, len, (void **) &retval) != 0)
    return retval;
  else
    return -1;
}

/* Path to the directory the output files are written in.  */
extern char *output_path;

/* If this is defined be POSIX conform.  */
extern int posix_conformance;

/* If not zero give a lot more messages.  */
extern int verbose;

/* This structure contains all informations about the status of of
   reading the locale definition file.  */
struct locfile_data
  {
    const char *filename;
    char escape_char;
    char comment_char;
    size_t bufsize;
    char *buf;
    char *strbuf;
    size_t buf_ptr;
    int continue_line;
    size_t returned_tokens;
    size_t line_no;
  };

/* The status variable.  */
extern struct locfile_data locfile_data;

/* Open the locale definition file.  */
void locfile_open (const char *fname);

/* Return the next token from the locale definition file.  */
int locfile_lex (char **token, int *token_len);
/* Dito, but check for EOF.  */
int xlocfile_lex (char **token, int *token_len);

/* Ignore the rest of the line.  First TOKEN given if != 0.  Warn about
   anything other than end of line if WARN_FLAG nonzero.  */
void ignore_to_eol (int token, int warn_flag);

/* Code a character with UTF-8 if the character map has multi-byte
   characters.  */
int char_to_utf (char *buf, int char_val);


/* Read the locale defintion file FNAME and fill the appropriate
   data structures.  */
void locfile_read (const char *fname);

/* Check categories for consistency.  */
void categories_check (void);

/* Write out the binary representation of the category data.  */
void categories_write (void);


/* Treat reading the LC_COLLATE definition.  */
void collate_input (int token);

/* Treat reading the LC_CTYPE definition.  */
void ctype_input (int token);
void ctype_check (void);
int ctype_output (void);

/* Treat reading the LC_MONETARY definition.  */
void monetary_check (void);

/* Treat reading the LC_MESSAGES definition.  */
void messages_check (void);

/* Treat reading the LC_NUMERIC definition.  */
void numeric_check (void);


/* Print an error message, possibly with NLS.  */
void error (int status, int errnum, const char *format, ...)
     __attribute__ ((format (printf, 3, 4)));

/* Library functions.  */
void *xmalloc (size_t n);
void *xcalloc (size_t n, size_t s);
void *xrealloc (void *p, size_t n);

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:2
 * End:
 */
#endif /* _LOCALEDEF_H */