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} |