From 77166e259ee91fde498347de7c3c807d7bff6f1f Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Wed, 12 Jan 2005 12:18:58 +0000 Subject: 20695: Fix Cygwin problem with initialising from pointer to imported variable --- ChangeLog | 5 +++++ Src/Modules/parameter.c | 9 ++++++++- Src/Zle/zleparameter.c | 9 ++++++++- Src/module.c | 26 +++++++++++++++++++++++++- Src/zsh.h | 11 ++++++++--- 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index e680104ac..3904c5f7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,11 @@ * unposted: Config/version.mk, README, Etc/FAQ.yo: release zsh version 4.2.2. + * 20695: Src/module.c, Src/zsh.h, Src/Modules/parameter.c, + Src/Zle/zleparameter.c: Cygwin barfs on an attempt to + use a pointer to an imported variable in a compile-time + initialiser. + * unposted: Fix .distfiles and .cvsignore for distribution. * unposted: Completion/Unix/Command/_perforce: minor comment diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c index 6b7db0387..c6a6eca71 100644 --- a/Src/Modules/parameter.c +++ b/Src/Modules/parameter.c @@ -1812,6 +1812,13 @@ struct pardef { Param pm; }; +/* + * This is a duplicate of nullsethash_gsu. On some systems + * (such as Cygwin) we can't put a pointer to an imported variable + * in a compile-time initialiser, so we use this instead. + */ +static const struct gsu_hash pmnullsethash_gsu = +{ hashgetfn, nullsethashfn, NULL }; static const struct gsu_hash pmcommands_gsu = { hashgetfn, setpmcommands, stdunsetfn }; static const struct gsu_hash pmfunctions_gsu = @@ -1848,7 +1855,7 @@ static const struct gsu_array historywords_gsu = static struct pardef partab[] = { { "parameters", PM_READONLY, - getpmparameter, scanpmparameters, &nullsethash_gsu, + getpmparameter, scanpmparameters, &pmnullsethash_gsu, NULL, NULL }, { "commands", 0, getpmcommand, scanpmcommands, &pmcommands_gsu, diff --git a/Src/Zle/zleparameter.c b/Src/Zle/zleparameter.c index ed415c960..bf6b60479 100644 --- a/Src/Zle/zleparameter.c +++ b/Src/Zle/zleparameter.c @@ -167,12 +167,19 @@ struct pardef { Param pm; }; +/* + * This is a duplicate of stdhash_gsu. On some systems + * (such as Cygwin) we can't put a pointer to an imported variable + * in a compile-time initialiser, so we use this instead. + */ +static const struct gsu_hash zlestdhash_gsu = +{ hashgetfn, hashsetfn, stdunsetfn }; static const struct gsu_array keymaps_gsu = { keymapsgetfn, arrsetfn, stdunsetfn }; static struct pardef partab[] = { { "widgets", PM_READONLY, - getpmwidgets, scanpmwidgets, &stdhash_gsu, + getpmwidgets, scanpmwidgets, &zlestdhash_gsu, NULL, NULL }, { "keymaps", PM_ARRAY|PM_SPECIAL|PM_READONLY, NULL, NULL, NULL, diff --git a/Src/module.c b/Src/module.c index 4510d3037..c50e032b6 100644 --- a/Src/module.c +++ b/Src/module.c @@ -1894,7 +1894,31 @@ addparamdef(Paramdef d) pm->level = 0; pm->u.data = d->var; - pm->gsu.i = (GsuInteger) d->gsu; + if (d->gsu) + pm->gsu.i = (GsuInteger) d->gsu; + else { + /* + * If no get/set/unset class, use the appropriate + * variable type. + */ + switch (PM_TYPE(pm->flags)) { + case PM_SCALAR: + pm->gsu.s = &varscalar_gsu; + break; + + case PM_INTEGER: + pm->gsu.i = &varinteger_gsu; + break; + + case PM_ARRAY: + pm->gsu.a = &vararray_gsu; + break; + + default: + unsetparam_pm(pm, 0, 1); + return 1; + } + } return 0; } diff --git a/Src/zsh.h b/Src/zsh.h index 065712457..5e0fee09b 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1316,12 +1316,17 @@ struct paramdef { #define PARAMDEF(name, flags, var, gsu) \ { name, flags, (void *) var, (void *) gsu, } +/* + * Note that the following definitions are appropriate for defining + * parameters that reference a variable (var). Hence the get/set/unset + * methods used will assume var needs dereferencing to get the value. + */ #define INTPARAMDEF(name, var) \ - { name, PM_INTEGER, (void *) var, (void *) &stdinteger_gsu } + { name, PM_INTEGER, (void *) var, NULL } #define STRPARAMDEF(name, var) \ - { name, PM_SCALAR, (void *) var, (void *) &varscalar_gsu } + { name, PM_SCALAR, (void *) var, NULL } #define ARRPARAMDEF(name, var) \ - { name, PM_ARRAY, (void *) var, (void *) &vararray_gsu } + { name, PM_ARRAY, (void *) var, NULL } #define setsparam(S,V) assignsparam(S,V,0) #define setaparam(S,V) assignaparam(S,V,0) -- cgit 1.4.1