mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-30 17:50:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			537 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			537 lines
		
	
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * langinfo.c - parameter interface to langinfo via curses
 | |
|  *
 | |
|  * This file is part of zsh, the Z shell.
 | |
|  *
 | |
|  * Copyright (c) 2002 Peter Stephenson, Clint Adams
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * Permission is hereby granted, without written agreement and without
 | |
|  * license or royalty fees, to use, copy, modify, and distribute this
 | |
|  * software and to distribute modified versions of this software for any
 | |
|  * purpose, provided that the above copyright notice and the following
 | |
|  * two paragraphs appear in all copies of this software.
 | |
|  *
 | |
|  * In no event shall Peter Stephenson, Clint Adams or the Zsh Development Group
 | |
|  * be liable to any party for direct, indirect, special, incidental, or
 | |
|  * consequential damages arising out of the use of this software and its
 | |
|  * documentation, even if Sven Wishnowsky, Clint Adams and the Zsh
 | |
|  * Development Group have been advised of the possibility of such damage.
 | |
|  *
 | |
|  * Peter Stephenson, Clint Adams and the Zsh Development Group specifically
 | |
|  * disclaim any warranties, including, but not limited to, the implied
 | |
|  * warranties of merchantability and fitness for a particular purpose.
 | |
|  * The software provided hereunder is on an "as is" basis, and Peter
 | |
|  * Stephenson, Clint Adams and the Zsh Development Group have no obligation
 | |
|  * to provide maintenance, support, updates, enhancements, or modifications.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include "langinfo.mdh"
 | |
| #include "langinfo.pro"
 | |
| 
 | |
| static char langinfo_nam[] = "langinfo";
 | |
| 
 | |
| #ifdef HAVE_LANGINFO_H
 | |
| # include <langinfo.h>
 | |
| #endif
 | |
| 
 | |
| static Param langinfo_pm;
 | |
| 
 | |
| /**/
 | |
| #ifdef HAVE_NL_LANGINFO
 | |
| 
 | |
