summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2014-06-01 15:01:37 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2014-06-01 15:01:37 -0700
commit19f3161e51dc880093cb71584f75b77a6084d52e (patch)
tree4a33e447de32eb47ff640ffd4dea9f711d8e8539 /Src
parent10ae77c0cfee1e15fe062ee5a6d8a4b31304d58a (diff)
downloadzsh-19f3161e51dc880093cb71584f75b77a6084d52e.tar.gz
zsh-19f3161e51dc880093cb71584f75b77a6084d52e.zip
32634: add POSIX_ARGZERO option
Diffstat (limited to 'Src')
-rw-r--r--Src/init.c5
-rw-r--r--Src/options.c1
-rw-r--r--Src/params.c16
-rw-r--r--Src/zsh.h1
4 files changed, 20 insertions, 3 deletions
diff --git a/Src/init.c b/Src/init.c
index fd12412c7..5e92f59df 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -226,7 +226,7 @@ parseargs(char **argv, char **runscript)
char **x;
LinkList paramlist;
- argzero = *argv++;
+ argzero = posixzero = *argv++;
SHIN = 0;
/* There's a bit of trickery with opts[INTERACTIVE] here. It starts *
@@ -253,7 +253,7 @@ parseargs(char **argv, char **runscript)
if (*argv) {
if (unset(SHINSTDIN)) {
if (cmd)
- argzero = *argv;
+ argzero = posixzero = *argv;
else
*runscript = *argv;
opts[INTERACTIVE] &= 1;
@@ -275,6 +275,7 @@ parseargs(char **argv, char **runscript)
while ((*x++ = (char *)getlinknode(paramlist)));
free(paramlist);
argzero = ztrdup(argzero);
+ posixzero = ztrdup(posixzero);
}
/* Insert into list in order of pointer value */
diff --git a/Src/options.c b/Src/options.c
index ce73d9901..e83dc5839 100644
--- a/Src/options.c
+++ b/Src/options.c
@@ -207,6 +207,7 @@ static struct optname optns[] = {
{{NULL, "pathscript", OPT_EMULATE|OPT_BOURNE}, PATHSCRIPT},
{{NULL, "pipefail", OPT_EMULATE}, PIPEFAIL},
{{NULL, "posixaliases", OPT_EMULATE|OPT_BOURNE}, POSIXALIASES},
+{{NULL, "posixargzero", OPT_EMULATE}, POSIXARGZERO},
{{NULL, "posixbuiltins", OPT_EMULATE|OPT_BOURNE}, POSIXBUILTINS},
{{NULL, "posixcd", OPT_EMULATE|OPT_BOURNE}, POSIXCD},
{{NULL, "posixidentifiers", OPT_EMULATE|OPT_BOURNE}, POSIXIDENTIFIERS},
diff --git a/Src/params.c b/Src/params.c
index 790102923..0699ead85 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -67,6 +67,7 @@ char **path, /* $path */
/**/
mod_export
char *argzero, /* $0 */
+ *posixzero, /* $0 */
*home, /* $HOME */
*nullcmd, /* $NULLCMD */
*oldpwd, /* $OLDPWD */
@@ -194,6 +195,8 @@ static const struct gsu_integer euid_gsu =
static const struct gsu_integer ttyidle_gsu =
{ ttyidlegetfn, nullintsetfn, stdunsetfn };
+static const struct gsu_scalar argzero_gsu =
+{ argzerogetfn, nullstrsetfn, nullunsetfn };
static const struct gsu_scalar username_gsu =
{ usernamegetfn, usernamesetfn, stdunsetfn };
static const struct gsu_scalar dash_gsu =
@@ -285,6 +288,7 @@ IPDEF2("WORDCHARS", wordchars_gsu, 0),
IPDEF2("IFS", ifs_gsu, PM_DONTIMPORT),
IPDEF2("_", underscore_gsu, PM_DONTIMPORT),
IPDEF2("KEYBOARD_HACK", keyboard_hack_gsu, PM_DONTIMPORT),
+IPDEF2("0", argzero_gsu, 0),
#ifdef USE_LOCALE
# define LCIPDEF(name) IPDEF2(name, lc_blah_gsu, PM_UNSET)
@@ -340,7 +344,6 @@ IPDEF7U("RPROMPT2", &rprompt2),
IPDEF7("PS3", &prompt3),
IPDEF7("PS4", &prompt4),
IPDEF7("SPROMPT", &sprompt),
-IPDEF7("0", &argzero),
#define IPDEF8(A,B,C,D) {{NULL,A,D|PM_SCALAR|PM_SPECIAL},BR((void *)B),GSU(colonarr_gsu),0,0,NULL,C,NULL,0}
IPDEF8("CDPATH", &cdpath, "cdpath", 0),
@@ -3981,6 +3984,17 @@ lcsetfn(Param pm, char *x)
}
#endif /* USE_LOCALE */
+/* Function to get value for special parameter `0' */
+
+/**/
+static char *
+argzerogetfn(UNUSED(Param pm))
+{
+ if (isset(POSIXARGZERO))
+ return posixzero;
+ return argzero;
+}
+
/* Function to get value for special parameter `HISTSIZE' */
/**/
diff --git a/Src/zsh.h b/Src/zsh.h
index 5fbff5767..620883b81 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -2151,6 +2151,7 @@ enum {
PATHSCRIPT,
PIPEFAIL,
POSIXALIASES,
+ POSIXARGZERO,
POSIXBUILTINS,
POSIXCD,
POSIXIDENTIFIERS,