locale.c (42249ef234fceb55f77b43a5b8cb2bd6d4deba35) locale.c (de96322b741085aa7c7df2302b928721773196b1)
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2002, 2003 Alexey Zelkin <phantom@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 40 unchanged lines hidden (view full) ---

49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <stringlist.h>
53#include <unistd.h>
54#include "setlocale.h"
55
56/* Local prototypes */
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2002, 2003 Alexey Zelkin <phantom@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 40 unchanged lines hidden (view full) ---

49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <stringlist.h>
53#include <unistd.h>
54#include "setlocale.h"
55
56/* Local prototypes */
57char *format_grouping(const char *);
57char *format_grouping(char *);
58void init_locales_list(void);
59void list_charmaps(void);
60void list_locales(void);
61const char *lookup_localecat(int);
62char *kwval_lconv(int);
63int kwval_lookup(const char *, char **, int *, int *, int *);
64void showdetails(const char *);
65void showkeywordslist(char *substring);

--- 48 unchanged lines hidden (view full) ---

114 KW_TIME_DAY,
115 KW_TIME_ABDAY,
116 KW_TIME_MON,
117 KW_TIME_ABMON,
118 KW_TIME_AM_PM
119};
120
121enum {
58void init_locales_list(void);
59void list_charmaps(void);
60void list_locales(void);
61const char *lookup_localecat(int);
62char *kwval_lconv(int);
63int kwval_lookup(const char *, char **, int *, int *, int *);
64void showdetails(const char *);
65void showkeywordslist(char *substring);

--- 48 unchanged lines hidden (view full) ---

114 KW_TIME_DAY,
115 KW_TIME_ABDAY,
116 KW_TIME_MON,
117 KW_TIME_ABMON,
118 KW_TIME_AM_PM
119};
120
121enum {
122 TYPE_NUM,
123 TYPE_STR,
124 TYPE_UNQ
125};
126
127enum {
122 SRC_LINFO,
123 SRC_LCONV,
124 SRC_LTIME
125};
126
127static const struct _kwinfo {
128 const char *name;
128 SRC_LINFO,
129 SRC_LCONV,
130 SRC_LTIME
131};
132
133static const struct _kwinfo {
134 const char *name;
129 int isstr; /* true - string, false - number */
135 int type;
130 int catid; /* LC_* */
131 int source;
132 int value_ref;
133 const char *comment;
134} kwinfo [] = {
136 int catid; /* LC_* */
137 int source;
138 int value_ref;
139 const char *comment;
140} kwinfo [] = {
135 { "charmap", 1, LC_CTYPE, SRC_LINFO,
141 { "charmap", TYPE_STR, LC_CTYPE, SRC_LINFO,
136 CODESET, "" }, /* hack */
137
138 /* LC_MONETARY - POSIX */
142 CODESET, "" }, /* hack */
143
144 /* LC_MONETARY - POSIX */
139 { "int_curr_symbol", 1, LC_MONETARY, SRC_LCONV,
145 { "int_curr_symbol", TYPE_STR, LC_MONETARY, SRC_LCONV,
140 KW_INT_CURR_SYMBOL, "" },
146 KW_INT_CURR_SYMBOL, "" },
141 { "currency_symbol", 1, LC_MONETARY, SRC_LCONV,
147 { "currency_symbol", TYPE_STR, LC_MONETARY, SRC_LCONV,
142 KW_CURRENCY_SYMBOL, "" },
148 KW_CURRENCY_SYMBOL, "" },
143 { "mon_decimal_point", 1, LC_MONETARY, SRC_LCONV,
149 { "mon_decimal_point", TYPE_STR, LC_MONETARY, SRC_LCONV,
144 KW_MON_DECIMAL_POINT, "" },
150 KW_MON_DECIMAL_POINT, "" },
145 { "mon_thousands_sep", 1, LC_MONETARY, SRC_LCONV,
151 { "mon_thousands_sep", TYPE_STR, LC_MONETARY, SRC_LCONV,
146 KW_MON_THOUSANDS_SEP, "" },
152 KW_MON_THOUSANDS_SEP, "" },
147 { "mon_grouping", 1, LC_MONETARY, SRC_LCONV,
153 { "mon_grouping", TYPE_UNQ, LC_MONETARY, SRC_LCONV,
148 KW_MON_GROUPING, "" },
154 KW_MON_GROUPING, "" },
149 { "positive_sign", 1, LC_MONETARY, SRC_LCONV,
155 { "positive_sign", TYPE_STR, LC_MONETARY, SRC_LCONV,
150 KW_POSITIVE_SIGN, "" },
156 KW_POSITIVE_SIGN, "" },
151 { "negative_sign", 1, LC_MONETARY, SRC_LCONV,
157 { "negative_sign", TYPE_STR, LC_MONETARY, SRC_LCONV,
152 KW_NEGATIVE_SIGN, "" },
158 KW_NEGATIVE_SIGN, "" },
153 { "int_frac_digits", 0, LC_MONETARY, SRC_LCONV,
159 { "int_frac_digits", TYPE_NUM, LC_MONETARY, SRC_LCONV,
154 KW_INT_FRAC_DIGITS, "" },
160 KW_INT_FRAC_DIGITS, "" },
155 { "frac_digits", 0, LC_MONETARY, SRC_LCONV,
161 { "frac_digits", TYPE_NUM, LC_MONETARY, SRC_LCONV,
156 KW_FRAC_DIGITS, "" },
162 KW_FRAC_DIGITS, "" },
157 { "p_cs_precedes", 0, LC_MONETARY, SRC_LCONV,
163 { "p_cs_precedes", TYPE_NUM, LC_MONETARY, SRC_LCONV,
158 KW_P_CS_PRECEDES, "" },
164 KW_P_CS_PRECEDES, "" },
159 { "p_sep_by_space", 0, LC_MONETARY, SRC_LCONV,
165 { "p_sep_by_space", TYPE_NUM, LC_MONETARY, SRC_LCONV,
160 KW_P_SEP_BY_SPACE, "" },
166 KW_P_SEP_BY_SPACE, "" },
161 { "n_cs_precedes", 0, LC_MONETARY, SRC_LCONV,
167 { "n_cs_precedes", TYPE_NUM, LC_MONETARY, SRC_LCONV,
162 KW_N_CS_PRECEDES, "" },
168 KW_N_CS_PRECEDES, "" },
163 { "n_sep_by_space", 0, LC_MONETARY, SRC_LCONV,
169 { "n_sep_by_space", TYPE_NUM, LC_MONETARY, SRC_LCONV,
164 KW_N_SEP_BY_SPACE, "" },
170 KW_N_SEP_BY_SPACE, "" },
165 { "p_sign_posn", 0, LC_MONETARY, SRC_LCONV,
171 { "p_sign_posn", TYPE_NUM, LC_MONETARY, SRC_LCONV,
166 KW_P_SIGN_POSN, "" },
172 KW_P_SIGN_POSN, "" },
167 { "n_sign_posn", 0, LC_MONETARY, SRC_LCONV,
173 { "n_sign_posn", TYPE_NUM, LC_MONETARY, SRC_LCONV,
168 KW_N_SIGN_POSN, "" },
174 KW_N_SIGN_POSN, "" },
169 { "int_p_cs_precedes", 0, LC_MONETARY, SRC_LCONV,
175 { "int_p_cs_precedes", TYPE_NUM, LC_MONETARY, SRC_LCONV,
170 KW_INT_P_CS_PRECEDES, "" },
176 KW_INT_P_CS_PRECEDES, "" },
171 { "int_p_sep_by_space", 0, LC_MONETARY, SRC_LCONV,
177 { "int_p_sep_by_space", TYPE_NUM, LC_MONETARY, SRC_LCONV,
172 KW_INT_P_SEP_BY_SPACE, "" },
178 KW_INT_P_SEP_BY_SPACE, "" },
173 { "int_n_cs_precedes", 0, LC_MONETARY, SRC_LCONV,
179 { "int_n_cs_precedes", TYPE_NUM, LC_MONETARY, SRC_LCONV,
174 KW_INT_N_CS_PRECEDES, "" },
180 KW_INT_N_CS_PRECEDES, "" },
175 { "int_n_sep_by_space", 0, LC_MONETARY, SRC_LCONV,
181 { "int_n_sep_by_space", TYPE_NUM, LC_MONETARY, SRC_LCONV,
176 KW_INT_N_SEP_BY_SPACE, "" },
182 KW_INT_N_SEP_BY_SPACE, "" },
177 { "int_p_sign_posn", 0, LC_MONETARY, SRC_LCONV,
183 { "int_p_sign_posn", TYPE_NUM, LC_MONETARY, SRC_LCONV,
178 KW_INT_P_SIGN_POSN, "" },
184 KW_INT_P_SIGN_POSN, "" },
179 { "int_n_sign_posn", 0, LC_MONETARY, SRC_LCONV,
185 { "int_n_sign_posn", TYPE_NUM, LC_MONETARY, SRC_LCONV,
180 KW_INT_N_SIGN_POSN, "" },
181
182 /* LC_NUMERIC - POSIX */
186 KW_INT_N_SIGN_POSN, "" },
187
188 /* LC_NUMERIC - POSIX */
183 { "decimal_point", 1, LC_NUMERIC, SRC_LINFO,
189 { "decimal_point", TYPE_STR, LC_NUMERIC, SRC_LINFO,
184 RADIXCHAR, "" },
190 RADIXCHAR, "" },
185 { "thousands_sep", 1, LC_NUMERIC, SRC_LINFO,
191 { "thousands_sep", TYPE_STR, LC_NUMERIC, SRC_LINFO,
186 THOUSEP, "" },
192 THOUSEP, "" },
187 { "grouping", 1, LC_NUMERIC, SRC_LCONV,
193 { "grouping", TYPE_UNQ, LC_NUMERIC, SRC_LCONV,
188 KW_GROUPING, "" },
189 /* LC_NUMERIC - local additions */
194 KW_GROUPING, "" },
195 /* LC_NUMERIC - local additions */
190 { "radixchar", 1, LC_NUMERIC, SRC_LINFO,
196 { "radixchar", TYPE_STR, LC_NUMERIC, SRC_LINFO,
191 RADIXCHAR, "Same as decimal_point (FreeBSD only)" }, /* compat */
197 RADIXCHAR, "Same as decimal_point (FreeBSD only)" }, /* compat */
192 { "thousep", 1, LC_NUMERIC, SRC_LINFO,
198 { "thousep", TYPE_STR, LC_NUMERIC, SRC_LINFO,
193 THOUSEP, "Same as thousands_sep (FreeBSD only)" }, /* compat */
194
195 /* LC_TIME - POSIX */
199 THOUSEP, "Same as thousands_sep (FreeBSD only)" }, /* compat */
200
201 /* LC_TIME - POSIX */
196 { "abday", 1, LC_TIME, SRC_LTIME,
202 { "abday", TYPE_STR, LC_TIME, SRC_LTIME,
197 KW_TIME_ABDAY, "" },
203 KW_TIME_ABDAY, "" },
198 { "day", 1, LC_TIME, SRC_LTIME,
204 { "day", TYPE_STR, LC_TIME, SRC_LTIME,
199 KW_TIME_DAY, "" },
205 KW_TIME_DAY, "" },
200 { "abmon", 1, LC_TIME, SRC_LTIME,
206 { "abmon", TYPE_STR, LC_TIME, SRC_LTIME,
201 KW_TIME_ABMON, "" },
207 KW_TIME_ABMON, "" },
202 { "mon", 1, LC_TIME, SRC_LTIME,
208 { "mon", TYPE_STR, LC_TIME, SRC_LTIME,
203 KW_TIME_MON, "" },
209 KW_TIME_MON, "" },
204 { "d_t_fmt", 1, LC_TIME, SRC_LINFO,
210 { "d_t_fmt", TYPE_STR, LC_TIME, SRC_LINFO,
205 D_T_FMT, "" },
211 D_T_FMT, "" },
206 { "d_fmt", 1, LC_TIME, SRC_LINFO,
212 { "d_fmt", TYPE_STR, LC_TIME, SRC_LINFO,
207 D_FMT, "" },
213 D_FMT, "" },
208 { "t_fmt", 1, LC_TIME, SRC_LINFO,
214 { "t_fmt", TYPE_STR, LC_TIME, SRC_LINFO,
209 T_FMT, "" },
215 T_FMT, "" },
210 { "am_pm", 1, LC_TIME, SRC_LTIME,
216 { "am_pm", TYPE_STR, LC_TIME, SRC_LTIME,
211 KW_TIME_AM_PM, "" },
217 KW_TIME_AM_PM, "" },
212 { "t_fmt_ampm", 1, LC_TIME, SRC_LINFO,
218 { "t_fmt_ampm", TYPE_STR, LC_TIME, SRC_LINFO,
213 T_FMT_AMPM, "" },
219 T_FMT_AMPM, "" },
214 { "era", 1, LC_TIME, SRC_LINFO,
220 { "era", TYPE_UNQ, LC_TIME, SRC_LINFO,
215 ERA, "(unavailable)" },
221 ERA, "(unavailable)" },
216 { "era_d_fmt", 1, LC_TIME, SRC_LINFO,
222 { "era_d_fmt", TYPE_STR, LC_TIME, SRC_LINFO,
217 ERA_D_FMT, "(unavailable)" },
223 ERA_D_FMT, "(unavailable)" },
218 { "era_d_t_fmt", 1, LC_TIME, SRC_LINFO,
224 { "era_d_t_fmt", TYPE_STR, LC_TIME, SRC_LINFO,
219 ERA_D_T_FMT, "(unavailable)" },
225 ERA_D_T_FMT, "(unavailable)" },
220 { "era_t_fmt", 1, LC_TIME, SRC_LINFO,
226 { "era_t_fmt", TYPE_STR, LC_TIME, SRC_LINFO,
221 ERA_T_FMT, "(unavailable)" },
227 ERA_T_FMT, "(unavailable)" },
222 { "alt_digits", 1, LC_TIME, SRC_LINFO,
228 { "alt_digits", TYPE_UNQ, LC_TIME, SRC_LINFO,
223 ALT_DIGITS, "" },
224 /* LC_TIME - local additions */
229 ALT_DIGITS, "" },
230 /* LC_TIME - local additions */
225 { "abday_1", 1, LC_TIME, SRC_LINFO,
231 { "abday_1", TYPE_STR, LC_TIME, SRC_LINFO,
226 ABDAY_1, "(FreeBSD only)" },
232 ABDAY_1, "(FreeBSD only)" },
227 { "abday_2", 1, LC_TIME, SRC_LINFO,
233 { "abday_2", TYPE_STR, LC_TIME, SRC_LINFO,
228 ABDAY_2, "(FreeBSD only)" },
234 ABDAY_2, "(FreeBSD only)" },
229 { "abday_3", 1, LC_TIME, SRC_LINFO,
235 { "abday_3", TYPE_STR, LC_TIME, SRC_LINFO,
230 ABDAY_3, "(FreeBSD only)" },
236 ABDAY_3, "(FreeBSD only)" },
231 { "abday_4", 1, LC_TIME, SRC_LINFO,
237 { "abday_4", TYPE_STR, LC_TIME, SRC_LINFO,
232 ABDAY_4, "(FreeBSD only)" },
238 ABDAY_4, "(FreeBSD only)" },
233 { "abday_5", 1, LC_TIME, SRC_LINFO,
239 { "abday_5", TYPE_STR, LC_TIME, SRC_LINFO,
234 ABDAY_5, "(FreeBSD only)" },
240 ABDAY_5, "(FreeBSD only)" },
235 { "abday_6", 1, LC_TIME, SRC_LINFO,
241 { "abday_6", TYPE_STR, LC_TIME, SRC_LINFO,
236 ABDAY_6, "(FreeBSD only)" },
242 ABDAY_6, "(FreeBSD only)" },
237 { "abday_7", 1, LC_TIME, SRC_LINFO,
243 { "abday_7", TYPE_STR, LC_TIME, SRC_LINFO,
238 ABDAY_7, "(FreeBSD only)" },
244 ABDAY_7, "(FreeBSD only)" },
239 { "day_1", 1, LC_TIME, SRC_LINFO,
245 { "day_1", TYPE_STR, LC_TIME, SRC_LINFO,
240 DAY_1, "(FreeBSD only)" },
246 DAY_1, "(FreeBSD only)" },
241 { "day_2", 1, LC_TIME, SRC_LINFO,
247 { "day_2", TYPE_STR, LC_TIME, SRC_LINFO,
242 DAY_2, "(FreeBSD only)" },
248 DAY_2, "(FreeBSD only)" },
243 { "day_3", 1, LC_TIME, SRC_LINFO,
249 { "day_3", TYPE_STR, LC_TIME, SRC_LINFO,
244 DAY_3, "(FreeBSD only)" },
250 DAY_3, "(FreeBSD only)" },
245 { "day_4", 1, LC_TIME, SRC_LINFO,
251 { "day_4", TYPE_STR, LC_TIME, SRC_LINFO,
246 DAY_4, "(FreeBSD only)" },
252 DAY_4, "(FreeBSD only)" },
247 { "day_5", 1, LC_TIME, SRC_LINFO,
253 { "day_5", TYPE_STR, LC_TIME, SRC_LINFO,
248 DAY_5, "(FreeBSD only)" },
254 DAY_5, "(FreeBSD only)" },
249 { "day_6", 1, LC_TIME, SRC_LINFO,
255 { "day_6", TYPE_STR, LC_TIME, SRC_LINFO,
250 DAY_6, "(FreeBSD only)" },
256 DAY_6, "(FreeBSD only)" },
251 { "day_7", 1, LC_TIME, SRC_LINFO,
257 { "day_7", TYPE_STR, LC_TIME, SRC_LINFO,
252 DAY_7, "(FreeBSD only)" },
258 DAY_7, "(FreeBSD only)" },
253 { "abmon_1", 1, LC_TIME, SRC_LINFO,
259 { "abmon_1", TYPE_STR, LC_TIME, SRC_LINFO,
254 ABMON_1, "(FreeBSD only)" },
260 ABMON_1, "(FreeBSD only)" },
255 { "abmon_2", 1, LC_TIME, SRC_LINFO,
261 { "abmon_2", TYPE_STR, LC_TIME, SRC_LINFO,
256 ABMON_2, "(FreeBSD only)" },
262 ABMON_2, "(FreeBSD only)" },
257 { "abmon_3", 1, LC_TIME, SRC_LINFO,
263 { "abmon_3", TYPE_STR, LC_TIME, SRC_LINFO,
258 ABMON_3, "(FreeBSD only)" },
264 ABMON_3, "(FreeBSD only)" },
259 { "abmon_4", 1, LC_TIME, SRC_LINFO,
265 { "abmon_4", TYPE_STR, LC_TIME, SRC_LINFO,
260 ABMON_4, "(FreeBSD only)" },
266 ABMON_4, "(FreeBSD only)" },
261 { "abmon_5", 1, LC_TIME, SRC_LINFO,
267 { "abmon_5", TYPE_STR, LC_TIME, SRC_LINFO,
262 ABMON_5, "(FreeBSD only)" },
268 ABMON_5, "(FreeBSD only)" },
263 { "abmon_6", 1, LC_TIME, SRC_LINFO,
269 { "abmon_6", TYPE_STR, LC_TIME, SRC_LINFO,
264 ABMON_6, "(FreeBSD only)" },
270 ABMON_6, "(FreeBSD only)" },
265 { "abmon_7", 1, LC_TIME, SRC_LINFO,
271 { "abmon_7", TYPE_STR, LC_TIME, SRC_LINFO,
266 ABMON_7, "(FreeBSD only)" },
272 ABMON_7, "(FreeBSD only)" },
267 { "abmon_8", 1, LC_TIME, SRC_LINFO,
273 { "abmon_8", TYPE_STR, LC_TIME, SRC_LINFO,
268 ABMON_8, "(FreeBSD only)" },
274 ABMON_8, "(FreeBSD only)" },
269 { "abmon_9", 1, LC_TIME, SRC_LINFO,
275 { "abmon_9", TYPE_STR, LC_TIME, SRC_LINFO,
270 ABMON_9, "(FreeBSD only)" },
276 ABMON_9, "(FreeBSD only)" },
271 { "abmon_10", 1, LC_TIME, SRC_LINFO,
277 { "abmon_10", TYPE_STR, LC_TIME, SRC_LINFO,
272 ABMON_10, "(FreeBSD only)" },
278 ABMON_10, "(FreeBSD only)" },
273 { "abmon_11", 1, LC_TIME, SRC_LINFO,
279 { "abmon_11", TYPE_STR, LC_TIME, SRC_LINFO,
274 ABMON_11, "(FreeBSD only)" },
280 ABMON_11, "(FreeBSD only)" },
275 { "abmon_12", 1, LC_TIME, SRC_LINFO,
281 { "abmon_12", TYPE_STR, LC_TIME, SRC_LINFO,
276 ABMON_12, "(FreeBSD only)" },
282 ABMON_12, "(FreeBSD only)" },
277 { "mon_1", 1, LC_TIME, SRC_LINFO,
283 { "mon_1", TYPE_STR, LC_TIME, SRC_LINFO,
278 MON_1, "(FreeBSD only)" },
284 MON_1, "(FreeBSD only)" },
279 { "mon_2", 1, LC_TIME, SRC_LINFO,
285 { "mon_2", TYPE_STR, LC_TIME, SRC_LINFO,
280 MON_2, "(FreeBSD only)" },
286 MON_2, "(FreeBSD only)" },
281 { "mon_3", 1, LC_TIME, SRC_LINFO,
287 { "mon_3", TYPE_STR, LC_TIME, SRC_LINFO,
282 MON_3, "(FreeBSD only)" },
288 MON_3, "(FreeBSD only)" },
283 { "mon_4", 1, LC_TIME, SRC_LINFO,
289 { "mon_4", TYPE_STR, LC_TIME, SRC_LINFO,
284 MON_4, "(FreeBSD only)" },
290 MON_4, "(FreeBSD only)" },
285 { "mon_5", 1, LC_TIME, SRC_LINFO,
291 { "mon_5", TYPE_STR, LC_TIME, SRC_LINFO,
286 MON_5, "(FreeBSD only)" },
292 MON_5, "(FreeBSD only)" },
287 { "mon_6", 1, LC_TIME, SRC_LINFO,
293 { "mon_6", TYPE_STR, LC_TIME, SRC_LINFO,
288 MON_6, "(FreeBSD only)" },
294 MON_6, "(FreeBSD only)" },
289 { "mon_7", 1, LC_TIME, SRC_LINFO,
295 { "mon_7", TYPE_STR, LC_TIME, SRC_LINFO,
290 MON_7, "(FreeBSD only)" },
296 MON_7, "(FreeBSD only)" },
291 { "mon_8", 1, LC_TIME, SRC_LINFO,
297 { "mon_8", TYPE_STR, LC_TIME, SRC_LINFO,
292 MON_8, "(FreeBSD only)" },
298 MON_8, "(FreeBSD only)" },
293 { "mon_9", 1, LC_TIME, SRC_LINFO,
299 { "mon_9", TYPE_STR, LC_TIME, SRC_LINFO,
294 MON_9, "(FreeBSD only)" },
300 MON_9, "(FreeBSD only)" },
295 { "mon_10", 1, LC_TIME, SRC_LINFO,
301 { "mon_10", TYPE_STR, LC_TIME, SRC_LINFO,
296 MON_10, "(FreeBSD only)" },
302 MON_10, "(FreeBSD only)" },
297 { "mon_11", 1, LC_TIME, SRC_LINFO,
303 { "mon_11", TYPE_STR, LC_TIME, SRC_LINFO,
298 MON_11, "(FreeBSD only)" },
304 MON_11, "(FreeBSD only)" },
299 { "mon_12", 1, LC_TIME, SRC_LINFO,
305 { "mon_12", TYPE_STR, LC_TIME, SRC_LINFO,
300 MON_12, "(FreeBSD only)" },
306 MON_12, "(FreeBSD only)" },
301 { "altmon_1", 1, LC_TIME, SRC_LINFO,
307 { "altmon_1", TYPE_STR, LC_TIME, SRC_LINFO,
302 ALTMON_1, "(FreeBSD only)" },
308 ALTMON_1, "(FreeBSD only)" },
303 { "altmon_2", 1, LC_TIME, SRC_LINFO,
309 { "altmon_2", TYPE_STR, LC_TIME, SRC_LINFO,
304 ALTMON_2, "(FreeBSD only)" },
310 ALTMON_2, "(FreeBSD only)" },
305 { "altmon_3", 1, LC_TIME, SRC_LINFO,
311 { "altmon_3", TYPE_STR, LC_TIME, SRC_LINFO,
306 ALTMON_3, "(FreeBSD only)" },
312 ALTMON_3, "(FreeBSD only)" },
307 { "altmon_4", 1, LC_TIME, SRC_LINFO,
313 { "altmon_4", TYPE_STR, LC_TIME, SRC_LINFO,
308 ALTMON_4, "(FreeBSD only)" },
314 ALTMON_4, "(FreeBSD only)" },
309 { "altmon_5", 1, LC_TIME, SRC_LINFO,
315 { "altmon_5", TYPE_STR, LC_TIME, SRC_LINFO,
310 ALTMON_5, "(FreeBSD only)" },
316 ALTMON_5, "(FreeBSD only)" },
311 { "altmon_6", 1, LC_TIME, SRC_LINFO,
317 { "altmon_6", TYPE_STR, LC_TIME, SRC_LINFO,
312 ALTMON_6, "(FreeBSD only)" },
318 ALTMON_6, "(FreeBSD only)" },
313 { "altmon_7", 1, LC_TIME, SRC_LINFO,
319 { "altmon_7", TYPE_STR, LC_TIME, SRC_LINFO,
314 ALTMON_7, "(FreeBSD only)" },
320 ALTMON_7, "(FreeBSD only)" },
315 { "altmon_8", 1, LC_TIME, SRC_LINFO,
321 { "altmon_8", TYPE_STR, LC_TIME, SRC_LINFO,
316 ALTMON_8, "(FreeBSD only)" },
322 ALTMON_8, "(FreeBSD only)" },
317 { "altmon_9", 1, LC_TIME, SRC_LINFO,
323 { "altmon_9", TYPE_STR, LC_TIME, SRC_LINFO,
318 ALTMON_9, "(FreeBSD only)" },
324 ALTMON_9, "(FreeBSD only)" },
319 { "altmon_10", 1, LC_TIME, SRC_LINFO,
325 { "altmon_10", TYPE_STR, LC_TIME, SRC_LINFO,
320 ALTMON_10, "(FreeBSD only)" },
326 ALTMON_10, "(FreeBSD only)" },
321 { "altmon_11", 1, LC_TIME, SRC_LINFO,
327 { "altmon_11", TYPE_STR, LC_TIME, SRC_LINFO,
322 ALTMON_11, "(FreeBSD only)" },
328 ALTMON_11, "(FreeBSD only)" },
323 { "altmon_12", 1, LC_TIME, SRC_LINFO,
329 { "altmon_12", TYPE_STR, LC_TIME, SRC_LINFO,
324 ALTMON_12, "(FreeBSD only)" },
330 ALTMON_12, "(FreeBSD only)" },
325 { "am_str", 1, LC_TIME, SRC_LINFO,
331 { "am_str", TYPE_STR, LC_TIME, SRC_LINFO,
326 AM_STR, "(FreeBSD only)" },
332 AM_STR, "(FreeBSD only)" },
327 { "pm_str", 1, LC_TIME, SRC_LINFO,
333 { "pm_str", TYPE_STR, LC_TIME, SRC_LINFO,
328 PM_STR, "(FreeBSD only)" },
334 PM_STR, "(FreeBSD only)" },
329 { "d_md_order", 1, LC_TIME, SRC_LINFO,
335 { "d_md_order", TYPE_STR, LC_TIME, SRC_LINFO,
330 D_MD_ORDER, "(FreeBSD only)" }, /* local */
331
332 /* LC_MESSAGES - POSIX */
336 D_MD_ORDER, "(FreeBSD only)" }, /* local */
337
338 /* LC_MESSAGES - POSIX */
333 { "yesexpr", 1, LC_MESSAGES, SRC_LINFO,
339 { "yesexpr", TYPE_STR, LC_MESSAGES, SRC_LINFO,
334 YESEXPR, "" },
340 YESEXPR, "" },
335 { "noexpr", 1, LC_MESSAGES, SRC_LINFO,
341 { "noexpr", TYPE_STR, LC_MESSAGES, SRC_LINFO,
336 NOEXPR, "" },
337 /* LC_MESSAGES - local additions */
342 NOEXPR, "" },
343 /* LC_MESSAGES - local additions */
338 { "yesstr", 1, LC_MESSAGES, SRC_LINFO,
344 { "yesstr", TYPE_STR, LC_MESSAGES, SRC_LINFO,
339 YESSTR, "(POSIX legacy)" }, /* compat */
345 YESSTR, "(POSIX legacy)" }, /* compat */
340 { "nostr", 1, LC_MESSAGES, SRC_LINFO,
346 { "nostr", TYPE_STR, LC_MESSAGES, SRC_LINFO,
341 NOSTR, "(POSIX legacy)" } /* compat */
342
343};
344#define NKWINFO (nitems(kwinfo))
345
346static const char *boguslocales[] = { "UTF-8" };
347#define NBOGUS (nitems(boguslocales))
348

--- 256 unchanged lines hidden (view full) ---

605 vval = getenv("LC_ALL");
606 if (vval == NULL) {
607 vval = "";
608 }
609 printf("LC_ALL=%s\n", vval);
610}
611
612char *
347 NOSTR, "(POSIX legacy)" } /* compat */
348
349};
350#define NKWINFO (nitems(kwinfo))
351
352static const char *boguslocales[] = { "UTF-8" };
353#define NBOGUS (nitems(boguslocales))
354

