|
1 // langinfo.c - parameter interface to langinfo via curses |
|
2 // |
|
3 // © Portions Copyright (c) Symbian Software Ltd 2007. All rights reserved. |
|
4 // |
|
5 /* |
|
6 * This file is part of zsh, the Z shell. |
|
7 * |
|
8 * Copyright (c) 2002 Peter Stephenson, Clint Adams |
|
9 * All rights reserved. |
|
10 * |
|
11 * Permission is hereby granted, without written agreement and without |
|
12 * license or royalty fees, to use, copy, modify, and distribute this |
|
13 * software and to distribute modified versions of this software for any |
|
14 * purpose, provided that the above copyright notice and the following |
|
15 * two paragraphs appear in all copies of this software. |
|
16 * |
|
17 * In no event shall Peter Stephenson, Clint Adams or the Zsh Development Group |
|
18 * be liable to any party for direct, indirect, special, incidental, or |
|
19 * consequential damages arising out of the use of this software and its |
|
20 * documentation, even if Sven Wishnowsky, Clint Adams and the Zsh |
|
21 * Development Group have been advised of the possibility of such damage. |
|
22 * |
|
23 * Peter Stephenson, Clint Adams and the Zsh Development Group specifically |
|
24 * disclaim any warranties, including, but not limited to, the implied |
|
25 * warranties of merchantability and fitness for a particular purpose. |
|
26 * The software provided hereunder is on an "as is" basis, and Peter |
|
27 * Stephenson, Clint Adams and the Zsh Development Group have no obligation |
|
28 * to provide maintenance, support, updates, enhancements, or modifications. |
|
29 * |
|
30 */ |
|
31 #include "langinfo.mdh" |
|
32 #include "langinfo.pro" |
|
33 |
|
34 static char langinfo_nam[] = "langinfo"; |
|
35 |
|
36 #ifdef HAVE_LANGINFO_H |
|
37 # include <langinfo.h> |
|
38 #endif |
|
39 |
|
40 #ifdef __SYMBIAN32__ |
|
41 #ifdef __WINSCW__ |
|
42 #pragma warn_unusedarg off |
|
43 #endif//__WINSCW__ |
|
44 #endif//__SYMBIAN32__ |
|
45 |
|
46 static Param langinfo_pm; |
|
47 |
|
48 /**/ |
|
49 #ifdef HAVE_NL_LANGINFO |
|
50 |
|
51 static char *nl_names[] = { |
|
52 #ifdef CODESET |
|
53 "CODESET", |
|
54 #endif /* CODESET */ |
|
55 #ifdef D_T_FMT |
|
56 "D_T_FMT", |
|
57 #endif /* D_T_FMT */ |
|
58 #ifdef D_FMT |
|
59 "D_FMT", |
|
60 #endif /* D_FMT */ |
|
61 #ifdef T_FMT |
|
62 "T_FMT", |
|
63 #endif /* T_FMT */ |
|
64 #ifdef RADIXCHAR |
|
65 "RADIXCHAR", |
|
66 #endif /* RADIXCHAR */ |
|
67 #ifdef THOUSEP |
|
68 "THOUSEP", |
|
69 #endif /* THOUSEP */ |
|
70 #ifdef YESEXPR |
|
71 "YESEXPR", |
|
72 #endif /* YESEXPR */ |
|
73 #ifdef NOEXPR |
|
74 "NOEXPR", |
|
75 #endif /* NOEXPR */ |
|
76 #ifdef CRNCYSTR |
|
77 "CRNCYSTR", |
|
78 #endif /* CRNCYSTR */ |
|
79 #ifdef ABDAY_1 |
|
80 "ABDAY_1", |
|
81 #endif /* ABDAY_1 */ |
|
82 #ifdef ABDAY_2 |
|
83 "ABDAY_2", |
|
84 #endif /* ABDAY_2 */ |
|
85 #ifdef ABDAY_3 |
|
86 "ABDAY_3", |
|
87 #endif /* ABDAY_3 */ |
|
88 #ifdef ABDAY_4 |
|
89 "ABDAY_4", |
|
90 #endif /* ABDAY_4 */ |
|
91 #ifdef ABDAY_5 |
|
92 "ABDAY_5", |
|
93 #endif /* ABDAY_5 */ |
|
94 #ifdef ABDAY_6 |
|
95 "ABDAY_6", |
|
96 #endif /* ABDAY_6 */ |
|
97 #ifdef ABDAY_7 |
|
98 "ABDAY_7", |
|
99 #endif /* ABDAY_7 */ |
|
100 #ifdef DAY_1 |
|
101 "DAY_1", |
|
102 #endif /* DAY_1 */ |
|
103 #ifdef DAY_2 |
|
104 "DAY_2", |
|
105 #endif /* DAY_2 */ |
|
106 #ifdef DAY_3 |
|
107 "DAY_3", |
|
108 #endif /* DAY_3 */ |
|
109 #ifdef DAY_4 |
|
110 "DAY_4", |
|
111 #endif /* DAY_4 */ |
|
112 #ifdef DAY_5 |
|
113 "DAY_5", |
|
114 #endif /* DAY_5 */ |
|
115 #ifdef DAY_6 |
|
116 "DAY_6", |
|
117 #endif /* DAY_6 */ |
|
118 #ifdef DAY_7 |
|
119 "DAY_7", |
|
120 #endif /* DAY_7 */ |
|
121 #ifdef ABMON_1 |
|
122 "ABMON_1", |
|
123 #endif /* ABMON_1 */ |
|
124 #ifdef ABMON_2 |
|
125 "ABMON_2", |
|
126 #endif /* ABMON_2 */ |
|
127 #ifdef ABMON_3 |
|
128 "ABMON_3", |
|
129 #endif /* ABMON_3 */ |
|
130 #ifdef ABMON_4 |
|
131 "ABMON_4", |
|
132 #endif /* ABMON_4 */ |
|
133 #ifdef ABMON_5 |
|
134 "ABMON_5", |
|
135 #endif /* ABMON_5 */ |
|
136 #ifdef ABMON_6 |
|
137 "ABMON_6", |
|
138 #endif /* ABMON_6 */ |
|
139 #ifdef ABMON_7 |
|
140 "ABMON_7", |
|
141 #endif /* ABMON_7 */ |
|
142 #ifdef ABMON_8 |
|
143 "ABMON_8", |
|
144 #endif /* ABMON_8 */ |
|
145 #ifdef ABMON_9 |
|
146 "ABMON_9", |
|
147 #endif /* ABMON_9 */ |
|
148 #ifdef ABMON_10 |
|
149 "ABMON_10", |
|
150 #endif /* ABMON_10 */ |
|
151 #ifdef ABMON_11 |
|
152 "ABMON_11", |
|
153 #endif /* ABMON_11 */ |
|
154 #ifdef ABMON_12 |
|
155 "ABMON_12", |
|
156 #endif /* ABMON_12 */ |
|
157 #ifdef MON_1 |
|
158 "MON_1", |
|
159 #endif /* MON_1 */ |
|
160 #ifdef MON_2 |
|
161 "MON_2", |
|
162 #endif /* MON_2 */ |
|
163 #ifdef MON_3 |
|
164 "MON_3", |
|
165 #endif /* MON_3 */ |
|
166 #ifdef MON_4 |
|
167 "MON_4", |
|
168 #endif /* MON_4 */ |
|
169 #ifdef MON_5 |
|
170 "MON_5", |
|
171 #endif /* MON_5 */ |
|
172 #ifdef MON_6 |
|
173 "MON_6", |
|
174 #endif /* MON_6 */ |
|
175 #ifdef MON_7 |
|
176 "MON_7", |
|
177 #endif /* MON_7 */ |
|
178 #ifdef MON_8 |
|
179 "MON_8", |
|
180 #endif /* MON_8 */ |
|
181 #ifdef MON_9 |
|
182 "MON_9", |
|
183 #endif /* MON_9 */ |
|
184 #ifdef MON_10 |
|
185 "MON_10", |
|
186 #endif /* MON_10 */ |
|
187 #ifdef MON_11 |
|
188 "MON_11", |
|
189 #endif /* MON_11 */ |
|
190 #ifdef MON_12 |
|
191 "MON_12", |
|
192 #endif /* MON_12 */ |
|
193 #ifdef T_FMT_AMPM |
|
194 "T_FMT_AMPM", |
|
195 #endif /* T_FMT_AMPM */ |
|
196 #ifdef AM_STR |
|
197 "AM_STR", |
|
198 #endif /* AM_STR */ |
|
199 #ifdef PM_STR |
|
200 "PM_STR", |
|
201 #endif /* PM_STR */ |
|
202 #ifdef ERA |
|
203 "ERA", |
|
204 #endif /* ERA */ |
|
205 #ifdef ERA_D_FMT |
|
206 "ERA_D_FMT", |
|
207 #endif /* ERA_D_FMT */ |
|
208 #ifdef ERA_D_T_FMT |
|
209 "ERA_D_T_FMT", |
|
210 #endif /* ERA_D_T_FMT */ |
|
211 #ifdef ERA_T_FMT |
|
212 "ERA_T_FMT", |
|
213 #endif /* ERA_T_FMT */ |
|
214 #ifdef ALT_DIGITS |
|
215 "ALT_DIGITS", |
|
216 #endif /* ALT_DIGITS */ |
|
217 NULL |
|
218 }; |
|
219 |
|
220 static nl_item nl_vals[] = { |
|
221 #ifdef CODESET |
|
222 CODESET, |
|
223 #endif /* CODESET */ |
|
224 #ifdef D_T_FMT |
|
225 D_T_FMT, |
|
226 #endif /* D_T_FMT */ |
|
227 #ifdef D_FMT |
|
228 D_FMT, |
|
229 #endif /* D_FMT */ |
|
230 #ifdef T_FMT |
|
231 T_FMT, |
|
232 #endif /* T_FMT */ |
|
233 #ifdef RADIXCHAR |
|
234 RADIXCHAR, |
|
235 #endif /* RADIXCHAR */ |
|
236 #ifdef THOUSEP |
|
237 THOUSEP, |
|
238 #endif /* THOUSEP */ |
|
239 #ifdef YESEXPR |
|
240 YESEXPR, |
|
241 #endif /* YESEXPR */ |
|
242 #ifdef NOEXPR |
|
243 NOEXPR, |
|
244 #endif /* NOEXPR */ |
|
245 #ifdef CRNCYSTR |
|
246 CRNCYSTR, |
|
247 #endif /* CRNCYSTR */ |
|
248 #ifdef ABDAY_1 |
|
249 ABDAY_1, |
|
250 #endif /* ABDAY_1 */ |
|
251 #ifdef ABDAY_2 |
|
252 ABDAY_2, |
|
253 #endif /* ABDAY_2 */ |
|
254 #ifdef ABDAY_3 |
|
255 ABDAY_3, |
|
256 #endif /* ABDAY_3 */ |
|
257 #ifdef ABDAY_4 |
|
258 ABDAY_4, |
|
259 #endif /* ABDAY_4 */ |
|
260 #ifdef ABDAY_5 |
|
261 ABDAY_5, |
|
262 #endif /* ABDAY_5 */ |
|
263 #ifdef ABDAY_6 |
|
264 ABDAY_6, |
|
265 #endif /* ABDAY_6 */ |
|
266 #ifdef ABDAY_7 |
|
267 ABDAY_7, |
|
268 #endif /* ABDAY_7 */ |
|
269 #ifdef DAY_1 |
|
270 DAY_1, |
|
271 #endif /* DAY_1 */ |
|
272 #ifdef DAY_2 |
|
273 DAY_2, |
|
274 #endif /* DAY_2 */ |
|
275 #ifdef DAY_3 |
|
276 DAY_3, |
|
277 #endif /* DAY_3 */ |
|
278 #ifdef DAY_4 |
|
279 DAY_4, |
|
280 #endif /* DAY_4 */ |
|
281 #ifdef DAY_5 |
|
282 DAY_5, |
|
283 #endif /* DAY_5 */ |
|
284 #ifdef DAY_6 |
|
285 DAY_6, |
|
286 #endif /* DAY_6 */ |
|
287 #ifdef DAY_7 |
|
288 DAY_7, |
|
289 #endif /* DAY_7 */ |
|
290 #ifdef ABMON_1 |
|
291 ABMON_1, |
|
292 #endif /* ABMON_1 */ |
|
293 #ifdef ABMON_2 |
|
294 ABMON_2, |
|
295 #endif /* ABMON_2 */ |
|
296 #ifdef ABMON_3 |
|
297 ABMON_3, |
|
298 #endif /* ABMON_3 */ |
|
299 #ifdef ABMON_4 |
|
300 ABMON_4, |
|
301 #endif /* ABMON_4 */ |
|
302 #ifdef ABMON_5 |
|
303 ABMON_5, |
|
304 #endif /* ABMON_5 */ |
|
305 #ifdef ABMON_6 |
|
306 ABMON_6, |
|
307 #endif /* ABMON_6 */ |
|
308 #ifdef ABMON_7 |
|
309 ABMON_7, |
|
310 #endif /* ABMON_7 */ |
|
311 #ifdef ABMON_8 |
|
312 ABMON_8, |
|
313 #endif /* ABMON_8 */ |
|
314 #ifdef ABMON_9 |
|
315 ABMON_9, |
|
316 #endif /* ABMON_9 */ |
|
317 #ifdef ABMON_10 |
|
318 ABMON_10, |
|
319 #endif /* ABMON_10 */ |
|
320 #ifdef ABMON_11 |
|
321 ABMON_11, |
|
322 #endif /* ABMON_11 */ |
|
323 #ifdef ABMON_12 |
|
324 ABMON_12, |
|
325 #endif /* ABMON_12 */ |
|
326 #ifdef MON_1 |
|
327 MON_1, |
|
328 #endif /* MON_1 */ |
|
329 #ifdef MON_2 |
|
330 MON_2, |
|
331 #endif /* MON_2 */ |
|
332 #ifdef MON_3 |
|
333 MON_3, |
|
334 #endif /* MON_3 */ |
|
335 #ifdef MON_4 |
|
336 MON_4, |
|
337 #endif /* MON_4 */ |
|
338 #ifdef MON_5 |
|
339 MON_5, |
|
340 #endif /* MON_5 */ |
|
341 #ifdef MON_6 |
|
342 MON_6, |
|
343 #endif /* MON_6 */ |
|
344 #ifdef MON_7 |
|
345 MON_7, |
|
346 #endif /* MON_7 */ |
|
347 #ifdef MON_8 |
|
348 MON_8, |
|
349 #endif /* MON_8 */ |
|
350 #ifdef MON_9 |
|
351 MON_9, |
|
352 #endif /* MON_9 */ |
|
353 #ifdef MON_10 |
|
354 MON_10, |
|
355 #endif /* MON_10 */ |
|
356 #ifdef MON_11 |
|
357 MON_11, |
|
358 #endif /* MON_11 */ |
|
359 #ifdef MON_12 |
|
360 MON_12, |
|
361 #endif /* MON_12 */ |
|
362 #ifdef T_FMT_AMPM |
|
363 T_FMT_AMPM, |
|
364 #endif /* T_FMT_AMPM */ |
|
365 #ifdef AM_STR |
|
366 AM_STR, |
|
367 #endif /* AM_STR */ |
|
368 #ifdef PM_STR |
|
369 PM_STR, |
|
370 #endif /* PM_STR */ |
|
371 #ifdef ERA |
|
372 ERA, |
|
373 #endif /* ERA */ |
|
374 #ifdef ERA_D_FMT |
|
375 ERA_D_FMT, |
|
376 #endif /* ERA_D_FMT */ |
|
377 #ifdef ERA_D_T_FMT |
|
378 ERA_D_T_FMT, |
|
379 #endif /* ERA_D_T_FMT */ |
|
380 #ifdef ERA_T_FMT |
|
381 ERA_T_FMT, |
|
382 #endif /* ERA_T_FMT */ |
|
383 #ifdef ALT_DIGITS |
|
384 ALT_DIGITS, |
|
385 #endif /* ALT_DIGITS */ |
|
386 0 |
|
387 }; |
|
388 |
|
389 static nl_item * |
|
390 liitem(char *name) |
|
391 { |
|
392 char **element; |
|
393 nl_item *nlcode; |
|
394 |
|
395 nlcode = &nl_vals[0]; |
|
396 |
|
397 for (element = (char **)nl_names; *element; element++, nlcode++) { |
|
398 if ((!strcmp(*element, name))) |
|
399 return nlcode; |
|
400 } |
|
401 |
|
402 return NULL; |
|
403 } |
|
404 |
|
405 /**/ |
|
406 static void |
|
407 shempty(void) |
|
408 { |
|
409 } |
|
410 |
|
411 /* Create a simple special hash parameter. */ |
|
412 |
|
413 /**/ |
|
414 static Param |
|
415 createlihash() |
|
416 { |
|
417 Param pm; |
|
418 HashTable ht; |
|
419 |
|
420 unsetparam(langinfo_nam); |
|
421 |
|
422 if (!(pm = createparam(langinfo_nam, PM_SPECIAL|PM_HIDE|PM_HIDEVAL| |
|
423 PM_REMOVABLE|PM_HASHED))) |
|
424 return NULL; |
|
425 |
|
426 pm->level = pm->old ? locallevel : 0; |
|
427 pm->gsu.h = &stdhash_gsu; |
|
428 pm->u.hash = ht = newhashtable(7, langinfo_nam, NULL); |
|
429 |
|
430 ht->hash = hasher; |
|
431 ht->emptytable = (TableFunc) shempty; |
|
432 ht->filltable = NULL; |
|
433 ht->addnode = (AddNodeFunc) shempty; |
|
434 ht->getnode = ht->getnode2 = getlanginfo; |
|
435 ht->removenode = (RemoveNodeFunc) shempty; |
|
436 ht->disablenode = NULL; |
|
437 ht->enablenode = NULL; |
|
438 ht->freenode = (FreeNodeFunc) shempty; |
|
439 ht->printnode = printparamnode; |
|
440 ht->scantab = scanlanginfo; |
|
441 |
|
442 return (langinfo_pm = pm); |
|
443 } |
|
444 |
|
445 /**/ |
|
446 static HashNode |
|
447 getlanginfo(UNUSED(HashTable ht), char *name) |
|
448 { |
|
449 int len, *elem; |
|
450 char *listr; |
|
451 Param pm = NULL; |
|
452 |
|
453 unmetafy(name, &len); |
|
454 |
|
455 pm = (Param) hcalloc(sizeof(struct param)); |
|
456 pm->nam = dupstring(name); |
|
457 pm->flags = PM_READONLY | PM_SCALAR; |
|
458 pm->gsu.s = &nullsetscalar_gsu; |
|
459 |
|
460 if(name) |
|
461 elem = liitem(name); |
|
462 else |
|
463 elem = NULL; |
|
464 |
|
465 if (elem && (listr = nl_langinfo(*elem))) { |
|
466 pm->u.str = dupstring(listr); |
|
467 } |
|
468 else |
|
469 { |
|
470 /* zwarn("no such lang info: %s", name, 0); */ |
|
471 pm->u.str = dupstring(""); |
|
472 pm->flags |= PM_UNSET; |
|
473 } |
|
474 return (HashNode) pm; |
|
475 } |
|
476 |
|
477 /**/ |
|
478 static void |
|
479 scanlanginfo(UNUSED(HashTable ht), ScanFunc func, int flags) |
|
480 { |
|
481 Param pm = NULL; |
|
482 char **element, *langstr; |
|
483 nl_item *nlcode; |
|
484 |
|
485 pm = (Param) hcalloc(sizeof(struct param)); |
|
486 pm->gsu.s = &nullsetscalar_gsu; |
|
487 pm->flags = PM_READONLY | PM_SCALAR; |
|
488 |
|
489 nlcode = &nl_vals[0]; |
|
490 for (element = (char **)nl_names; *element; element++, nlcode++) { |
|
491 if ((langstr = nl_langinfo(*nlcode)) != NULL) { |
|
492 pm->u.str = dupstring(langstr); |
|
493 pm->nam = dupstring(*element); |
|
494 func((HashNode) pm, flags); |
|
495 } |
|
496 } |
|
497 |
|
498 } |
|
499 |
|
500 /**/ |
|
501 #endif /* HAVE_NL_LANGINFO */ |
|
502 |
|
503 /**/ |
|
504 int |
|
505 setup_(UNUSED(Module m)) |
|
506 { |
|
507 return 0; |
|
508 } |
|
509 |
|
510 /**/ |
|
511 int |
|
512 boot_(UNUSED(Module m)) |
|
513 { |
|
514 #ifdef HAVE_NL_LANGINFO |
|
515 if (!createlihash()) |
|
516 return 1; |
|
517 #else |
|
518 unsetparam(langinfo_nam); |
|
519 #endif |
|
520 return 0; |
|
521 } |
|
522 |
|
523 /**/ |
|
524 int |
|
525 cleanup_(UNUSED(Module m)) |
|
526 { |
|
527 #ifdef HAVE_NL_LANGINFO |
|
528 Param pm; |
|
529 |
|
530 if ((pm = (Param) paramtab->getnode(paramtab, langinfo_nam)) && |
|
531 pm == langinfo_pm) { |
|
532 pm->flags &= ~PM_READONLY; |
|
533 unsetparam_pm(pm, 0, 1); |
|
534 } |
|
535 #endif |
|
536 return 0; |
|
537 } |
|
538 |
|
539 /**/ |
|
540 int |
|
541 finish_(UNUSED(Module m)) |
|
542 { |
|
543 return 0; |
|
544 } |