diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | Doc/Zsh/.distfiles | 2 | ||||
-rw-r--r-- | Doc/Zsh/mod_langinfo.yo | 37 | ||||
-rw-r--r-- | Src/Modules/.distfiles | 1 | ||||
-rw-r--r-- | Src/Modules/langinfo.c | 557 | ||||
-rw-r--r-- | Src/Modules/langinfo.mdd | 8 | ||||
-rw-r--r-- | zshconfig.ac | 3 |
7 files changed, 613 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 3fbf97d1c..189a29073 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2002-02-19 Clint Adams <clint@zsh.org> + + * 16673: zshconfig.ac, Doc/Zsh/.distfiles, Doc/Zsh/mod_langinfo.yo, + Src/Modules/.distfiles, Src/Modules/langinfo.c, + Src/Modules/langinfo.mdd: add langinfo module as an interface + to locale information. + 2002-02-19 Geoff Wing <gcw@zsh.org> * 16635: Src/Zle/zle_refresh.c: make sure we display lists in diff --git a/Doc/Zsh/.distfiles b/Doc/Zsh/.distfiles index 5b370bb5d..38cc249fe 100644 --- a/Doc/Zsh/.distfiles +++ b/Doc/Zsh/.distfiles @@ -4,7 +4,7 @@ DISTFILES_SRC=' cond.yo exec.yo expn.yo filelist.yo files.yo func.yo grammar.yo index.yo intro.yo invoke.yo jobs.yo manual.yo metafaq.yo mod_cap.yo mod_clone.yo mod_compctl.yo mod_complete.yo mod_complist.yo - mod_computil.yo mod_deltochar.yo mod_example.yo mod_files.yo + mod_computil.yo mod_deltochar.yo mod_example.yo mod_files.yo mod_langinfo.yo mod_mapfile.yo mod_mathfunc.yo mod_parameter.yo mod_pcre.yo mod_sched.yo mod_stat.yo mod_tcp.yo mod_termcap.yo mod_terminfo.yo mod_zftp.yo mod_zle.yo mod_zleparameter.yo mod_zutil.yo mod_zprof.yo mod_zpty.yo diff --git a/Doc/Zsh/mod_langinfo.yo b/Doc/Zsh/mod_langinfo.yo new file mode 100644 index 000000000..0372a95be --- /dev/null +++ b/Doc/Zsh/mod_langinfo.yo @@ -0,0 +1,37 @@ +COMMENT(!MOD!zsh/langinfo +Interface to locale information. +!MOD!) +The tt(zsh/langinfo) module makes available one parameter: + +startitem() +vindex(langinfo) +item(tt(langinfo))( +An associative array that maps langinfo elements to +their values. + +Your implementation may support a number of the following keys: + +tt(CODESET), +tt(D_T_FMT), +tt(D_FMT), +tt(T_FMT), +tt(RADIXCHAR), +tt(THOUSEP), +tt(YESEXPR), +tt(NOEXPR), +tt(CRNCYSTR), +tt(ABDAY_{1..7}), +tt(DAY_{1..7}), +tt(ABMON_{1..12}), +tt(MON_{1..12}), +tt(T_FMT_AMPM), +tt(AM_STR), +tt(PM_STR), +tt(ERA), +tt(ERA_D_FMT), +tt(ERA_D_T_FMT), +tt(ERA_T_FMT), +tt(ALT_DIGITS) + +) +enditem() diff --git a/Src/Modules/.distfiles b/Src/Modules/.distfiles index 37bd2091e..ea993d3ad 100644 --- a/Src/Modules/.distfiles +++ b/Src/Modules/.distfiles @@ -4,6 +4,7 @@ DISTFILES_SRC=' clone.mdd clone.c example.mdd example.c files.mdd files.c + langinfo.mdd langinfo.c mapfile.mdd mapfile.c mathfunc.mdd mathfunc.c parameter.mdd parameter.c diff --git a/Src/Modules/langinfo.c b/Src/Modules/langinfo.c new file mode 100644 index 000000000..6b004fb2f --- /dev/null +++ b/Src/Modules/langinfo.c @@ -0,0 +1,557 @@ +/* + * 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 ((!strncmp(*element, name, strlen(*element)))) + 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->gets.hfn = hashgetfn; + pm->sets.hfn = hashsetfn; + pm->unsetfn = stdunsetfn; + 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(HashTable ht, char *name) +{ + int len, *elem; + char *listr; + Param pm = NULL; + + unmetafy(name, &len); + + pm = (Param) zhalloc(sizeof(struct param)); + pm->nam = dupstring(name); + pm->flags = PM_READONLY | PM_SCALAR; + pm->sets.cfn = NULL; + pm->gets.cfn = strgetfn; + pm->sets.ifn = NULL; + pm->gets.ifn = intgetfn; + pm->unsetfn = NULL; + pm->ct = 0; + pm->env = NULL; + pm->ename = NULL; + pm->old = NULL; + pm->level = 0; + + 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(HashTable ht, ScanFunc func, int flags) +{ + Param pm = NULL; + char **element, *langstr; + nl_item *nlcode; + + pm = (Param) zhalloc(sizeof(struct param)); + pm->sets.cfn = NULL; + pm->gets.cfn = strgetfn; + pm->sets.ifn = NULL; + pm->gets.ifn = intgetfn; + pm->unsetfn = NULL; + pm->ct = 0; + pm->env = NULL; + pm->ename = NULL; + pm->old = NULL; + + 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_(Module m) +{ + return 0; +} + +/**/ +int +boot_(Module m) +{ +#ifdef HAVE_NL_LANGINFO + if (!createlihash()) + return 1; +#else + unsetparam(langinfo_nam); +#endif + return 0; +} + +/**/ +int +cleanup_(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_(Module m) +{ + return 0; +} diff --git a/Src/Modules/langinfo.mdd b/Src/Modules/langinfo.mdd new file mode 100644 index 000000000..a3a615113 --- /dev/null +++ b/Src/Modules/langinfo.mdd @@ -0,0 +1,8 @@ +name=zsh/langinfo + +link=either +load=no + +autoparams="langinfo" + +objects="langinfo.o" diff --git a/zshconfig.ac b/zshconfig.ac index 956c527b6..86540a893 100644 --- a/zshconfig.ac +++ b/zshconfig.ac @@ -487,7 +487,7 @@ AC_CHECK_HEADERS(sys/time.h sys/times.h sys/select.h termcap.h termio.h \ limits.h fcntl.h libc.h sys/utsname.h sys/resource.h \ locale.h errno.h stdio.h stdlib.h unistd.h sys/capability.h \ utmp.h utmpx.h sys/types.h pwd.h grp.h poll.h sys/mman.h \ - netinet/in_systm.h pcre.h) + netinet/in_systm.h pcre.h langinfo.h) if test $dynamic = yes; then AC_CHECK_HEADERS(dlfcn.h) AC_CHECK_HEADERS(dl.h) @@ -950,6 +950,7 @@ AC_CHECK_FUNCS(strftime difftime gettimeofday \ pathconf sysconf \ tgetent tigetflag tigetnum tigetstr setupterm \ pcre_compile pcre_study pcre_exec \ + nl_langinfo \ erand48) AC_FUNC_STRCOLL |