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