--- 256 unchanged lines hidden (view full) ---

611 vval = getenv("LC_ALL");
612 if (vval == NULL) {
613 vval = "";
614 }
615 printf("LC_ALL=%s\n", vval);
616}
617
618char *
613format_grouping(const char *binary)
619format_grouping(char *binary)
614{
615 static char rval[64];
616 const char *cp;
617 size_t roff;
618 int len;
619
620{
621 static char rval[64];
622 const char *cp;
623 size_t roff;
624 int len;
625
626 /*
627 * XXX This check will need to be modified if/when localeconv() is
628 * fixed (PR172215).
629 */
630 if (*binary == CHAR_MAX)
631 return (binary);
632
620 rval[0] = '\0';
621 roff = 0;
622 for (cp = binary; *cp != '\0'; ++cp) {
623#if CHAR_MIN != 0
624 if (*cp < 0)
625 break; /* garbage input */
626#endif
627 len = snprintf(&rval[roff], sizeof(rval) - roff, "%u;", *cp);

--- 119 unchanged lines hidden (view full) ---

747 s_item = MON_1;
748 e_item = MON_12;
749 break;
750 case KW_TIME_ABMON:
751 s_item = ABMON_1;
752 e_item = ABMON_12;
753 break;
754 case KW_TIME_AM_PM:
633 rval[0] = '\0';
634 roff = 0;
635 for (cp = binary; *cp != '\0'; ++cp) {
636#if CHAR_MIN != 0
637 if (*cp < 0)
638 break; /* garbage input */
639#endif
640 len = snprintf(&rval[roff], sizeof(rval) - roff, "%u;", *cp);

--- 119 unchanged lines hidden (view full) ---

760 s_item = MON_1;
761 e_item = MON_12;
762 break;
763 case KW_TIME_ABMON:
764 s_item = ABMON_1;
765 e_item = ABMON_12;
766 break;
767 case KW_TIME_AM_PM:
755 if (asprintf(&rval, "%s\";\"%s",
768 if (asprintf(&rval, "%s;%s",
756 nl_langinfo(AM_STR),
757 nl_langinfo(PM_STR)) == -1)
758 err(1, "asprintf");
759 return (rval);
760 }
761
762 kwsbuf = sbuf_new_auto();
763 if (kwsbuf == NULL)
764 err(1, "sbuf");
765 for (i = s_item; i <= e_item; i++) {
769 nl_langinfo(AM_STR),
770 nl_langinfo(PM_STR)) == -1)
771 err(1, "asprintf");
772 return (rval);
773 }
774
775 kwsbuf = sbuf_new_auto();
776 if (kwsbuf == NULL)
777 err(1, "sbuf");
778 for (i = s_item; i <= e_item; i++) {
766 if (i != s_item)
767 (void) sbuf_cat(kwsbuf, "\"");
768 (void) sbuf_cat(kwsbuf, nl_langinfo(i));
769 if (i != e_item)
779 (void) sbuf_cat(kwsbuf, nl_langinfo(i));
780 if (i != e_item)
770 (void) sbuf_cat(kwsbuf, "\";");
781 (void) sbuf_cat(kwsbuf, ";");
771 }
772 (void) sbuf_finish(kwsbuf);
773 rval = strdup(sbuf_data(kwsbuf));
774 if (rval == NULL)
775 err(1, "strdup");
776 sbuf_delete(kwsbuf);
777 return (rval);
778}
779
780/*
781 * keyword value and properties lookup
782 */
783int
782 }
783 (void) sbuf_finish(kwsbuf);
784 rval = strdup(sbuf_data(kwsbuf));
785 if (rval == NULL)
786 err(1, "strdup");
787 sbuf_delete(kwsbuf);
788 return (rval);
789}
790
791/*
792 * keyword value and properties lookup
793 */
794int
784kwval_lookup(const char *kwname, char **kwval, int *cat, int *isstr, int *alloc)
795kwval_lookup(const char *kwname, char **kwval, int *cat, int *type, int *alloc)
785{
786 int rval;
787 size_t i;
796{
797 int rval;
798 size_t i;
799 static char nastr[3] = "-1";
788
789 rval = 0;
790 *alloc = 0;
791 for (i = 0; i < NKWINFO; i++) {
792 if (strcasecmp(kwname, kwinfo[i].name) == 0) {
793 rval = 1;
794 *cat = kwinfo[i].catid;
800
801 rval = 0;
802 *alloc = 0;
803 for (i = 0; i < NKWINFO; i++) {
804 if (strcasecmp(kwname, kwinfo[i].name) == 0) {
805 rval = 1;
806 *cat = kwinfo[i].catid;
795 *isstr = kwinfo[i].isstr;
807 *type = kwinfo[i].type;
796 switch (kwinfo[i].source) {
797 case SRC_LINFO:
798 *kwval = nl_langinfo(kwinfo[i].value_ref);
799 break;
800 case SRC_LCONV:
801 *kwval = kwval_lconv(kwinfo[i].value_ref);
808 switch (kwinfo[i].source) {
809 case SRC_LINFO:
810 *kwval = nl_langinfo(kwinfo[i].value_ref);
811 break;
812 case SRC_LCONV:
813 *kwval = kwval_lconv(kwinfo[i].value_ref);
814 /*
815 * XXX This check will need to be modified
816 * if/when localeconv() is fixed (PR172215).
817 */
818 if (**kwval == CHAR_MAX) {
819 if (*type == TYPE_NUM)
820 *type = TYPE_UNQ;
821 *kwval = nastr;
822 }
802 break;
803 case SRC_LTIME:
804 *kwval = kwval_ltime(kwinfo[i].value_ref);
805 *alloc = 1;
806 break;
807 }
808 break;
809 }

--- 4 unchanged lines hidden (view full) ---

814
815/*
816 * Show details about requested keyword according to '-k' and/or '-c'
817 * command line options specified.
818 */
819void
820showdetails(const char *kw)
821{
823 break;
824 case SRC_LTIME:
825 *kwval = kwval_ltime(kwinfo[i].value_ref);
826 *alloc = 1;
827 break;
828 }
829 break;
830 }

--- 4 unchanged lines hidden (view full) ---

835
836/*
837 * Show details about requested keyword according to '-k' and/or '-c'
838 * command line options specified.
839 */
840void
841showdetails(const char *kw)
842{
822 int isstr, cat, tmpval, alloc;
843 int type, cat, tmpval, alloc;
823 char *kwval;
824
844 char *kwval;
845
825 if (kwval_lookup(kw, &kwval, &cat, &isstr, &alloc) == 0) {
846 if (kwval_lookup(kw, &kwval, &cat, &type, &alloc) == 0) {
826 /*
827 * invalid keyword specified.
828 * XXX: any actions?
829 */
830 fprintf(stderr, "Unknown keyword: `%s'\n", kw);
831 return;
832 }
833
834 if (prt_categories) {
835 if (prt_keywords)
836 printf("%-20s ", lookup_localecat(cat));
837 else
838 printf("%-20s\t%s\n", kw, lookup_localecat(cat));
839 }
840
841 if (prt_keywords) {
847 /*
848 * invalid keyword specified.
849 * XXX: any actions?
850 */
851 fprintf(stderr, "Unknown keyword: `%s'\n", kw);
852 return;
853 }
854
855 if (prt_categories) {
856 if (prt_keywords)
857 printf("%-20s ", lookup_localecat(cat));
858 else
859 printf("%-20s\t%s\n", kw, lookup_localecat(cat));
860 }
861
862 if (prt_keywords) {
842 if (isstr) {
843 printf("%s=\"%s\"\n", kw, kwval);
844 } else {
845 tmpval = (char) *kwval;
863 switch (type) {
864 case TYPE_NUM:
865 tmpval = (char)*kwval;
846 printf("%s=%d\n", kw, tmpval);
866 printf("%s=%d\n", kw, tmpval);
867 break;
868 case TYPE_STR:
869 printf("%s=\"%s\"\n", kw, kwval);
870 break;
871 case TYPE_UNQ:
872 printf("%s=%s\n", kw, kwval);
873 break;
847 }
848 }
849
850 if (!prt_categories && !prt_keywords) {
874 }
875 }
876
877 if (!prt_categories && !prt_keywords) {
851 if (isstr) {
852 printf("%s\n", kwval);
853 } else {
854 tmpval = (char) *kwval;
878 switch (type) {
879 case TYPE_NUM:
880 tmpval = (char)*kwval;
855 printf("%d\n", tmpval);
881 printf("%d\n", tmpval);
882 break;
883 case TYPE_STR:
884 case TYPE_UNQ:
885 printf("%s\n", kwval);
886 break;
856 }
857 }
858
859 if (alloc)
860 free(kwval);
861}
862
863/*

--- 32 unchanged lines hidden (view full) ---

896 if (substring != NULL) {
897 if (strncmp(kwinfo[i].name, substring,
898 strlen(substring)) != 0)
899 continue;
900 }
901 printf(FMT,
902 kwinfo[i].name,
903 lookup_localecat(kwinfo[i].catid),
887 }
888 }
889
890 if (alloc)
891 free(kwval);
892}
893
894/*

--- 32 unchanged lines hidden (view full) ---

927 if (substring != NULL) {
928 if (strncmp(kwinfo[i].name, substring,
929 strlen(substring)) != 0)
930 continue;
931 }
932 printf(FMT,
933 kwinfo[i].name,
934 lookup_localecat(kwinfo[i].catid),
904 (kwinfo[i].isstr == 0) ? "number" : "string",
935 (kwinfo[i].type == TYPE_NUM) ? "number" : "string",
905 kwinfo[i].comment);
906 }
907}
936 kwinfo[i].comment);
937 }
938}