reorganise c_typeset code, fixing that regression test

also some int→bool while here
This commit is contained in:
tg 2008-04-01 21:39:45 +00:00
parent 828fbed741
commit 3ad04ea095
2 changed files with 57 additions and 36 deletions

28
check.t
View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.171 2008/04/01 21:07:20 tg Exp $ # $MirOS: src/bin/mksh/check.t,v 1.172 2008/04/01 21:39:44 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 $
@ -3741,10 +3741,10 @@ stdin:
FNORD_B=2 FNORD_B=2
FNORD_C=3 FNORD_C=3
FNORD_D=4 FNORD_D=4
FNORD_E=1 FNORD_E=5
FNORD_F=2 FNORD_F=6
FNORD_G=3 FNORD_G=7
FNORD_H=4 FNORD_H=8
integer FNORD_E FNORD_F FNORD_G FNORD_H integer FNORD_E FNORD_F FNORD_G FNORD_H
export FNORD_C FNORD_D FNORD_G FNORD_H export FNORD_C FNORD_D FNORD_G FNORD_H
readonly FNORD_B FNORD_D FNORD_F FNORD_H readonly FNORD_B FNORD_D FNORD_F FNORD_H
@ -3761,6 +3761,8 @@ stdin:
print FNORD-6 print FNORD-6
typeset -p typeset -p
print FNORD-7 print FNORD-7
typeset -
print FNORD-8
} | fgrep FNORD } | fgrep FNORD
expected-stdout: expected-stdout:
FNORD-0 FNORD-0
@ -3772,8 +3774,8 @@ expected-stdout:
FNORD-2 FNORD-2
export FNORD_C=3 export FNORD_C=3
export FNORD_D=4 export FNORD_D=4
export FNORD_G=3 export FNORD_G=7
export FNORD_H=4 export FNORD_H=8
FNORD-3 FNORD-3
FNORD_B FNORD_B
FNORD_D FNORD_D
@ -3782,8 +3784,8 @@ expected-stdout:
FNORD-4 FNORD-4
readonly FNORD_B=2 readonly FNORD_B=2
readonly FNORD_D=4 readonly FNORD_D=4
readonly FNORD_F=2 readonly FNORD_F=6
readonly FNORD_H=4 readonly FNORD_H=8
FNORD-5 FNORD-5
typeset FNORD_A typeset FNORD_A
typeset -r FNORD_B typeset -r FNORD_B
@ -3807,10 +3809,10 @@ expected-stdout:
FNORD_B=2 FNORD_B=2
FNORD_C=3 FNORD_C=3
FNORD_D=4 FNORD_D=4
FNORD_E=1 FNORD_E=5
FNORD_F=2 FNORD_F=6
FNORD_G=3 FNORD_G=7
FNORD_H=4 FNORD_H=8
FNORD-8 FNORD-8
--- ---
name: syntax-1 name: syntax-1

65
funcs.c
View File

@ -5,7 +5,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.72 2008/03/28 18:46:59 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.73 2008/04/01 21:39:45 tg Exp $");
/* A leading = means assignments before command are kept; /* A leading = means assignments before command are kept;
* a leading * means a POSIX special builtin; * a leading * means a POSIX special builtin;
@ -686,32 +686,32 @@ c_typeset(const char **wp)
{ {
struct block *l; struct block *l;
struct tbl *vp, **p; struct tbl *vp, **p;
Tflag fset = 0, fclr = 0; Tflag fset = 0, fclr = 0, flag;
int thing = 0, func = 0, localv = 0; int thing = 0, field, base, optc;
const char *opts = "L#R#UZ#fi#lprtux"; /* see comment below */ const char *opts;
const char *fieldstr, *basestr; const char *fieldstr, *basestr;
int field, base; bool localv = false, func = false, pflag = false, istset = true;
int optc;
Tflag flag;
int pflag = 0;
switch (**wp) { switch (**wp) {
case 'e': /* export */ case 'e': /* export */
fset |= EXPORT; fset |= EXPORT;
opts = "p"; istset = false;
break; break;
case 'r': /* readonly */ case 'r': /* readonly */
fset |= RDONLY; fset |= RDONLY;
opts = "p"; istset = false;
break; break;
case 's': /* set */ case 's': /* set */
/* called with 'typeset -' */ /* called with 'typeset -' */
break; break;
case 't': /* typeset */ case 't': /* typeset */
localv = 1; localv = true;
break; break;
} }
/* see comment below regarding possible opions */
opts = istset ? "L#R#UZ#fi#lprtux" : "p";
fieldstr = basestr = NULL; fieldstr = basestr = NULL;
builtin_opt.flags |= GF_PLUSOPT; builtin_opt.flags |= GF_PLUSOPT;
/* at&t ksh seems to have 0-9 as options which are multiplied /* at&t ksh seems to have 0-9 as options which are multiplied
@ -745,7 +745,7 @@ c_typeset(const char **wp)
fieldstr = builtin_opt.optarg; fieldstr = builtin_opt.optarg;
break; break;
case 'f': case 'f':
func = 1; func = true;
break; break;
case 'i': case 'i':
flag = INTEGER; flag = INTEGER;
@ -755,12 +755,12 @@ c_typeset(const char **wp)
flag = LCASEV; flag = LCASEV;
break; break;
case 'p': case 'p':
/* posix export/readonly -p flag. /* export, readonly: POSIX -p flag */
* typeset -p is the same as typeset (in pdksh); /* typeset: show values as well */
* here for compatibility with ksh93. pflag = true;
*/ if (istset)
pflag = 1; continue;
continue; break;
case 'r': case 'r':
flag = RDONLY; flag = RDONLY;
break; break;
@ -939,13 +939,32 @@ c_typeset(const char **wp)
if ((vp->flag&UCASEV_AL)) if ((vp->flag&UCASEV_AL))
shprintf("-u "); shprintf("-u ");
if ((vp->flag&INT_U)) if ((vp->flag&INT_U))
shprintf("-U "); shf_puts("-U ", shl_stdout);
shprintf("%s\n", vp->name); shf_puts(vp->name, shl_stdout);
if (vp->flag&ARRAY) if (pflag) {
break; char *s = str_val(vp);
shf_putc('=', shl_stdout);
/* at&t ksh can't have
* justified integers.. */
if ((vp->flag &
(INTEGER|LJUST|RJUST)) ==
INTEGER)
shf_puts(s, shl_stdout);
else
print_value_quoted(s);
}
shf_putc('\n', shl_stdout);
if (vp->flag & ARRAY)
break;
} else { } else {
if (pflag) if (pflag)
shprintf("typeset "); shf_puts(istset ?
"typeset " :
(flag & EXPORT) ?
"export " :
"readonly ",
shl_stdout);
if ((vp->flag&ARRAY) && any_set) if ((vp->flag&ARRAY) && any_set)
shprintf("%s[%lu]", shprintf("%s[%lu]",
vp->name, vp->name,