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