| static char *nl_names[] = {
 | |
| #ifdef CODESET
 | |
|     "CODESET",
 | |
| #endif /* CODESET */
 | |
| #ifdef D_T_FMT
 | |
|     "D_T_FMT",
 | |
| #endif /* D_T_FMT */
 | |
| #ifdef D_FMT
 | |
|     "D_FMT",
 | |
| #endif /* D_FMT */
 | |
| #ifdef T_FMT
 | |
|     "T_FMT",
 | |
| #endif /* T_FMT */
 | |
| #ifdef RADIXCHAR
 | |
|     "RADIXCHAR",
 | |
| #endif /* RADIXCHAR */
 | |
| #ifdef THOUSEP
 | |
|     "THOUSEP",
 | |
| #endif /* THOUSEP */
 | |
| #ifdef YESEXPR
 | |
|     "YESEXPR",
 | |
| #endif /* YESEXPR */
 | |
| #ifdef NOEXPR
 | |
|     "NOEXPR",
 | |
| #endif /* NOEXPR */
 | |
| #ifdef CRNCYSTR
 | |
|     "CRNCYSTR",
 | |
| #endif /* CRNCYSTR */
 | |
| #ifdef ABDAY_1
 | |
|     "ABDAY_1",
 | |
| #endif /* ABDAY_1 */
 | |
| #ifdef ABDAY_2
 | |
|     "ABDAY_2",
 | |
| #endif /* ABDAY_2 */
 | |
| #ifdef ABDAY_3
 | |
|     "ABDAY_3",
 | |
| #endif /* ABDAY_3 */
 | |
| #ifdef ABDAY_4
 | |
|     "ABDAY_4",
 | |
| #endif /* ABDAY_4 */
 | |
| #ifdef ABDAY_5
 | |
|     "ABDAY_5",
 | |
| #endif /* ABDAY_5 */
 | |
| #ifdef ABDAY_6
 | |
|     "ABDAY_6",
 | |
| #endif /* ABDAY_6 */
 | |
| #ifdef ABDAY_7
 | |
|     "ABDAY_7",
 | |
| #endif /* ABDAY_7 */
 | |
| #ifdef DAY_1
 | |
|     "DAY_1",
 | |
| #endif /* DAY_1 */
 | |
| #ifdef DAY_2
 | |
|     "DAY_2",
 | |
| #endif /* DAY_2 */
 | |
| #ifdef DAY_3
 | |
|     "DAY_3",
 | |
| #endif /* DAY_3 */
 | |
| #ifdef DAY_4
 | |
|     "DAY_4",
 | |
| #endif /* DAY_4 */
 | |
| #ifdef DAY_5
 | |
|     "DAY_5",
 | |
| #endif /* DAY_5 */
 | |
| #ifdef DAY_6
 | |
|     "DAY_6",
 | |
| #endif /* DAY_6 */
 | |
| #ifdef DAY_7
 | |
|     "DAY_7",
 | |
| #endif /* DAY_7 */
 | |
| #ifdef ABMON_1
 | |
|     "ABMON_1",
 | |
| #endif /* ABMON_1 */
 | |
| #ifdef ABMON_2
 | |
|     "ABMON_2",
 | |
| #endif /* ABMON_2 */
 | |
| #ifdef ABMON_3
 | |
|     "ABMON_3",
 | |
| #endif /* ABMON_3 */
 | |
| #ifdef ABMON_4
 | |
|     "ABMON_4",
 | |
| #endif /* ABMON_4 */
 | |
| #ifdef ABMON_5
 | |
|     "ABMON_5",
 | |
| #endif /* ABMON_5 */
 | |
| #ifdef ABMON_6
 | |
|     "ABMON_6",
 | |
| #endif /* ABMON_6 */
 | |
| #ifdef ABMON_7
 | |
|     "ABMON_7",
 | |
| #endif /* ABMON_7 */
 | |
| #ifdef ABMON_8
 | |
|     "ABMON_8",
 | |
| #endif /* ABMON_8 */
 | |
| #ifdef ABMON_9
 | |
|     "ABMON_9",
 | |
| #endif /* ABMON_9 */
 | |
| #ifdef ABMON_10
 | |
|     "ABMON_10",
 | |
| #endif /* ABMON_10 */
 | |
| #ifdef ABMON_11
 | |
|     "ABMON_11",
 | |
| #endif /* ABMON_11 */
 | |
| #ifdef ABMON_12
 | |
|     "ABMON_12",
 | |
| #endif /* ABMON_12 */
 | |
| #ifdef MON_1
 | |
|     "MON_1",
 | |
| #endif /* MON_1 */
 | |
| #ifdef MON_2
 | |
|     "MON_2",
 | |
| #endif /* MON_2 */
 | |
| #ifdef MON_3
 | |
|     "MON_3",
 | |
| #endif /* MON_3 */
 | |
| #ifdef MON_4
 | |
|     "MON_4",
 | |
| #endif /* MON_4 */
 | |
| #ifdef MON_5
 | |
|     "MON_5",
 | |
| #endif /* MON_5 */
 | |
| #ifdef MON_6
 | |
|     "MON_6",
 | |
| #endif /* MON_6 */
 | |
| #ifdef MON_7
 | |
|     "MON_7",
 | |
| #endif /* MON_7 */
 | |
| #ifdef MON_8
 | |
|     "MON_8",
 | |
| #endif /* MON_8 */
 | |
| #ifdef MON_9
 | |
|     "MON_9",
 | |
| #endif /* MON_9 */
 | |
| #ifdef MON_10
 | |
|     "MON_10",
 | |
| #endif /* MON_10 */
 | |
| #ifdef MON_11
 | |
|     "MON_11",
 | |
| #endif /* MON_11 */
 | |
| #ifdef MON_12
 | |
|     "MON_12",
 | |
| #endif /* MON_12 */
 | |
| #ifdef T_FMT_AMPM
 | |
|     "T_FMT_AMPM",
 | |
| #endif /* T_FMT_AMPM */
 | |
| #ifdef AM_STR
 | |
|     "AM_STR",
 | |
| #endif /* AM_STR */
 | |
| #ifdef PM_STR
 | |
|     "PM_STR",
 | |
| #endif /* PM_STR */
 | |
| #ifdef ERA
 | |
|     "ERA",
 | |
| #endif /* ERA */
 | |
| #ifdef ERA_D_FMT
 | |
|     "ERA_D_FMT",
 | |
| #endif /* ERA_D_FMT */
 | |
| #ifdef ERA_D_T_FMT
 | |
|     "ERA_D_T_FMT",
 | |
| #endif /* ERA_D_T_FMT */
 | |
| #ifdef ERA_T_FMT
 | |
|     "ERA_T_FMT",
 | |
| #endif /* ERA_T_FMT */
 | |
| #ifdef ALT_DIGITS
 | |
|     "ALT_DIGITS",
 | |
| #endif /* ALT_DIGITS */
 | |
|     NULL
 | |
| };
 | |
