diff --git a/check.t b/check.t index ffa083f..f8e3456 100644 --- a/check.t +++ b/check.t @@ -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: 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 $ @@ -3741,10 +3741,10 @@ stdin: FNORD_B=2 FNORD_C=3 FNORD_D=4 - FNORD_E=1 - FNORD_F=2 - FNORD_G=3 - FNORD_H=4 + FNORD_E=5 + FNORD_F=6 + FNORD_G=7 + FNORD_H=8 integer FNORD_E FNORD_F FNORD_G FNORD_H export FNORD_C FNORD_D FNORD_G FNORD_H readonly FNORD_B FNORD_D FNORD_F FNORD_H @@ -3761,6 +3761,8 @@ stdin: print FNORD-6 typeset -p print FNORD-7 + typeset - + print FNORD-8 } | fgrep FNORD expected-stdout: FNORD-0 @@ -3772,8 +3774,8 @@ expected-stdout: FNORD-2 export FNORD_C=3 export FNORD_D=4 - export FNORD_G=3 - export FNORD_H=4 + export FNORD_G=7 + export FNORD_H=8 FNORD-3 FNORD_B FNORD_D @@ -3782,8 +3784,8 @@ expected-stdout: FNORD-4 readonly FNORD_B=2 readonly FNORD_D=4 - readonly FNORD_F=2 - readonly FNORD_H=4 + readonly FNORD_F=6 + readonly FNORD_H=8 FNORD-5 typeset FNORD_A typeset -r FNORD_B @@ -3807,10 +3809,10 @@ expected-stdout: FNORD_B=2 FNORD_C=3 FNORD_D=4 - FNORD_E=1 - FNORD_F=2 - FNORD_G=3 - FNORD_H=4 + FNORD_E=5 + FNORD_F=6 + FNORD_G=7 + FNORD_H=8 FNORD-8 --- name: syntax-1 diff --git a/funcs.c b/funcs.c index 17e437d..4dd4044 100644 --- a/funcs.c +++ b/funcs.c @@ -5,7 +5,7 @@ #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 a POSIX special builtin; @@ -686,32 +686,32 @@ c_typeset(const char **wp) { struct block *l; struct tbl *vp, **p; - Tflag fset = 0, fclr = 0; - int thing = 0, func = 0, localv = 0; - const char *opts = "L#R#UZ#fi#lprtux"; /* see comment below */ + Tflag fset = 0, fclr = 0, flag; + int thing = 0, field, base, optc; + const char *opts; const char *fieldstr, *basestr; - int field, base; - int optc; - Tflag flag; - int pflag = 0; + bool localv = false, func = false, pflag = false, istset = true; switch (**wp) { case 'e': /* export */ fset |= EXPORT; - opts = "p"; + istset = false; break; case 'r': /* readonly */ fset |= RDONLY; - opts = "p"; + istset = false; break; case 's': /* set */ /* called with 'typeset -' */ break; case 't': /* typeset */ - localv = 1; + localv = true; break; } + /* see comment below regarding possible opions */ + opts = istset ? "L#R#UZ#fi#lprtux" : "p"; + fieldstr = basestr = NULL; builtin_opt.flags |= GF_PLUSOPT; /* 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; break; case 'f': - func = 1; + func = true; break; case 'i': flag = INTEGER; @@ -755,12 +755,12 @@ c_typeset(const char **wp) flag = LCASEV; break; case 'p': - /* posix export/readonly -p flag. - * typeset -p is the same as typeset (in pdksh); - * here for compatibility with ksh93. - */ - pflag = 1; - continue; + /* export, readonly: POSIX -p flag */ + /* typeset: show values as well */ + pflag = true; + if (istset) + continue; + break; case 'r': flag = RDONLY; break; @@ -939,13 +939,32 @@ c_typeset(const char **wp) if ((vp->flag&UCASEV_AL)) shprintf("-u "); if ((vp->flag&INT_U)) - shprintf("-U "); - shprintf("%s\n", vp->name); - if (vp->flag&ARRAY) - break; + shf_puts("-U ", shl_stdout); + shf_puts(vp->name, shl_stdout); + if (pflag) { + 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 { if (pflag) - shprintf("typeset "); + shf_puts(istset ? + "typeset " : + (flag & EXPORT) ? + "export " : + "readonly ", + shl_stdout); if ((vp->flag&ARRAY) && any_set) shprintf("%s[%lu]", vp->name,