From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11928 invoked from network); 1 Jan 1997 20:15:43 -0000 Received: from euclid.skiles.gatech.edu (list@130.207.146.50) by coral.primenet.com.au with SMTP; 1 Jan 1997 20:15:43 -0000 Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id PAA18236; Wed, 1 Jan 1997 15:19:54 -0500 (EST) Resent-Date: Wed, 1 Jan 1997 15:19:54 -0500 (EST) From: Zoltan Hidvegi Message-Id: <199701011918.UAA02059@hzoli.ppp.cs.elte.hu> Subject: Remove struct iparam hack To: zsh-workers@math.gatech.edu (Zsh hacking and development) Date: Wed, 1 Jan 1997 20:18:25 +0100 (MET) X-Mailer: ELM [version 2.4ME+ PL17 (25)] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"s18nf2.0.tS4.fRioo"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/2693 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu The patch below removes the struct iparam hack to initialise the parameter hash table which might cause problems on machines where sizeof(long) != sizeof(void*). It does not fix any visible bugs but I kindly ask everyone to try it. Use cc instead of gcc and use the oldest and most buggy cc you have on your system. It assumes that a union can be initialised with its first element. This idea comes from Zefram. That patch can be applied to all released and test zsh versions out there. Patch below is a unified diff, I think in that case that's more readable than the context diff. Zoltan --- Src/hashtable.h 1996/12/26 17:05:49 3.1.1.1 +++ Src/hashtable.h 1996/12/26 17:03:11 @@ -65,31 +65,17 @@ #endif -struct iparam { - struct hashnode *next; - char *nam; /* hash data */ - int flags; /* PM_* flags (defined in zsh.h) */ - void *value; - int (*func1) _((void)); /* set func */ - int (*func2) _((void)); /* get func */ - int ct; /* output base or field width */ - void *data; /* used by getfns */ - char *env; /* location in environment, if exported */ - char *ename; /* name of corresponding environment var */ - Param old; /* old struct for use with local */ - int level; /* if (old != NULL), level of localness */ -}; - -#define IFN(X) ((int (*)_((void)))(X)) +#define SFN(X) {((void (*)_((Param, char *)))(X))} +#define GFN(X) {((char *(*)_((Param)))(X))} /* Nodes for special parameters for parameter hash table */ #ifdef GLOBALS -struct iparam special_params[] = +struct param special_params[] = { -#define IPDEF1(A,B,C,D) {NULL,A,PM_INTEGER|PM_SPECIAL|D,NULL,IFN(C),IFN(B),10,NULL,NULL,NULL,NULL,0} -IPDEF1("#", poundgetfn, IFN(nullsetfn), PM_READONLY), -IPDEF1("ERRNO", errnogetfn, IFN(nullsetfn), PM_READONLY), +#define IPDEF1(A,B,C,D) {NULL,A,PM_INTEGER|PM_SPECIAL|D,{NULL},SFN(C),GFN(B),10,NULL,NULL,NULL,NULL,0} +IPDEF1("#", poundgetfn, nullsetfn, PM_READONLY), +IPDEF1("ERRNO", errnogetfn, nullsetfn, PM_READONLY), IPDEF1("GID", gidgetfn, gidsetfn, PM_DONTIMPORT), IPDEF1("EGID", egidgetfn, egidsetfn, PM_DONTIMPORT), IPDEF1("HISTSIZE", histsizegetfn, histsizesetfn, 0), @@ -97,20 +83,20 @@ IPDEF1("SECONDS", secondsgetfn, secondssetfn, 0), IPDEF1("UID", uidgetfn, uidsetfn, PM_DONTIMPORT), IPDEF1("EUID", euidgetfn, euidsetfn, PM_DONTIMPORT), -IPDEF1("TTYIDLE", ttyidlegetfn, IFN(nullsetfn), PM_READONLY), +IPDEF1("TTYIDLE", ttyidlegetfn, nullsetfn, PM_READONLY), -#define IPDEF2(A,B,C,D) {NULL,A,PM_SCALAR|PM_SPECIAL|D,NULL,IFN(C),IFN(B),0,NULL,NULL,NULL,NULL,0} +#define IPDEF2(A,B,C,D) {NULL,A,PM_SCALAR|PM_SPECIAL|D,{NULL},{C},{B},0,NULL,NULL,NULL,NULL,0} IPDEF2("USERNAME", usernamegetfn, usernamesetfn, PM_DONTIMPORT), -IPDEF2("-", dashgetfn, IFN(nullsetfn), PM_READONLY), +IPDEF2("-", dashgetfn, nullsetfn, PM_READONLY), IPDEF2("histchars", histcharsgetfn, histcharssetfn, PM_DONTIMPORT), IPDEF2("HOME", homegetfn, homesetfn, 0), IPDEF2("TERM", termgetfn, termsetfn, 0), IPDEF2("WORDCHARS", wordcharsgetfn, wordcharssetfn, 0), IPDEF2("IFS", ifsgetfn, ifssetfn, PM_DONTIMPORT), -IPDEF2("_", underscoregetfn, IFN(nullsetfn), PM_READONLY), +IPDEF2("_", underscoregetfn, nullsetfn, PM_READONLY), #ifdef LC_ALL -#define LCIPDEF(A,B) {NULL,A,PM_SCALAR|PM_SPECIAL|PM_UNSET,NULL,IFN(lcsetfn),IFN(strgetfn),0,(void *)B,NULL,NULL,NULL,0} +#define LCIPDEF(A,B) {NULL,A,PM_SCALAR|PM_SPECIAL|PM_UNSET,{NULL},{lcsetfn},{strgetfn},0,(void *)B,NULL,NULL,NULL,0} IPDEF2("LANG", strgetfn, langsetfn, PM_UNSET), IPDEF2("LC_ALL", strgetfn, lc_allsetfn, PM_UNSET), #ifdef LC_COLLATE @@ -127,23 +113,23 @@ #endif #endif -#define IPDEF4(A,B) {NULL,A,PM_INTEGER|PM_READONLY|PM_SPECIAL,NULL,IFN(nullsetfn),IFN(intvargetfn),10,(void *)B,NULL,NULL,NULL,0} +#define IPDEF4(A,B) {NULL,A,PM_INTEGER|PM_READONLY|PM_SPECIAL,{NULL},{nullsetfn},GFN(intvargetfn),10,(void *)B,NULL,NULL,NULL,0} IPDEF4("!", &lastpid), IPDEF4("$", &mypid), IPDEF4("?", &lastval), IPDEF4("LINENO", &lineno), IPDEF4("PPID", &ppid), -#define IPDEF5(A,B,F) {NULL,A,PM_INTEGER|PM_SPECIAL,NULL,IFN(F),IFN(intvargetfn),10,(void *)B,NULL,NULL,NULL,0} +#define IPDEF5(A,B,F) {NULL,A,PM_INTEGER|PM_SPECIAL,{NULL},SFN(F),GFN(intvargetfn),10,(void *)B,NULL,NULL,NULL,0} IPDEF5("COLUMNS", &columns, zlevarsetfn), IPDEF5("LINES", &lines, zlevarsetfn), IPDEF5("OPTIND", &zoptind, intvarsetfn), IPDEF5("SHLVL", &shlvl, intvarsetfn), -#define IPDEF6(A,B) {NULL,A,PM_SCALAR|PM_READONLY|PM_SPECIAL,NULL,IFN(nullsetfn),IFN(strvargetfn),0,(void *)B,NULL,NULL,NULL,0} +#define IPDEF6(A,B) {NULL,A,PM_SCALAR|PM_READONLY|PM_SPECIAL,{NULL},SFN(nullsetfn),{strvargetfn},0,(void *)B,NULL,NULL,NULL,0} IPDEF6("PWD", &pwd), -#define IPDEF7(A,B) {NULL,A,PM_SCALAR|PM_SPECIAL,NULL,IFN(strvarsetfn),IFN(strvargetfn),0,(void *)B,NULL,NULL,NULL,0} +#define IPDEF7(A,B) {NULL,A,PM_SCALAR|PM_SPECIAL,{NULL},{strvarsetfn},{strvargetfn},0,(void *)B,NULL,NULL,NULL,0} IPDEF7("OLDPWD", &oldpwd), IPDEF7("OPTARG", &zoptarg), IPDEF7("NULLCMD", &nullcmd), @@ -158,7 +144,7 @@ IPDEF7("SPROMPT", &sprompt), IPDEF7("0", &argzero), -#define IPDEF8(A,B,C) {NULL,A,PM_SCALAR|PM_SPECIAL,NULL,IFN(colonarrsetfn),IFN(colonarrgetfn),0,(void *)B,NULL,C,NULL,0} +#define IPDEF8(A,B,C) {NULL,A,PM_SCALAR|PM_SPECIAL,{NULL},SFN(colonarrsetfn),GFN(colonarrgetfn),0,(void *)B,NULL,C,NULL,0} IPDEF8("CDPATH", &cdpath, "cdpath"), IPDEF8("FIGNORE", &fignore, "fignore"), IPDEF8("FPATH", &fpath, "fpath"), @@ -169,17 +155,17 @@ #ifdef DYNAMIC /* MODULE_PATH is not imported for security reasons */ -{NULL, "MODULE_PATH", PM_SCALAR|PM_SPECIAL|PM_DONTIMPORT, NULL, IFN(colonarrsetfn), IFN(colonarrgetfn), 0, (void *)&module_path, NULL, "module_path", NULL, 0}, +{NULL, "MODULE_PATH", PM_SCALAR|PM_SPECIAL|PM_DONTIMPORT, {NULL}, SFN(colonarrsetfn), GFN(colonarrgetfn), 0, (void *)&module_path, NULL, "module_path", NULL, 0}, #endif -#define IPDEF9(A,B,C) {NULL,A,PM_ARRAY|PM_SPECIAL|PM_DONTIMPORT,NULL,IFN(arrvarsetfn),IFN(arrvargetfn),0,(void *)B,NULL,C,NULL,0} +#define IPDEF9(A,B,C) {NULL,A,PM_ARRAY|PM_SPECIAL|PM_DONTIMPORT,{NULL},SFN(arrvarsetfn),GFN(arrvargetfn),0,(void *)B,NULL,C,NULL,0} IPDEF9("*", &pparams, NULL), IPDEF9("@", &pparams, NULL), {NULL, NULL}, /* The following parameters are not avaible in sh/ksh compatibility * * mode. All of these has sh compatible equivalents. */ -IPDEF1("ARGC", poundgetfn, IFN(nullsetfn), PM_READONLY), +IPDEF1("ARGC", poundgetfn, nullsetfn, PM_READONLY), IPDEF2("HISTCHARS", histcharsgetfn, histcharssetfn, PM_DONTIMPORT), IPDEF4("status", &lastval), IPDEF7("prompt", &prompt), @@ -204,7 +190,7 @@ {NULL, NULL} }; #else -extern struct iparam special_params[]; +extern struct param special_params[]; #endif --- Src/params.c 1996/12/31 01:57:45 3.1.1.4 +++ Src/params.c 1997/01/01 19:01:48 @@ -41,8 +41,7 @@ void createparamtable(void) { - struct iparam *ip; - Param pm; + Param ip, pm; char **old_environ, **envp, **envp2, **sigptr, **t; char buf[50], *str, *iname; int num_env;