| 
 | |
| static nl_item nl_vals[] = {
 | |
| #ifdef CODESET
 | |
|     CODESET,
 | |
| #endif /* CODESET */
 | |
| #ifdef D_T_FMT
 | |
|     D_T_FMT,
 | |
| #endif /* D_T_FMT */
 | |
| #ifdef D_FMT
 | |
|     D_FMT,
 | |
| #endif /* D_FMT */
 | |
| #ifdef T_FMT
 | |
|     T_FMT,
 | |
| #endif /* T_FMT */
 | |
| #ifdef RADIXCHAR
 | |
|     RADIXCHAR,
 | |
| #endif /* RADIXCHAR */
 | |
| #ifdef THOUSEP
 | |
|     THOUSEP,
 | |
| #endif /* THOUSEP */
 | |
| #ifdef YESEXPR
 | |
|     YESEXPR,
 | |
| #endif /* YESEXPR */
 | |
| #ifdef NOEXPR
 | |
|     NOEXPR,
 | |
| #endif /* NOEXPR */
 | |
| #ifdef CRNCYSTR
 | |
|     CRNCYSTR,
 | |
| #endif /* CRNCYSTR */
 | |
| #ifdef ABDAY_1
 | |
|     ABDAY_1,
 | |
| #endif /* ABDAY_1 */
 | |
| #ifdef ABDAY_2
 | |
|     ABDAY_2,
 | |
| #endif /* ABDAY_2 */
 | |
| #ifdef ABDAY_3
 | |
|     ABDAY_3,
 | |
| #endif /* ABDAY_3 */
 | |
| #ifdef ABDAY_4
 | |
|     ABDAY_4,
 | |
| #endif /* ABDAY_4 */
 | |
| #ifdef ABDAY_5
 | |
|     ABDAY_5,
 | |
| #endif /* ABDAY_5 */
 | |
| #ifdef ABDAY_6
 | |
|     ABDAY_6,
 | |
| #endif /* ABDAY_6 */
 | |
| #ifdef ABDAY_7
 | |
|     ABDAY_7,
 | |
| #endif /* ABDAY_7 */
 | |
| #ifdef DAY_1
 | |
|     DAY_1,
 | |
| #endif /* DAY_1 */
 | |
| #ifdef DAY_2
 | |
|     DAY_2,
 | |
| #endif /* DAY_2 */
 | |
| #ifdef DAY_3
 | |
|     DAY_3,
 | |
| #endif /* DAY_3 */
 | |
| #ifdef DAY_4
 | |
|     DAY_4,
 | |
| #endif /* DAY_4 */
 | |
| #ifdef DAY_5
 | |
|     DAY_5,
 | |
| #endif /* DAY_5 */
 | |
| #ifdef DAY_6
 | |
|     DAY_6,
 | |
| #endif /* DAY_6 */
 | |
| #ifdef DAY_7
 | |
|     DAY_7,
 | |
| #endif /* DAY_7 */
 | |
| #ifdef ABMON_1
 | |
|     ABMON_1,
 | |
| #endif /* ABMON_1 */
 | |
| #ifdef ABMON_2
 | |
|     ABMON_2,
 | |
| #endif /* ABMON_2 */
 | |
| #ifdef ABMON_3
 | |
|     ABMON_3,
 | |
| #endif /* ABMON_3 */
 | |
| #ifdef ABMON_4
 | |
|     ABMON_4,
 | |
| #endif /* ABMON_4 */
 | |
| #ifdef ABMON_5
 | |
|     ABMON_5,
 | |
| #endif /* ABMON_5 */
 | |
| #ifdef ABMON_6
 | |
|     ABMON_6,
 | |
| #endif /* ABMON_6 */
 | |
| #ifdef ABMON_7
 | |
|     ABMON_7,
 | |
| #endif /* ABMON_7 */
 | |
| #ifdef ABMON_8
 | |
|     ABMON_8,
 | |
| #endif /* ABMON_8 */
 | |
| #ifdef ABMON_9
 | |
|     ABMON_9,
 | |
| #endif /* ABMON_9 */
 | |
| #ifdef ABMON_10
 | |
|     ABMON_10,
 | |
| #endif /* ABMON_10 */
 | |
| #ifdef ABMON_11
 | |
|     ABMON_11,
 | |
| #endif /* ABMON_11 */
 | |
| #ifdef ABMON_12
 | |
|     ABMON_12,
 | |
| #endif /* ABMON_12 */
 | |
| #ifdef MON_1
 | |
|     MON_1,
 | |
| #endif /* MON_1 */
 | |
| #ifdef MON_2
 | |
|     MON_2,
 | |
| #endif /* MON_2 */
 | |
| #ifdef MON_3
 | |
|     MON_3,
 | |
| #endif /* MON_3 */
 | |
| #ifdef MON_4
 | |
|     MON_4,
 | |
| #endif /* MON_4 */
 | |
| #ifdef MON_5
 | |
|     MON_5,
 | |
| #endif /* MON_5 */
 | |
| #ifdef MON_6
 | |
|     MON_6,
 | |
| #endif /* MON_6 */
 | |
| #ifdef MON_7
 | |
|     MON_7,
 | |
| #endif /* MON_7 */
 | |
| #ifdef MON_8
 | |
|     MON_8,
 | |
| #endif /* MON_8 */
 | |
| #ifdef MON_9
 | |
|     MON_9,
 | |
| #endif /* MON_9 */
 | |
| #ifdef MON_10
 | |
|     MON_10,
 | |
| #endif /* MON_10 */
 | |
| #ifdef MON_11
 | |
|     MON_11,
 | |
| #endif /* MON_11 */
 | |
| #ifdef MON_12
 | |
|     MON_12,
 | |
| #endif /* MON_12 */
 | |
| #ifdef T_FMT_AMPM
 | |
|     T_FMT_AMPM,
 | |
| #endif /* T_FMT_AMPM */
 | |
| #ifdef AM_STR
 | |
|     AM_STR,
 | |
| #endif /* AM_STR */
 | |
| #ifdef PM_STR
 | |
|     PM_STR,
 | |
| #endif /* PM_STR */
 | |
| #ifdef ERA
 | |
|     ERA,
 | |
| #endif /* ERA */
 | |
| #ifdef ERA_D_FMT
 | |
|     ERA_D_FMT,
 | |
| #endif /* ERA_D_FMT */
 | |
| #ifdef ERA_D_T_FMT
 | |
|     ERA_D_T_FMT,
 | |
| #endif /* ERA_D_T_FMT */
 | |
| #ifdef ERA_T_FMT
 | |
|     ERA_T_FMT,
 | |
| #endif /* ERA_T_FMT */
 | |
| #ifdef ALT_DIGITS
 | |
|     ALT_DIGITS,
 | |
| #endif /* ALT_DIGITS */
 | |
|     0
 | |
| };
 | |
