do implement quoting, as ${foo@Q} though, as hommage at mirmake
dedicate this “release” to Andi and use tomorrow’s (UTC) day for version, to cover up my debian fuckup
This commit is contained in:
parent
403c7c8e50
commit
058e7f8ed4
28
check.t
28
check.t
@ -1,4 +1,4 @@
|
|||||||
# $MirOS: src/bin/mksh/check.t,v 1.550 2012/07/01 15:54:51 tg Exp $
|
# $MirOS: src/bin/mksh/check.t,v 1.551 2012/07/20 23:22:07 tg Exp $
|
||||||
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
||||||
@ -29,7 +29,7 @@
|
|||||||
# http://www.freebsd.org/cgi/cvsweb.cgi/src/tools/regression/bin/test/regress.sh?rev=HEAD
|
# http://www.freebsd.org/cgi/cvsweb.cgi/src/tools/regression/bin/test/regress.sh?rev=HEAD
|
||||||
|
|
||||||
expected-stdout:
|
expected-stdout:
|
||||||
@(#)MIRBSD KSH R40 2012/07/01
|
@(#)MIRBSD KSH R40 2012/07/21
|
||||||
description:
|
description:
|
||||||
Check version of shell.
|
Check version of shell.
|
||||||
stdin:
|
stdin:
|
||||||
@ -38,7 +38,7 @@ name: KSH_VERSION
|
|||||||
category: shell:legacy-no
|
category: shell:legacy-no
|
||||||
---
|
---
|
||||||
expected-stdout:
|
expected-stdout:
|
||||||
@(#)LEGACY KSH R40 2012/07/01
|
@(#)LEGACY KSH R40 2012/07/21
|
||||||
description:
|
description:
|
||||||
Check version of legacy shell.
|
Check version of legacy shell.
|
||||||
stdin:
|
stdin:
|
||||||
@ -7251,6 +7251,28 @@ expected-stdout:
|
|||||||
554A1C76 004A212E CB209562 .
|
554A1C76 004A212E CB209562 .
|
||||||
6B21CF91 20E5DB5B 124EA49D .
|
6B21CF91 20E5DB5B 124EA49D .
|
||||||
---
|
---
|
||||||
|
name: varexpand-special-quote
|
||||||
|
description:
|
||||||
|
Check special ${var@Q} expansion for quoted strings
|
||||||
|
stdin:
|
||||||
|
set +U
|
||||||
|
i=x
|
||||||
|
j=a\ b
|
||||||
|
k=$'c
|
||||||
|
d\xA0''e€f'
|
||||||
|
print -r -- "<i=$i j=$j k=$k>"
|
||||||
|
s="u=${i@Q} v=${j@Q} w=${k@Q}"
|
||||||
|
print -r -- "s=\"$s\""
|
||||||
|
eval "$s"
|
||||||
|
typeset -p u v w
|
||||||
|
expected-stdout:
|
||||||
|
<i=x j=a b k=c
|
||||||
|
d e€f>
|
||||||
|
s="u=x v='a b' w=$'c\nd\240e\u20ACf'"
|
||||||
|
typeset u=x
|
||||||
|
typeset v='a b'
|
||||||
|
typeset w=$'c\nd\240e\u20ACf'
|
||||||
|
---
|
||||||
name: varexpand-null-1
|
name: varexpand-null-1
|
||||||
description:
|
description:
|
||||||
Ensure empty strings expand emptily
|
Ensure empty strings expand emptily
|
||||||
|
17
eval.c
17
eval.c
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.120 2012/06/28 20:03:20 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.121 2012/07/20 23:22:10 tg Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* string expansion
|
* string expansion
|
||||||
@ -406,6 +406,15 @@ expand(const char *cp, /* input word */
|
|||||||
(unsigned int)h);
|
(unsigned int)h);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 0x100 | 'Q':
|
||||||
|
{
|
||||||
|
struct shf shf;
|
||||||
|
|
||||||
|
shf_sopen(NULL, 0, SHF_WR|SHF_DYNAMIC, &shf);
|
||||||
|
print_value_quoted(&shf, str_val(st->var));
|
||||||
|
x.str = shf_sclose(&shf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case '0': {
|
case '0': {
|
||||||
char *beg, *mid, *end, *stg;
|
char *beg, *mid, *end, *stg;
|
||||||
mksh_ari_t from = 0, num = -1, flen, finc = 0;
|
mksh_ari_t from = 0, num = -1, flen, finc = 0;
|
||||||
@ -734,6 +743,7 @@ expand(const char *cp, /* input word */
|
|||||||
case '0':
|
case '0':
|
||||||
case '/':
|
case '/':
|
||||||
case 0x100 | '#':
|
case 0x100 | '#':
|
||||||
|
case 0x100 | 'Q':
|
||||||
dp = Xrestpos(ds, dp, st->base);
|
dp = Xrestpos(ds, dp, st->base);
|
||||||
type = XSUB;
|
type = XSUB;
|
||||||
if (f&DOBLANK)
|
if (f&DOBLANK)
|
||||||
@ -1161,6 +1171,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
case '0':
|
case '0':
|
||||||
case '/':
|
case '/':
|
||||||
case 0x100 | '#':
|
case 0x100 | '#':
|
||||||
|
case 0x100 | 'Q':
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if (e->loc->argc == 0) {
|
if (e->loc->argc == 0) {
|
||||||
@ -1188,6 +1199,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
case '0':
|
case '0':
|
||||||
case '/':
|
case '/':
|
||||||
case 0x100 | '#':
|
case 0x100 | '#':
|
||||||
|
case 0x100 | 'Q':
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
XPinit(wv, 32);
|
XPinit(wv, 32);
|
||||||
@ -1244,7 +1256,8 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
if (((stype < 0x100) && (ctype(c, C_SUBOP2) || c == '/' ||
|
if (((stype < 0x100) && (ctype(c, C_SUBOP2) || c == '/' ||
|
||||||
(((stype&0x80) ? *xp->str=='\0' : xp->str==null) ? /* undef? */
|
(((stype&0x80) ? *xp->str=='\0' : xp->str==null) ? /* undef? */
|
||||||
c == '=' || c == '-' || c == '?' : c == '+'))) ||
|
c == '=' || c == '-' || c == '?' : c == '+'))) ||
|
||||||
stype == (0x80 | '0') || stype == (0x100 | '#'))
|
stype == (0x80 | '0') || stype == (0x100 | '#') ||
|
||||||
|
stype == (0x100 | 'Q'))
|
||||||
/* expand word instead of variable value */
|
/* expand word instead of variable value */
|
||||||
state = XBASE;
|
state = XBASE;
|
||||||
if (Flag(FNOUNSET) && xp->str == null && !zero_ok &&
|
if (Flag(FNOUNSET) && xp->str == null && !zero_ok &&
|
||||||
|
9
mksh.1
9
mksh.1
@ -1,4 +1,4 @@
|
|||||||
.\" $MirOS: src/bin/mksh/mksh.1,v 1.288 2012/06/29 08:11:45 tg Exp $
|
.\" $MirOS: src/bin/mksh/mksh.1,v 1.289 2012/07/20 23:22:11 tg Exp $
|
||||||
.\" $OpenBSD: ksh.1,v 1.143 2012/06/19 16:41:00 jmc Exp $
|
.\" $OpenBSD: ksh.1,v 1.143 2012/06/19 16:41:00 jmc Exp $
|
||||||
.\"-
|
.\"-
|
||||||
.\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
.\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
||||||
@ -74,7 +74,7 @@
|
|||||||
.\" with -mandoc, it might implement .Mx itself, but we want to
|
.\" with -mandoc, it might implement .Mx itself, but we want to
|
||||||
.\" use our own definition. And .Dd must come *first*, always.
|
.\" use our own definition. And .Dd must come *first*, always.
|
||||||
.\"
|
.\"
|
||||||
.Dd $Mdocdate: June 29 2012 $
|
.Dd $Mdocdate: July 20 2012 $
|
||||||
.\"
|
.\"
|
||||||
.\" Check which macro package we use, and do other -mdoc setup.
|
.\" Check which macro package we use, and do other -mdoc setup.
|
||||||
.\"
|
.\"
|
||||||
@ -1635,6 +1635,11 @@ with an optional (defaulting to zero)
|
|||||||
At the moment, this is NZAAT (a 32-bit hash based on
|
At the moment, this is NZAAT (a 32-bit hash based on
|
||||||
Bob Jenkins' one-at-a-time hash), but this is not set.
|
Bob Jenkins' one-at-a-time hash), but this is not set.
|
||||||
This is the hash the shell uses internally for its associative arrays.
|
This is the hash the shell uses internally for its associative arrays.
|
||||||
|
.Pp
|
||||||
|
.It Pf ${ Ns Ar name Ns @Q}
|
||||||
|
A quoted expression safe for re-entry, whose value is the value of the
|
||||||
|
.Ar name
|
||||||
|
parameter, is substituted.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Note that
|
Note that
|
||||||
|
4
sh.h
4
sh.h
@ -157,9 +157,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EXTERN
|
#ifdef EXTERN
|
||||||
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.572 2012/07/01 15:54:57 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.573 2012/07/20 23:22:13 tg Exp $");
|
||||||
#endif
|
#endif
|
||||||
#define MKSH_VERSION "R40 2012/07/01"
|
#define MKSH_VERSION "R40 2012/07/21"
|
||||||
|
|
||||||
/* arithmetic types: C implementation */
|
/* arithmetic types: C implementation */
|
||||||
#if !HAVE_CAN_INTTYPES
|
#if !HAVE_CAN_INTTYPES
|
||||||
|
Loading…
x
Reference in New Issue
Block a user