From 8d5c0c77609d814de7c0749602a595236f76b487 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Wed, 23 Sep 2015 23:16:38 -0700 Subject: 36604: fix getopts+shift calculation --- Functions/Misc/zrecompile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Functions/Misc') diff --git a/Functions/Misc/zrecompile b/Functions/Misc/zrecompile index 8fe990086..d9fc55020 100644 --- a/Functions/Misc/zrecompile +++ b/Functions/Misc/zrecompile @@ -52,7 +52,7 @@ while getopts ":tqp" opt; do fi esac done -shift OPTIND-${#tmp:-1} +shift OPTIND-${#tmp}-1 if [[ -n $check ]]; then ret=1 -- cgit v1.2.3 From 196e6a0ec022fb2fc22820a346b5f206a3cf40ac Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 1 Oct 2015 15:55:01 +0100 Subject: 36735: add ~/.zcalcrc handling to zcalc --- ChangeLog | 2 ++ Doc/Zsh/contrib.yo | 8 ++++++++ Functions/Misc/zcalc | 4 ++++ 3 files changed, 14 insertions(+) (limited to 'Functions/Misc') diff --git a/ChangeLog b/ChangeLog index 4a9d1cebc..a51dc4795 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2015-10-01 Peter Stephenson + * 36735: Doc/Zsh/contrib.yo, Functions/Misc/zcalc: ~/.zcalcrc. + * Andrew Janke: 36729: MACHINES, NEWS, README: fix some typos. * 36722: Completion/Unix/Command/_git: allow range to complete diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo index 330c6f588..635f9b010 100644 --- a/Doc/Zsh/contrib.yo +++ b/Doc/Zsh/contrib.yo @@ -3657,6 +3657,14 @@ integer arithmetic, which is not how an ordinary desk calculator operates. To force floating point operation, pass the option tt(-f); see further notes below. +If the file tt(~/.zcalcrc) exists it will be sourced inside the function +once it is set up and about to process the command line. This +can be used, for example, to set shell options; tt(emulate -L zsh) +and tt(setopt extendedglob) are in effect at this point. Any +failure to source the file if it exists is treated as fatal. +As with other initialisation files, the directory tt($ZDOTDIR) is used +instead of tt($HOME) if it is set. + The mathematical library tt(zsh/mathfunc) will be loaded if it is available; see ifzman(the section `The zsh/mathfunc Module' in zmanref(zshmodules))\ diff --git a/Functions/Misc/zcalc b/Functions/Misc/zcalc index 63f67adb0..17700e48b 100644 --- a/Functions/Misc/zcalc +++ b/Functions/Misc/zcalc @@ -120,6 +120,10 @@ autoload -Uz zmathfuncdef float PI E (( PI = 4 * atan(1), E = exp(1) )) +if [[ -f "${ZDOTDIR:-$HOME}/.zcalcrc" ]]; then + . "${ZDOTDIR:-$HOME}/.zcalcrc" || return 1 +fi + # Process command line while [[ -n $1 && $1 = -(|[#-]*|f|e) ]]; do optlist=${1[2,-1]} -- cgit v1.2.3 From 0628802baf5c9245138db82dd058cad023a7d0ae Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 29 Oct 2015 15:01:07 +0000 Subject: 37014: Improved internal parameter setting. Enhance WARNCREATEGLOBAL to work in many more cases. Don't create REPLY as an integer if it didn't previously exist as one, even if the value to be set is integral, as this is likely to mess up later uses of REPLY. --- ChangeLog | 11 +++++++++ Functions/MIME/zsh-mime-setup | 2 +- Functions/Misc/add-zsh-hook | 2 ++ Src/Modules/socket.c | 6 ++--- Src/Modules/tcp.c | 6 ++--- Src/Modules/zpty.c | 2 +- Src/builtin.c | 38 ++++++++++++++++++------------- Src/params.c | 53 +++++++++++++++++++++++++++++++++++++++++-- Src/zsh.h | 3 --- 9 files changed, 94 insertions(+), 29 deletions(-) (limited to 'Functions/Misc') diff --git a/ChangeLog b/ChangeLog index 0c38b2697..9454013cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2015-10-29 Peter Stephenson + + * 37014: Functions/MIME/zsh-mime-setup, + Functions/Misc/add-zsh-hook, Src/Modules/socket.c, + Src/Modules/tcp.c, Src/Modules/zpty.c, Src/builtin.c, + Src/params.c,Src/zsh.h: improved internal parameter setting. + Enhance WARNCREATEGLOBAL to work in many more cases. Don't + create REPLY as an integer if it didn't previously exist as one, + even if the value to be set is integral, as this is likely to + mess up later uses of REPLY. + 2015-10-29 Jun-ichi Takimoto * 36983 (with fix from 36990): Completion/Unix/Command/_head, diff --git a/Functions/MIME/zsh-mime-setup b/Functions/MIME/zsh-mime-setup index 23e44fdc0..35f6e6b6b 100644 --- a/Functions/MIME/zsh-mime-setup +++ b/Functions/MIME/zsh-mime-setup @@ -1,7 +1,7 @@ emulate -L zsh setopt extendedglob cbases -local opt o_verbose o_list +local opt o_verbose o_list i autoload -Uz zsh-mime-handler diff --git a/Functions/Misc/add-zsh-hook b/Functions/Misc/add-zsh-hook index ee37d674d..fc39659ae 100644 --- a/Functions/Misc/add-zsh-hook +++ b/Functions/Misc/add-zsh-hook @@ -82,9 +82,11 @@ if (( del )); then else if (( ${(P)+hook} )); then if (( ${${(P)hook}[(I)$fn]} == 0 )); then + typeset -ga $hook set -A $hook ${(P)hook} $fn fi else + typeset -ga $hook set -A $hook $fn fi autoload $autoopts -- $fn diff --git a/Src/Modules/socket.c b/Src/Modules/socket.c index f683496df..7c3fb5ebe 100644 --- a/Src/Modules/socket.c +++ b/Src/Modules/socket.c @@ -132,7 +132,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func)) /* allow to be closed explicitly */ fdtable[sfd] = FDT_EXTERNAL; - setiparam("REPLY", sfd); + setiparam_no_convert("REPLY", (zlong)sfd); if (verbose) printf("%s listener is on fd %d\n", soun.sun_path, sfd); @@ -220,7 +220,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func)) sfd = rfd; } - setiparam("REPLY", sfd); + setiparam_no_convert("REPLY", (zlong)sfd); if (verbose) printf("new connection from %s is on fd %d\n", soun.sun_path, sfd); @@ -261,7 +261,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func)) fdtable[sfd] = FDT_EXTERNAL; } - setiparam("REPLY", sfd); + setiparam_no_convert("REPLY", (zlong)sfd); if (verbose) printf("%s is now on fd %d\n", soun.sun_path, sfd); diff --git a/Src/Modules/tcp.c b/Src/Modules/tcp.c index 7b0dcc74a..9fc1b29a2 100644 --- a/Src/Modules/tcp.c +++ b/Src/Modules/tcp.c @@ -461,7 +461,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func)) return 1; } - setiparam("REPLY", sess->fd); + setiparam_no_convert("REPLY", (zlong)sess->fd); if (verbose) printf("%d listener is on fd %d\n", ntohs(sess->sock.in.sin_port), sess->fd); @@ -562,7 +562,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func)) sess->fd = rfd; } - setiparam("REPLY", sess->fd); + setiparam_no_convert("REPLY", (zlong)sess->fd); if (verbose) printf("%d is on fd %d\n", ntohs(sess->peer.in.sin_port), sess->fd); @@ -681,7 +681,7 @@ bin_ztcp(char *nam, char **args, Options ops, UNUSED(int func)) } } - setiparam("REPLY", sess->fd); + setiparam_no_convert("REPLY", (zlong)sess->fd); if (verbose) printf("%s:%d is now on fd %d\n", diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index 9741ee287..3b8366076 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -464,7 +464,7 @@ newptycmd(char *nam, char *pname, char **args, int echo, int nblock) #endif errno == EINTR)); - setiparam("REPLY", master); + setiparam_no_convert("REPLY", (zlong)master); return 0; } diff --git a/Src/builtin.c b/Src/builtin.c index 97022addf..8045bc8f7 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -2090,7 +2090,9 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), tc = 0; /* but don't do a normal conversion */ } } else if (!setsecondstype(pm, on, off)) { - if (asg->value.scalar && !(pm = setsparam(pname, ztrdup(asg->value.scalar)))) + if (asg->value.scalar && + !(pm = assignsparam( + pname, ztrdup(asg->value.scalar), 0))) return NULL; usepm = 1; err = 0; @@ -2202,12 +2204,13 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), } else if (pm->env && !(pm->node.flags & PM_HASHELEM)) delenv(pm); DPUTS(ASG_ARRAYP(asg), "BUG: typeset got array value where scalar expected"); - if (asg->value.scalar && !(pm = setsparam(pname, ztrdup(asg->value.scalar)))) + if (asg->value.scalar && + !(pm = assignsparam(pname, ztrdup(asg->value.scalar), 0))) return NULL; } else if (asg->is_array) { - if (!(pm = setaparam(pname, asg->value.array ? + if (!(pm = assignaparam(pname, asg->value.array ? zlinklist2array(asg->value.array) : - mkarray(NULL)))) + mkarray(NULL), 0))) return NULL; } pm->node.flags |= (on & PM_READONLY); @@ -2347,16 +2350,18 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), * creating a stray parameter along the way via createparam(), * now called below in the isident() branch. */ - if (!(pm = setsparam(pname, ztrdup(asg->value.scalar ? asg->value.scalar : "")))) + if (!(pm = assignsparam( + pname, + ztrdup(asg->value.scalar ? asg->value.scalar : ""), 0))) return NULL; dont_set = 1; asg->is_array = 0; keeplocal = 0; on = pm->node.flags; } else if (PM_TYPE(on) == PM_ARRAY && ASG_ARRAYP(asg)) { - if (!(pm = setaparam(pname, asg->value.array ? - zlinklist2array(asg->value.array) : - mkarray(NULL)))) + if (!(pm = assignaparam(pname, asg->value.array ? + zlinklist2array(asg->value.array) : + mkarray(NULL), 0))) return NULL; dont_set = 1; keeplocal = 0; @@ -2433,13 +2438,13 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), Param ipm = pm; if (pm->node.flags & (PM_ARRAY|PM_HASHED)) { DPUTS(!ASG_ARRAYP(asg), "BUG: inconsistent scalar value for array"); - if (!(pm=setaparam(pname, asg->value.array ? - zlinklist2array(asg->value.array) : - mkarray(NULL)))) + if (!(pm=assignaparam(pname, asg->value.array ? + zlinklist2array(asg->value.array) : + mkarray(NULL), 0))) return NULL; } else { DPUTS(ASG_ARRAYP(asg), "BUG: inconsistent array value for scalar"); - if (!(pm = setsparam(pname, ztrdup(asg->value.scalar)))) + if (!(pm = assignsparam(pname, ztrdup(asg->value.scalar), 0))) return NULL; } if (pm != ipm) { @@ -2687,9 +2692,10 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func) /* Update join character */ tdp->joinchar = joinchar; if (asg0.value.scalar) - setsparam(asg0.name, ztrdup(asg0.value.scalar)); + assignsparam(asg0.name, ztrdup(asg0.value.scalar), 0); else if (asg->value.array) - setaparam(asg->name, zlinklist2array(asg->value.array)); + assignaparam( + asg->name, zlinklist2array(asg->value.array), 0); return 0; } else { zwarnnam(name, "can't tie already tied scalar: %s", @@ -2750,9 +2756,9 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func) zsfree(apm->ename); apm->ename = ztrdup(asg0.name); if (asg->value.array) - setaparam(asg->name, zlinklist2array(asg->value.array)); + assignaparam(asg->name, zlinklist2array(asg->value.array), 0); else if (oldval) - setsparam(asg0.name, oldval); + assignsparam(asg0.name, oldval, 0); unqueue_signals(); return 0; diff --git a/Src/params.c b/Src/params.c index a8abb289e..4d33660fb 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2826,6 +2826,15 @@ assignsparam(char *s, char *val, int flags) return v->pm; } +/**/ +mod_export Param +setsparam(char *s, char *val) +{ + return assignsparam( + s, val, isset(WARNCREATEGLOBAL) && locallevel > 0 ? + ASSPM_WARN_CREATE : 0); +} + /**/ mod_export Param assignaparam(char *s, char **val, int flags) @@ -2914,6 +2923,16 @@ assignaparam(char *s, char **val, int flags) return v->pm; } + +/**/ +mod_export Param +setaparam(char *s, char **aval) +{ + return assignaparam( + s, aval, isset(WARNCREATEGLOBAL) && locallevel >0 ? + ASSPM_WARN_CREATE : 0); +} + /**/ mod_export Param sethparam(char *s, char **val) @@ -2937,11 +2956,15 @@ sethparam(char *s, char **val) if (unset(EXECOPT)) return NULL; queue_signals(); - if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) + if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) { createparam(t, PM_HASHED); - else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) && + if (isset(WARNCREATEGLOBAL) && locallevel > 0 && v->pm->level == 0) + zwarn("associative array parameter %s created globally in function", + v->pm->node.nam); + } else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) && !(v->pm->node.flags & PM_SPECIAL)) { unsetparam(t); + /* no WARNCREATEGLOBAL check here as parameter already existed */ createparam(t, PM_HASHED); v = NULL; } @@ -2968,6 +2991,7 @@ setnparam(char *s, mnumber val) Value v; char *t = s, *ss; Param pm; + int was_unset = 0; if (!isident(s)) { zerr("not an identifier: %s", s); @@ -2987,6 +3011,7 @@ setnparam(char *s, mnumber val) */ unset(KSHARRAYS) && !ss) { unsetparam_pm(v->pm, 0, 1); + was_unset = 1; s = t; v = NULL; } @@ -3007,6 +3032,10 @@ setnparam(char *s, mnumber val) } v = getvalue(&vbuf, &t, 1); DPUTS(!v, "BUG: value not found for new parameter"); + if (!was_unset && isset(WARNCREATEGLOBAL) && locallevel > 0 && + v->pm->level == 0) + zwarn("numeric parameter %s created globally in function", + v->pm->node.nam); } setnumvalue(v, val); unqueue_signals(); @@ -3025,6 +3054,26 @@ setiparam(char *s, zlong val) return setnparam(s, mnval); } +/* + * Set an integer parameter without forcing creation of an integer type. + * This is useful if the integer is going to be set to a parmaeter which + * would usually be scalar but may not exist. + */ + +/**/ +mod_export Param +setiparam_no_convert(char *s, zlong val) +{ + /* + * If the target is already an integer, thisgets converted + * back. Low technology rules. + */ + char buf[BDIGBUFSIZE]; + convbase(buf, val, 10); + return assignsparam( + s, ztrdup(buf), + isset(WARNCREATEGLOBAL) && locallevel > 0 ? ASSPM_WARN_CREATE : 0); +} /* Unset a parameter */ diff --git a/Src/zsh.h b/Src/zsh.h index f819249c3..d03d171e4 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1939,9 +1939,6 @@ struct paramdef { { name, flags | PM_SPECIAL | PM_HIDE | PM_HIDEVAL, \ NULL, gsufn, getfn, scanfn, NULL } -#define setsparam(S,V) assignsparam(S,V,0) -#define setaparam(S,V) assignaparam(S,V,0) - /* * Flags for assignsparam and assignaparam. */ -- cgit v1.2.3 From 607a7a85b65527fb98e1a47c02dca6a777595eec Mon Sep 17 00:00:00 2001 From: Eric Cook Date: Sat, 31 Oct 2015 19:06:47 +0100 Subject: 36993: zed: fix argument parsing --- ChangeLog | 4 ++++ Functions/Misc/zed | 31 ++++++++++--------------------- 2 files changed, 14 insertions(+), 21 deletions(-) (limited to 'Functions/Misc') diff --git a/ChangeLog b/ChangeLog index a35b6056f..9068f13a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2015-10-31 Oliver Kiddle + + * 36993: Eric Cook: Functions/Misc/zed: fix argument parsing + 2015-10-31 Barton E. Schaefer * unposted (cf. 36998,36999): Src/mem.c: undo 36956 / restore 34451 diff --git a/Functions/Misc/zed b/Functions/Misc/zed index 010b69bee..94dd9ce5b 100644 --- a/Functions/Misc/zed +++ b/Functions/Misc/zed @@ -6,31 +6,20 @@ # Use ^X^W to save, ^C to abort. # Option -f: edit shell functions. (Also if called as fned.) -local var opt zed_file_name +local var opts zed_file_name # We do not want timeout while we are editing a file integer TMOUT=0 okargs=1 fun bind local -a expand -while getopts "fbx:" opt; do - case $opt in - (f) - fun=1 - ;; - - (b) - bind=1 - ;; - - (x) - if [[ $OPTARG != <-> ]]; then - print -r "Integer expected after -x: $OPTARG" >&2 - return 1 - fi - expand=(-x $OPTARG) - ;; - esac -done -shift $(( OPTIND - 1 )) +zparseopts -D -A opts f b x: +fun=$+opts[-f] +bind=$+opts[-b] +if [[ $opts[-x] == <-> ]]; then + expand=(-x $opts[-x]) +elif (( $+opts[-x] )); then + print -r "Integer expected after -x: $opts[-x]" >&2 + return 1 +fi [[ $0 = fned ]] && fun=1 (( bind )) && okargs=0 -- cgit v1.2.3 From 8d1e882b78e3ccc3d66cfc61e1d7e3e53f60d67f Mon Sep 17 00:00:00 2001 From: Eric Cook Date: Tue, 27 Oct 2015 12:15:47 -0400 Subject: zed: Add -- to the `functions' builtin calls Reported on IRC: % autoload zed; zed -f -- "-zgen-prezto-load" zed:83: bad option: -g -zgen-prezto-load() { } --- ChangeLog | 6 ++++-- Functions/Misc/zed | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'Functions/Misc') diff --git a/ChangeLog b/ChangeLog index 69f5182b9..0c26ced2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,9 @@ 2015-11-16 Mikael Magnusson - * Eric Cook: 37050: Completion/BSD/Command/_sockstat: _sockstat: - minor improvements + * Eric Cook: 36986: Functions/Misc/zed: Add -- to the `functions' + builtin calls + + * Eric Cook: 37050: Completion/BSD/Command/_sockstat: minor improvements 2015-11-15 Barton E. Schaefer diff --git a/Functions/Misc/zed b/Functions/Misc/zed index 94dd9ce5b..eb8f557ea 100644 --- a/Functions/Misc/zed +++ b/Functions/Misc/zed @@ -69,10 +69,10 @@ fi setopt localoptions nobanghist if ((fun)) then - var="$(functions $expand $1)" + var="$(functions $expand -- $1)" # If function is undefined but autoloadable, load it if [[ $var = *\#\ undefined* ]] then - var="$(autoload +X $1; functions $1)" + var="$(autoload +X $1; functions -- $1)" elif [[ -z $var ]] then var="$1() { }" -- cgit v1.2.3