| 
 | |
| static nl_item *
 | |
| liitem(char *name)
 | |
| {
 | |
|     char **element;
 | |
|     nl_item *nlcode;
 | |
| 
 | |
|     nlcode = &nl_vals[0];
 | |
| 
 | |
|     for (element = (char **)nl_names; *element; element++, nlcode++) {
 | |
| 	if ((!strcmp(*element, name)))
 | |
| 	    return nlcode;
 | |
|     }
 | |
| 
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| static void
 | |
| shempty(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| /* Create a simple special hash parameter. */
 | |
| 
 | |
| /**/
 | |
| static Param
 | |
| createlihash()
 | |
| {
 | |
|     Param pm;
 | |
|     HashTable ht;
 | |
| 
 | |
|     unsetparam(langinfo_nam);
 | |
| 
 | |
|     if (!(pm = createparam(langinfo_nam, PM_SPECIAL|PM_HIDE|PM_HIDEVAL|
 | |
| 			   PM_REMOVABLE|PM_HASHED)))
 | |
| 	return NULL;
 | |
| 
 | |
|     pm->level = pm->old ? locallevel : 0;
 | |
|     pm->gsu.h = &stdhash_gsu;
 | |
|     pm->u.hash = ht = newhashtable(7, langinfo_nam, NULL);
 | |
| 
 | |
|     ht->hash        = hasher;
 | |
|     ht->emptytable  = (TableFunc) shempty;
 | |
|     ht->filltable   = NULL;
 | |
|     ht->addnode     = (AddNodeFunc) shempty;
 | |
|     ht->getnode     = ht->getnode2 = getlanginfo;
 | |
|     ht->removenode  = (RemoveNodeFunc) shempty;
 | |
|     ht->disablenode = NULL;
 | |
|     ht->enablenode  = NULL;
 | |
|     ht->freenode    = (FreeNodeFunc) shempty;
 | |
|     ht->printnode   = printparamnode;
 | |
|     ht->scantab     = scanlanginfo;
 | |
| 
 | |
|     return (langinfo_pm = pm);
 | |
| }
 | |
| 
 | |
| /**/
 | |
| static HashNode
 | |
| getlanginfo(UNUSED(HashTable ht), char *name)
 | |
| {
 | |
|     int len, *elem;
 | |
|     char *listr;
 | |
|     Param pm = NULL;
 | |
| 
 | |
|     unmetafy(name, &len);
 | |
| 
 | |
|     pm = (Param) hcalloc(sizeof(struct param));
 | |
|     pm->nam = dupstring(name);
 | |
|     pm->flags = PM_READONLY | PM_SCALAR;
 | |
|     pm->gsu.s = &nullsetscalar_gsu;
 | |
| 
 | |
|     if(name)
 | |
| 	elem = liitem(name);
 | |
|     else
 | |
| 	elem = NULL;
 | |
| 
 | |
|     if (elem && (listr = nl_langinfo(*elem))) {
 | |
| 	pm->u.str = dupstring(listr);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	/* zwarn("no such lang info: %s", name, 0); */
 | |
| 	pm->u.str = dupstring("");
 | |
| 	pm->flags |= PM_UNSET;
 | |
|     }
 | |
|     return (HashNode) pm;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| static void
 | |
| scanlanginfo(UNUSED(HashTable ht), ScanFunc func, int flags)
 | |
| {
 | |
|     Param pm = NULL;
 | |
|     char **element, *langstr;
 | |
|     nl_item *nlcode;
 | |
| 
 | |
|     pm = (Param) hcalloc(sizeof(struct param));
 | |
|     pm->gsu.s = &nullsetscalar_gsu;
 | |
|     pm->flags = PM_READONLY | PM_SCALAR;
 | |
| 
 | |
|     nlcode = &nl_vals[0];
 | |
|     for (element = (char **)nl_names; *element; element++, nlcode++) {
 | |
| 	if ((langstr = nl_langinfo(*nlcode)) != NULL) {
 | |
| 	    pm->u.str = dupstring(langstr);
 | |
| 	    pm->nam = dupstring(*element);
 | |
| 	    func((HashNode) pm, flags);
 | |
| 	}
 | |
|     }
 | |
|     
 | |
| }
 | |
| 
 | |
| /**/
 | |
| #endif /* HAVE_NL_LANGINFO */
 | |
| 
 | |
| /**/
 | |
| int
 | |
| setup_(UNUSED(Module m))
 | |
| {
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| boot_(UNUSED(Module m))
 | |
| {
 | |
| #ifdef HAVE_NL_LANGINFO
 | |
|     if (!createlihash())
 | |
|     	return 1;
 | |
| #else
 | |
|     unsetparam(langinfo_nam);
 | |
| #endif
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| cleanup_(UNUSED(Module m))
 | |
| {
 | |
| #ifdef HAVE_NL_LANGINFO
 | |
|     Param pm;
 | |
| 
 | |
|     if ((pm = (Param) paramtab->getnode(paramtab, langinfo_nam)) &&
 | |
| 	pm == langinfo_pm) {
 | |
| 	pm->flags &= ~PM_READONLY;
 | |
| 	unsetparam_pm(pm, 0, 1);
 | |
|     }
 | |
| #endif
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /**/
 | |
| int
 | |
| finish_(UNUSED(Module m))
 | |
| {
 | |
|     return 0;
 | |
| }
 |