[ksh93-integration-discuss] [ast-users] AT&T Software Technology ast software download update

Felix Schulte felix.schulte at gmail.com
Wed Jul 4 08:53:02 PDT 2007


On 6/29/07, Glenn Fowler <gsf at research.att.com> wrote:
>
> the AT&T Software Technology ast 2007-06-28 source release
> has been posted to the download site
>         http://www.research.att.com/sw/download/
> the notes and changes link has details on the release
>
> this is a final source release (not beta) and includes the
> final release for ksh93s+
>
> thanks to all who contributed bug reports and test cases
>
> 2007-06-28 binary packages will be posted in two weeks
patch diff from 20070515 to 20070628 attached
-- 
      _        Felix Schulte
    _|_|_     mailto:felix.schulte at gmail.com
    (0 0)
ooO--(_)--Ooo
-------------- next part --------------
diff -r -N -u ksh93_2007_05_15/lib/package/ast-ksh.html ksh93_2007_06_28/lib/package/ast-ksh.html
--- ksh93_2007_05_15/lib/package/ast-ksh.html	2007-05-16 05:16:01.000000000 +0200
+++ ksh93_2007_06_28/lib/package/ast-ksh.html	2007-06-29 07:09:07.000000000 +0200
@@ -193,17 +193,31 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="ksh93 changes">ksh93 changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
-07-05-15  --- Release ksh93s+  ---
+07-06-28  --- Release ksh93s+  ---
+07-06-25  In vi insert mode, ksh no longer emits a backspace character
+	  before the carraige return when the newline is entered. 
+07-06-25  A bug in which pipefail would cause a command to return 0
+	  when the pipeline was the last command and the failure happened
+	  on a component other than the last has been fixed.
+07-06-25  A bug in the expansion of ${var/pattern/rep} when pattern or rep
+	  contained a left parenthesis in single quotes has been fixed.
+07-06-18  The braces for a subscripted variable with ${var&#0091;sub&#0093;} are now
+	  optional when inside &#0091;&#0091;...&#0093;&#0093;, ((...)) or as a subscript.
+07-05-28  A bug in brace expansion in which single and double quotes did
+          not treat the comma as a literal character has been fixed.
+07-05-24  The -p option of whence now disables -v.
+07-05-23  Several bug fixes in compound variables and arrays of arrays
+	  have been made.
 07-05-15  A bug in which the %B format of printf was affected  by the
 	  locale has been fixed.
 07-05-14  A bug in which &nbsp;was not removed in the replacement pattern with
 	  ${var/pattern/rep} when it was not followed by &nbsp;or a digit has
 	  been fixed.
-07-05-10  A bug in which ksh -R file core dumped if no script was sepcifed
+07-05-10  A bug in which ksh -R file core dumped if no script was specified
 	  has been fixed.  it not displays an error message.
 07-05-07  Added additional Solaris signals to signal table.
 07-04-30  A bug in which a pipeline with command substitution inside a
-	  function could cause a pipline that invokes this function to
+	  function could cause a pipeline that invokes this function to
 	  hang when the pipefail option is on has been fixed.
 07-04-30  Added -q to whence.
 07-04-18  A small memory leak with each redirection of a non-builtin has
@@ -1666,6 +1680,7 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libast changes">libast changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+07-05-21 tm/tmxfmt.c,tmxscan.c: %F =&gt; %L (TM_DEFAULT); %F =&gt; %Y-%m-%d
 07-05-15 sfio/sfvprintf.c: %h? and SFFMT_SHORT =&gt; raw bytes
 07-05-09 features/signal.c,features/siglist: use kill -l &amp; strsignal()
 07-04-25 misc/optctx.c: add for opt_info switching
@@ -3106,6 +3121,8 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libcmd changes">libcmd changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+07-05-20 cmd.h: handle msvc's balk at if(0)0=0;
+07-05-20 cksum.c: #include &lt;modex.h&gt;
 07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify &gt;= 20070511 context
 07-05-09 fds.c: handle ipv6 sockets
 07-05-09 cmd.h: &lt;shbltin.h&gt; : cmdquit() =&gt; sh_checksig(context)
@@ -3396,7 +3413,7 @@
 <TR>
 <TD align=left></TD>
 <TD align=center></TD>
-<TD align=right>May 15, 2007</TD>
+<TD align=right>June 29, 2007</TD>
 </TR>
 </TABLE>
 <P>
diff -r -N -u ksh93_2007_05_15/lib/package/ast-ksh.README ksh93_2007_06_28/lib/package/ast-ksh.README
--- ksh93_2007_05_15/lib/package/ast-ksh.README	2007-05-16 05:16:00.000000000 +0200
+++ ksh93_2007_06_28/lib/package/ast-ksh.README	2007-06-29 07:09:07.000000000 +0200
@@ -92,17 +92,31 @@
 
 :::::::: ksh93 ::::::::
 
-07-05-15  --- Release ksh93s+  ---
+07-06-28  --- Release ksh93s+  ---
+07-06-25  In vi insert mode, ksh no longer emits a backspace character
+	  before the carraige return when the newline is entered. 
+07-06-25  A bug in which pipefail would cause a command to return 0
+	  when the pipeline was the last command and the failure happened
+	  on a component other than the last has been fixed.
+07-06-25  A bug in the expansion of ${var/pattern/rep} when pattern or rep
+	  contained a left parenthesis in single quotes has been fixed.
+07-06-18  The braces for a subscripted variable with ${var[sub]} are now
+	  optional when inside [[...]], ((...)) or as a subscript.
+07-05-28  A bug in brace expansion in which single and double quotes did
+          not treat the comma as a literal character has been fixed.
+07-05-24  The -p option of whence now disables -v.
+07-05-23  Several bug fixes in compound variables and arrays of arrays
+	  have been made.
 07-05-15  A bug in which the %B format of printf was affected  by the
 	  locale has been fixed.
 07-05-14  A bug in which \ was not removed in the replacement pattern with
 	  ${var/pattern/rep} when it was not followed by \ or a digit has
 	  been fixed.
-07-05-10  A bug in which ksh -R file core dumped if no script was sepcifed
+07-05-10  A bug in which ksh -R file core dumped if no script was specified
 	  has been fixed.  it not displays an error message.
 07-05-07  Added additional Solaris signals to signal table.
 07-04-30  A bug in which a pipeline with command substitution inside a
-	  function could cause a pipline that invokes this function to
+	  function could cause a pipeline that invokes this function to
 	  hang when the pipefail option is on has been fixed.
 07-04-30  Added -q to whence.
 07-04-18  A small memory leak with each redirection of a non-builtin has
@@ -1562,6 +1576,7 @@
 
 :::::::: libast ::::::::
 
+07-05-21 tm/tmxfmt.c,tmxscan.c: %F => %L (TM_DEFAULT); %F => %Y-%m-%d
 07-05-15 sfio/sfvprintf.c: %h? and SFFMT_SHORT => raw bytes
 07-05-09 features/signal.c,features/siglist: use kill -l & strsignal()
 07-04-25 misc/optctx.c: add for opt_info switching
@@ -2999,6 +3014,8 @@
 
 :::::::: libcmd ::::::::
 
+07-05-20 cmd.h: handle msvc's balk at if(0)0=0;
+07-05-20 cksum.c: #include <modex.h>
 07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify >= 20070511 context
 07-05-09 fds.c: handle ipv6 sockets
 07-05-09 cmd.h: <shbltin.h> : cmdquit() => sh_checksig(context)
diff -r -N -u ksh93_2007_05_15/lib/package/ast-ksh.ver ksh93_2007_06_28/lib/package/ast-ksh.ver
--- ksh93_2007_05_15/lib/package/ast-ksh.ver	2007-05-15 07:49:57.000000000 +0200
+++ ksh93_2007_06_28/lib/package/ast-ksh.ver	2007-06-28 22:08:31.000000000 +0200
@@ -1 +1 @@
-ast-ksh 2007-05-15 2007-05-15 1
+ast-ksh 2007-06-28 2007-06-28 1
diff -r -N -u ksh93_2007_05_15/lib/package/ksh.ver ksh93_2007_06_28/lib/package/ksh.ver
--- ksh93_2007_05_15/lib/package/ksh.ver	2007-03-29 19:07:07.000000000 +0200
+++ ksh93_2007_06_28/lib/package/ksh.ver	2007-06-29 07:09:06.000000000 +0200
@@ -1 +1 @@
-ksh 2007-03-28 2007-03-28 1
+ksh 2007-06-28 2007-06-28 1
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/bltins/whence.c ksh93_2007_06_28/src/cmd/ksh93/bltins/whence.c
--- ksh93_2007_05_15/src/cmd/ksh93/bltins/whence.c	2007-04-24 22:12:48.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/bltins/whence.c	2007-05-24 14:55:12.000000000 +0200
@@ -112,6 +112,7 @@
 		break;
 	    case 'p':
 		flags |= P_FLAG;
+		flags &= ~V_FLAG;
 		break;
 	    case 'q':
 		flags |= Q_FLAG;
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/data/builtins.c ksh93_2007_06_28/src/cmd/ksh93/data/builtins.c
--- ksh93_2007_05_15/src/cmd/ksh93/data/builtins.c	2007-05-15 05:07:06.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/data/builtins.c	2007-05-24 14:54:05.000000000 +0200
@@ -1802,7 +1802,7 @@
 "[a?Displays all uses for each \aname\a rather than the first.]"
 "[f?Do not check for functions.]"
 "[p?Do not check to see if \aname\a is a reserved word, a built-in, "
-	"an alias, or a function.]"
+	"an alias, or a function.  This turns off the \b-v\b option.]"
 "[q?Quiet mode. Returns 0 if all arguments are built-ins, functions, or are "
 	"programs found on the path.]"
 "[v?For each name you specify, the shell displays a line that indicates "
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/data/lexstates.c ksh93_2007_06_28/src/cmd/ksh93/data/lexstates.c
--- ksh93_2007_05_15/src/cmd/ksh93/data/lexstates.c	2006-08-11 21:00:24.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/data/lexstates.c	2007-05-24 18:17:21.000000000 +0200
@@ -360,7 +360,7 @@
 	0,	0,	0,	0,	0,	0,	0,	0,
 	0,	0,	0,	0,	0,	0,	0,	0,
 	0,	0,	S_QUOTE,0,	S_DOL,	0,	S_PAT,	S_LIT,
-	S_PAT,	S_PAT,	S_PAT,	0,	0,	0,	0,	S_SLASH,
+	S_PAT,	S_PAT,	S_PAT,	0,	S_COM,	0,	0,	S_SLASH,
 	0,	S_DIG,	S_DIG,	S_DIG,	S_DIG,	S_DIG,	S_DIG,	S_DIG,
 	S_DIG,	S_DIG,	S_COLON,0,	0,	S_EQ,	0,	S_PAT,
 	0,	0,	0,	0,	0,	0,	0,	0,
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/edit/vi.c ksh93_2007_06_28/src/cmd/ksh93/edit/vi.c
--- ksh93_2007_05_15/src/cmd/ksh93/edit/vi.c	2007-01-08 18:25:48.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/edit/vi.c	2007-06-26 04:52:48.000000000 +0200
@@ -1472,6 +1472,7 @@
 			if( mode != SEARCH )
 				save_last(vp);
 			refresh(vp,INPUT);
+			last_phys++;
 			return;
 
 		case '\t':		/** command completion **/
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/include/argnod.h ksh93_2007_06_28/src/cmd/ksh93/include/argnod.h
--- ksh93_2007_05_15/src/cmd/ksh93/include/argnod.h	2006-07-19 20:58:17.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/include/argnod.h	2007-06-18 17:44:19.000000000 +0200
@@ -123,6 +123,7 @@
 #define ARG_OPTIMIZE	0x200	/* try to optimize */
 #define ARG_NOGLOB	0x400	/* no file name expansion */
 #define ARG_LET		0x800	/* processing let command arguments */
+#define ARG_ARRAYOK	0x1000	/* $x[sub] ==> ${x[sub]} */
 
 extern char 		**sh_argbuild(int*,const struct comnod*,int);
 extern struct dolnod	*sh_argcreate(char*[]);
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/include/jobs.h ksh93_2007_06_28/src/cmd/ksh93/include/jobs.h
--- ksh93_2007_05_15/src/cmd/ksh93/include/jobs.h	2007-04-10 23:07:19.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/include/jobs.h	2007-05-17 23:47:17.000000000 +0200
@@ -64,6 +64,7 @@
 	pid_t		p_fgrp;		/* process group when stopped */
 	short		p_job;		/* job number of process */
 	unsigned short	p_exit;		/* exit value or signal number */
+	unsigned short	p_exitmin;	/* minimum exit value for xargs */
 	unsigned short	p_flag;		/* flags - see below */
 	int		p_env;		/* subshell environment number */
 #ifdef JOBS
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/Makefile ksh93_2007_06_28/src/cmd/ksh93/Makefile
--- ksh93_2007_05_15/src/cmd/ksh93/Makefile	2007-05-15 19:05:05.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/Makefile	2007-06-26 21:43:34.000000000 +0200
@@ -104,7 +104,7 @@
 elif CC.HOSTTYPE != "sgi.mips*"
 	LIBS_opt += +lsocket +lnsl
 end
-if CC.HOSTTYPE == "linux.sparc"
+if CC.HOSTTYPE == "linux.sparc*"
 	/* the linux.sparc linker still has some problems */
 	LIBS_opt += -ldll
 end
@@ -153,7 +153,7 @@
 	trestore.c waitevent.c xec.c env.c $(DATAFILES) $(FILES_opt) \
 	-lcmd -last -lm
 
-"sol*.i386" :NOOPTIMIZE: main.c
+"sol*.i386*" :NOOPTIMIZE: main.c
 "win32*" :NOOPTIMIZE: trestore.c
 
 if CC.HOSTTYPE == "win32*"
@@ -190,9 +190,9 @@
 	shopen.mk shopen.c
 
 :: shtests \
-	alias.sh append.sh arith.sh arrays.sh attributes.sh basic.sh \
-	bracket.sh builtins.sh case.sh comvar.sh coprocess.sh exit.sh \
-	expand.sh functions.sh glob.sh grep.sh heredoc.sh io.sh \
+	alias.sh append.sh arith.sh arrays.sh arrays2.sh attributes.sh \
+	basic.sh bracket.sh builtins.sh case.sh comvar.sh coprocess.sh \
+	exit.sh expand.sh functions.sh glob.sh grep.sh heredoc.sh io.sh \
 	nameref.sh options.sh path.sh quoting.sh quoting2.sh restricted.sh \
 	return.sh select.sh substring.sh tilde.sh variables.sh 
 
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/Mamfile ksh93_2007_06_28/src/cmd/ksh93/Mamfile
--- ksh93_2007_05_15/src/cmd/ksh93/Mamfile	2007-05-16 05:16:02.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/Mamfile	2007-06-29 07:09:09.000000000 +0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-06-21
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/RELEASE ksh93_2007_06_28/src/cmd/ksh93/RELEASE
--- ksh93_2007_05_15/src/cmd/ksh93/RELEASE	2007-05-16 04:40:29.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/RELEASE	2007-06-29 05:39:32.000000000 +0200
@@ -1,14 +1,28 @@
-07-05-15  --- Release ksh93s+  ---
+07-06-28  --- Release ksh93s+  ---
+07-06-25  In vi insert mode, ksh no longer emits a backspace character
+	  before the carraige return when the newline is entered. 
+07-06-25  A bug in which pipefail would cause a command to return 0
+	  when the pipeline was the last command and the failure happened
+	  on a component other than the last has been fixed.
+07-06-25  A bug in the expansion of ${var/pattern/rep} when pattern or rep
+	  contained a left parenthesis in single quotes has been fixed.
+07-06-18  The braces for a subscripted variable with ${var[sub]} are now
+	  optional when inside [[...]], ((...)) or as a subscript.
+07-05-28  A bug in brace expansion in which single and double quotes did
+          not treat the comma as a literal character has been fixed.
+07-05-24  The -p option of whence now disables -v.
+07-05-23  Several bug fixes in compound variables and arrays of arrays
+	  have been made.
 07-05-15  A bug in which the %B format of printf was affected  by the
 	  locale has been fixed.
 07-05-14  A bug in which \ was not removed in the replacement pattern with
 	  ${var/pattern/rep} when it was not followed by \ or a digit has
 	  been fixed.
-07-05-10  A bug in which ksh -R file core dumped if no script was sepcifed
+07-05-10  A bug in which ksh -R file core dumped if no script was specified
 	  has been fixed.  it not displays an error message.
 07-05-07  Added additional Solaris signals to signal table.
 07-04-30  A bug in which a pipeline with command substitution inside a
-	  function could cause a pipline that invokes this function to
+	  function could cause a pipeline that invokes this function to
 	  hang when the pipefail option is on has been fixed.
 07-04-30  Added -q to whence.
 07-04-18  A small memory leak with each redirection of a non-builtin has
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/array.c ksh93_2007_06_28/src/cmd/ksh93/sh/array.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/array.c	2007-03-15 21:58:02.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/array.c	2007-05-24 01:19:53.000000000 +0200
@@ -37,8 +37,7 @@
 #define array_clrbit(cp, n)	(cp[(n)/CHAR_BIT] &= ~(1<<(((n)&(CHAR_BIT-1)))))
 #define array_isbit(cp, n)	(cp[(n)/CHAR_BIT] & 1<<(((n)&(CHAR_BIT-1))))
 #define NV_CHILD		NV_EXPORT
-
-static char Empty[] = "";
+#define Empty			((char*)(e_sptbnl+3))
 
 struct index_array
 {
@@ -81,10 +80,12 @@
  *   but <= ARRAY_MAX) is returned.
  *
  */
-static int	arsize(register int maxi)
+static int	arsize(struct index_array *ap, register int maxi)
 {
-	register int i = roundof(maxi,ARRAY_INCR);
-	return (i>ARRAY_MAX?ARRAY_MAX:i);
+	if(ap && maxi < 2*ap->maxi)
+		maxi = 2*ap->maxi;
+	maxi = roundof(maxi,ARRAY_INCR);
+	return (maxi>ARRAY_MAX?ARRAY_MAX:maxi);
 }
 
 static struct index_array *array_grow(Namval_t*, struct index_array*,int);
@@ -323,6 +324,8 @@
 		Namfun_t *nfp;
 		if(nfp = nv_disc(np,(Namfun_t*)ap,NV_POP))
 			free((void*)nfp);
+		if(np->nvalue.cp==Empty)
+			np->nvalue.cp = 0;
 	}
 }
 
@@ -348,7 +351,7 @@
 {
 	register struct index_array *ap;
 	register int i=0;
-	register int newsize = arsize(maxi+1);
+	register int newsize = arsize(arp,maxi+1);
 	if (maxi >= ARRAY_MAX)
 		errormsg(SH_DICT,ERROR_exit(1),e_subscript, fmtbase((long)maxi,10,0));
 	ap = new_of(struct index_array,(newsize-1)*sizeof(union Value*)+newsize/CHAR_BIT);
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/fault.c ksh93_2007_06_28/src/cmd/ksh93/sh/fault.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/fault.c	2007-05-02 16:22:55.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/fault.c	2007-05-29 02:30:35.000000000 +0200
@@ -360,7 +360,12 @@
 		int	sav_trapnote = sh.trapnote;
 		sh.trapnote &= ~SH_SIGSET;
 		if(sh.st.trap[SH_ERRTRAP])
-			sh_trap(sh.st.trap[SH_ERRTRAP],0);
+		{
+			trap = sh.st.trap[SH_ERRTRAP];
+			sh.st.trap[SH_ERRTRAP] = 0;
+			sh_trap(trap,0);
+			sh.st.trap[SH_ERRTRAP] = trap;
+		}
 		sh.trapnote = sav_trapnote;
 		if(sh_isoption(SH_ERREXIT))
 		{
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/io.c ksh93_2007_06_28/src/cmd/ksh93/sh/io.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/io.c	2007-03-20 21:22:35.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/io.c	2007-05-17 16:07:41.000000000 +0200
@@ -458,6 +458,8 @@
 	{
 		Sfdisc_t *dp;
 		sfset(iop,SF_MALLOC,1);
+		if(!(status&IOWRITE))
+			sfset(iop,SF_IOCHECK,1);
 		{
 			dp = newof(0,Sfdisc_t,1,0);
 			dp->exceptf = slowexcept;
@@ -1456,6 +1458,10 @@
 			return(0);
 		n=1;
 	}
+	else
+		n = 0;
+	if(sh.bltinfun && sh.bltindata.sigset)
+		return(-1);
 	errno = 0;
 	if(sh.trapnote&SH_SIGSET)
 	{
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/jobs.c ksh93_2007_06_28/src/cmd/ksh93/sh/jobs.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/jobs.c	2007-04-26 14:41:21.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/jobs.c	2007-06-28 15:53:36.000000000 +0200
@@ -229,6 +229,7 @@
 			pw = &dummy;
 			pw->p_exit = 0;
 			pw->p_pgrp = 0;
+			pw->p_exitmin = 0;
 			if(job.toclear)
 				job_clear();
 			if(bck.count++ > sh.lim.child_max)
@@ -260,17 +261,14 @@
 				px->p_nxtjob = job.pwlist;
 				job.pwlist = px;
 			}
-			pw->p_exit = WSTOPSIG(wstat);
 			pw->p_flag |= (P_NOTIFY|P_SIGNALLED|P_STOPPED);
+			pw->p_exit = WSTOPSIG(wstat);
 			if(pw->p_pgrp && pw->p_pgrp==job.curpgid && sh_isstate(SH_STOPOK))
 				sh_fault(pw->p_exit); 
 			continue;
 		}
 		else if (WIFCONTINUED(wstat) && wcontinued)
-		{
 			pw->p_flag &= ~(P_NOTIFY|P_SIGNALLED|P_STOPPED);
-			pw->p_exit = 0;
-		}
 		else
 #endif /* SIGTSTP */
 		{
@@ -303,7 +301,8 @@
 			else
 			{
 				pw->p_flag |= (P_DONE|P_NOTIFY);
-				if(WEXITSTATUS(wstat) > pw->p_exit)
+				pw->p_exit =  pw->p_exitmin;
+				if(WEXITSTATUS(wstat) > pw->p_exitmin)
 					pw->p_exit = WEXITSTATUS(wstat);
 			}
 			if(pw->p_pgrp==0)
@@ -1058,8 +1057,8 @@
 	pw->p_env = sh.curenv;
 	pw->p_pid = pid;
 	pw->p_flag = P_EXITSAVE;
-	pw->p_exit = sh.xargexit;
-	sh.xargexit = 0;
+	pw->p_exitmin = sh.xargexit;
+	pw->p_exit = 0;
 	if(sh_isstate(SH_MONITOR))
 	{
 		if(killpg(job.curpgid,0)<0 && errno==ESRCH)
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/lex.c ksh93_2007_06_28/src/cmd/ksh93/sh/lex.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/lex.c	2007-03-21 19:24:38.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/lex.c	2007-06-25 17:17:32.000000000 +0200
@@ -686,7 +686,7 @@
 				mode = ST_NORM;
 				continue;
 			case S_LIT:
-				if(oldmode()==ST_NONE)	/*  in ((...)) */
+				if(oldmode()==ST_NONE && !lexd.noarg)	/*  in ((...)) */
 				{
 					if((c=fcpeek(0))==LPAREN || c==RPAREN || c=='$' || c==LBRACE || c==RBRACE || c=='[' || c==']')
 					{
@@ -804,7 +804,7 @@
 				if(shlex.kiafile)
 					refvar(0);
 #endif /* SHOPT_KIA */
-				if(lexd.warn && c==LBRACT)
+				if(lexd.warn && c==LBRACT && !lex.intest && !lexd.arith && oldmode()!= ST_NESTED)
 					errormsg(SH_DICT,ERROR_warn(0),e_lexusebrace,shp->inlineno);
 				fcseek(-1);
 				mode = oldmode();
@@ -1153,6 +1153,11 @@
 			return(0);
 	}
 breakloop:
+	if(lexd.nocopy)
+	{
+		lexd.balance = 0;
+		return(0);
+	}
 	if(lexd.dolparen)
 	{
 		lexd.balance = 0;
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/macro.c ksh93_2007_06_28/src/cmd/ksh93/sh/macro.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/macro.c	2007-05-14 17:08:10.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/macro.c	2007-06-25 17:28:03.000000000 +0200
@@ -43,6 +43,7 @@
 #include	"national.h"
 #include	"streval.h"
 
+
 #undef STR_GROUP
 #ifndef STR_GROUP
 #   define STR_GROUP	0
@@ -71,6 +72,7 @@
 	char		arith;		/* set for ((...)) */
 	char		let;		/* set when expanding let arguments */
 	char		zeros;		/* strip leading zeros when set */
+	char		arrayok;	/* $x[] ok for arrays */
 	void		*nvwalk;	/* for name space walking*/
 } Mac_t;
 
@@ -208,6 +210,7 @@
 	mp->split = !(flag&ARG_ASSIGN);
 	mp->assign = !mp->split;
 	mp->pattern = mp->split && !(flag&ARG_NOGLOB) && !sh_isoption(SH_NOGLOB);
+	mp->arrayok = mp->arith || (flag&ARG_ARRAYOK);
 	str = argp->argval;
 	fcsopen(str);
 	mp->fields = 0;
@@ -388,7 +391,7 @@
 		arg->argchn.ap=0;
 	if(!(sp=arg->argchn.cp))
 	{
-		sh_macexpand(arg,NIL(struct argnod**),flags);
+		sh_macexpand(arg,NIL(struct argnod**),flags|ARG_ARRAYOK);
 		sp = arg->argchn.cp;
 		if(!(flags&ARG_OPTIMIZE) || !(arg->argflag&ARG_MAKE))
 			arg->argchn.cp = 0;
@@ -655,6 +658,17 @@
 					--paren;
 			}
 			goto pattern;
+		    case S_COM:
+			if(mp->pattern==4 && (mp->quote || mp->lit))
+			{
+				if(c)
+				{
+					stakwrite(first,c);
+					first = fcseek(c);
+				}
+				stakputc(ESCAPE);
+			}
+			break;
 		    case S_BRACE:
 			if(!(mp->quote || mp->lit))
 			{
@@ -880,13 +894,16 @@
 	int xpattern = mp->pattern;
 	int loc = staktell();
 	int xarith = mp->arith;
+	int arrayok = mp->arrayok;
 	mp->split = 0;
 	mp->arith = 0;
 	mp->pattern = flag?4:0;
+	mp->arrayok=1;
 	copyto(mp,RBRACT,0);
 	mp->pattern = xpattern;
 	mp->split = split;
 	mp->arith = xarith;
+	mp->arrayok = arrayok;
 	return(loc);
 }
 
@@ -1035,7 +1052,7 @@
 			do
 				stakputc(c);
 			while(((c=fcget()),(c>0x7f||isaname(c)))||type && c=='.');
-			while(c==LBRACT && type)
+			while(c==LBRACT && (type||mp->arrayok))
 			{
 				sh.argaddr=0;
 				if((c=fcget(),isastchar(c)) && fcpeek(0)==RBRACT)
@@ -1107,7 +1124,7 @@
 		ap = np?nv_arrayptr(np):0;
 		if(type)
 		{
-			if(ap && isastchar(mode) && !(ap->nelem&ARRAY_SCAN))
+			if(ap && (isastchar(mode)||type==M_TREE)  && !(ap->nelem&ARRAY_SCAN))
 				nv_putsub(np,NIL(char*),ARRAY_SCAN);
 			if(!isbracechar(c))
 				goto nosub;
@@ -1119,7 +1136,7 @@
 		if((type==M_VNAME||type==M_SUBNAME)  && sh.argaddr && strcmp(nv_name(np),id))
 			sh.argaddr = 0;
 		c = (type>M_BRACE && isastchar(mode));
-		if(np && (!c || !ap))
+		if(np && (type==M_TREE || !c || !ap))
 		{
 			if(type==M_VNAME)
 			{
@@ -1129,11 +1146,7 @@
 #ifdef SHOPT_TYPEDEF
 			else if(type==M_TYPE)
 			{
-#if 0
 				Namval_t *nq = nv_type(np);
-#else
-				Namval_t *nq = 0;
-#endif
 				type = M_BRACE;
 				if(nq)
 					v = nv_name(nq);
@@ -1628,6 +1641,12 @@
 		nv_close(np);
 	return(1);
 nosub:
+	if(type==M_BRACE && sh_lexstates[ST_NORM][c]==S_BREAK)
+	{
+		fcseek(-1);
+		comsubst(mp,2);
+		return(1);
+	}
 	if(type)
 		mac_error(np);
 	fcseek(-1);
@@ -1709,6 +1728,7 @@
 		sh.inlineno = error_info.line+sh.st.firstline;
 		t = (Shnode_t*)sh_parse(mp->shp, sp,SH_EOF|SH_NL);
 		sh.inlineno = c;
+		type = 1;
 	}
 #if KSHELL
 	if(t)
@@ -1741,7 +1761,7 @@
 			sp = sfnew(NIL(Sfio_t*),(char*)malloc(IOBSIZE+1),IOBSIZE,fd,SF_READ|SF_MALLOC);
 		}
 		else
-			sp = sh_subshell(t,sh_isstate(SH_ERREXIT),1);
+			sp = sh_subshell(t,sh_isstate(SH_ERREXIT),type);
 		fcrestore(&save);
 	}
 	else
@@ -2290,8 +2310,10 @@
 	register int	c;
 	while(c = *cp++)
 	{
-		if(c==ESCAPE && (!rep || (*cp && !isadigit(*cp) && *cp!=ESCAPE)))
+		if(c==ESCAPE && (!rep || (*cp && strchr("&|()[]*?",*cp))))
+		{
 			c = *cp++;
+		}
 		else if(!rep && c=='/')
 		{
 			cp[-1] = 0;
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/name.c ksh93_2007_06_28/src/cmd/ksh93/sh/name.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/name.c	2007-03-28 07:19:13.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/name.c	2007-06-29 05:39:19.000000000 +0200
@@ -34,6 +34,7 @@
 #include	"FEATURE/externs"
 #include	"streval.h"
 
+#define Empty	((char*)(e_sptbnl+3))
 static char	*savesub = 0;
 
 #if !_lib_pathnative && _lib_uwin_path
@@ -60,9 +61,11 @@
 
 struct adata
 {
-	char    **argnam;
-	int     attsize;
-	char    *attval;
+	Shell_t		*sh;
+	Namval_t	*tp;
+	char		**argnam;
+	int		attsize;
+	char		*attval;
 };
 
 char		nv_local = 0;
@@ -192,7 +195,7 @@
 		{
 			Namval_t *mp;
 			stakseek(0);
-			if(*arg->argval==0 && arg->argchn.ap && !(arg->argflag&~(ARG_APPEND|ARG_QUOTED)))
+			if(*arg->argval==0 && arg->argchn.ap && !(arg->argflag&~(ARG_APPEND|ARG_QUOTED|ARG_MESSAGE)))
 			{
 				int flag = (NV_VARNAME|NV_ARRAY|NV_ASSIGN);
 				struct fornod *fp=(struct fornod*)arg->argchn.ap;
@@ -213,7 +216,7 @@
 					sh.prefix = prefix;
 					if(np)
 					{
-						if(!nv_isarray(np))
+						if(nv_isvtree(np) && !nv_isarray(np))
 						{
 							stakputc('.');
 							stakputs(cp);
@@ -268,6 +271,18 @@
 				}
 				if(tp->tre.tretyp==TLST || !tp->com.comset || tp->com.comset->argval[0]!='[')
 				{
+					if(tp->tre.tretyp!=TLST && tp->com.comset && tp->com.comset->argval[0]==0 && tp->com.comset->argchn.ap)
+					{
+						if(prefix)
+							cp = stakcopy(nv_name(np));
+						sh.prefix = cp;
+						nv_setlist(tp->com.comset,flags);
+						sh.prefix = prefix;
+						if(tp->com.comset->argval[1]!='[')
+							nv_setvtree(np);
+						nv_close(np);
+						continue;
+					}
 					if(*cp!='.' && *cp!='[' && strchr(cp,'['))
 					{
 						nv_close(np);
@@ -303,8 +318,10 @@
 			}
 			cp = arg->argval;
 		}
+#if 0
 		if(sh.prefix && *cp=='.' && cp[1]=='=')
 			cp++;
+#endif
 		np = nv_open(cp,sh.var_tree,flags);
 		if(!np->nvfun)
 		{
@@ -502,7 +519,7 @@
 					sh.argaddr = 0;
 				else if(flags&NV_NOREF)
 				{
-					if(c)
+					if(c && !(flags&NV_NOADD))
 						nv_unref(np);
 					return(np);
 				}
@@ -535,6 +552,8 @@
 				flags |= NV_NOREF;
 			}
 			sh.last_root = root;
+			if(c=='.' && (cp[1]==0 ||  cp[1]=='=' || cp[1]=='+'))
+				return(np);
 			do
 			{
 				if(!np)
@@ -570,8 +589,7 @@
 					}
 					else
 						cp = sp;
-					if((c = *cp)=='.' || c=='[' || (n&ARRAY_FILL))
-
+					if((c = *cp)=='.' || (c=='[' && nv_isarray(np)) || (n&ARRAY_FILL))
 					{
 						int m = cp-sp;
 						char *sub = m?nv_getsub(np):0;
@@ -611,14 +629,16 @@
 					}
 					else if(c==0 && mode && (n=nv_aindex(np))>0)
 						nv_putsub(np,(char*)0,n|ARRAY_FILL);
-					else if(n==0 && c==0)
+					else if(n==0 && (c==0 || (c=='[' && !nv_isarray(np))))
 					{
 						/* subscript must be 0*/
 						cp[-1] = 0;
-						c = sh_arith(sp+1);
+						n = sh_arith(sp+1);
 						cp[-1] = ']';
-						if(c)
+						if(n)
 							return(0);
+						if(c)
+							sp = cp;
 					}
 					dp->last = cp;
 					if(nv_isarray(np) && (c=='[' || c=='.' || (flags&NV_ARRAY)))
@@ -628,8 +648,16 @@
 						*sp = c;
 						if(nq && nv_isnull(nq))
 							nq = nv_arraychild(np,nq,c);
-						if(!(np=nq))
-							return(np);
+						if(nq)
+							np = nq;
+						else if(memcmp(cp,"[0]",3))
+							return(nq);
+						else
+						{
+							/* ignore [0]  */
+							dp->last = cp += 3;
+							c = *cp;
+						}
 					}
 				}
 				else if(nv_isarray(np))
@@ -771,10 +799,18 @@
 		np = nv_search(name, funroot, c);
 		*fname = 0;
 	}
-	else if(*cp=='+' && cp[1]=='=')
+	else
 	{
-		append=NV_APPEND;
-		cp++;
+		if(*cp=='.')
+		{
+			append |= NV_NODISC;
+			cp++;
+		}
+		if(*cp=='+' && cp[1]=='=')
+		{
+			append |= NV_APPEND;
+			cp++;
+		}
 	}
 	c = *cp;
 skip:
@@ -789,12 +825,14 @@
 		}
 		else
 		{
-			char *sub=0;
+			char *sub=0, *prefix= sh.prefix;
+			sh.prefix = 0;
 			if(sh_isoption(SH_XTRACE) && nv_isarray(np))
 				sub = nv_getsub(np);
 			c = msg==e_aliname? 0: (append | (flags&NV_EXPORT)); 
 			nv_putval(np, cp, c);
 			savesub = sub;
+			sh.prefix = prefix;
 		}
 		nv_onattr(np, flags&NV_ATTRIBUTES);
 	}
@@ -845,7 +883,7 @@
 	sh.argaddr = 0;
 	if(sh.subshell && !nv_local)
 		np = sh_assignok(np,1);
-	if(np->nvfun && !nv_isattr(np,NV_REF))
+	if(np->nvfun && !(flags&NV_NODISC) && !nv_isattr(np,NV_REF))
 	{
 		/* This function contains disc */
 		if(!nv_local)
@@ -1327,6 +1365,8 @@
 {
 	register int flag = np->nvflag;
 	register struct adata *ap = (struct adata*)data;
+	ap->sh = &sh;
+	ap->tp = 0;
 	if(!(flag&NV_EXPORT) || (flag&NV_FUNCT))
 		return;
 	flag &= (NV_RDONLY|NV_UTOL|NV_LTOU|NV_RJUST|NV_LJUST|NV_ZFILL|NV_INTEGER);
@@ -1354,6 +1394,8 @@
 {
 	register char *value;
 	register struct adata *ap = (struct adata*)data;
+	ap->sh = &sh;
+	ap->tp = 0;
 	if(nv_isattr(np,NV_IMPORT))
 	{
 		if(np->nvenv)
@@ -1394,6 +1436,8 @@
 	register int namec;
 	register char *cp;
 	struct adata data;
+	data.sh = &sh;
+	data.tp = 0;
 	/* L_ARGNOD gets generated automatically as full path name of command */
 	nv_offattr(L_ARGNOD,NV_EXPORT);
 	data.attsize = 6;
@@ -1421,7 +1465,6 @@
 	void    *scandata;
 };
 
-
 static int scanfilter(Dt_t *dict, void *arg, void *data)
 {
 	register Namval_t *np = (Namval_t*)arg;
@@ -1430,7 +1473,7 @@
 	NOT_USED(dict);
 	if(sp->scanmask?(k&sp->scanmask)==sp->scanflags:(!sp->scanflags || (k&sp->scanflags)))
 	{
-		if(!np->nvalue.cp && !nv_isattr(np,~NV_DEFAULT))
+		if(!np->nvalue.cp && !np->nvfun && !nv_isattr(np,~NV_DEFAULT))
 			return(0);
 		if(sp->scanfn)
 		{
@@ -1535,6 +1578,8 @@
 	register Namval_t *np,*nq;
 	for(np=(Namval_t*)dtfirst(root);np;np=nq)
 	{
+		if(nv_isref(np))
+			nv_unref(np);
 		_nv_unset(np,flags);
 		if(oroot && (nq=nv_search(nv_name(np),oroot,0)) && nv_isattr(nq,NV_EXPORT))
 			sh_envput(sh.env,nq);
@@ -1596,7 +1641,7 @@
 		nv_local=0;
 	}
 	up = &np->nvalue;
-	if(up->cp)
+	if(up->cp && up->cp!=Empty)
 	{
 		if(!nv_isattr (np, NV_NOFREE))
 			free((void*)up->cp);
@@ -2156,7 +2201,7 @@
  */
 void nv_setref(register Namval_t *np, Dt_t *hp, int flags)
 {
-	register Namval_t *nq, *nr;
+	register Namval_t *nq, *nr=0;
 	register char *ep,*cp;
 	if(nv_isref(np))
 		return;
@@ -2167,8 +2212,13 @@
 	if((ep = lastdot(cp)) && nv_isattr(np,NV_MINIMAL))
 		errormsg(SH_DICT,ERROR_exit(1),e_badref,nv_name(np));
 	if(!hp)
+	{
 		hp = sh.var_tree;
-	nr= nq = nv_open(cp, hp, flags|NV_NOREF);
+		if(!(nr = nq = nv_open(cp, hp, flags|NV_NOREF|NV_NOSCOPE|NV_NOADD|NV_NOFAIL)))
+			hp = sh.var_base;
+	}
+	if(!nr)
+		nr= nq = nv_open(cp, hp, flags|NV_NOREF);
 	while(nv_isref(nr))
 	{
 		sh.last_table = nv_reftable(nr);
@@ -2189,7 +2239,19 @@
 #if 0
 		nv_endsubscript(nq,ep,NV_ADD);
 #endif
-		ep = nv_getsub(nq);
+		if(nv_isarray(nq))
+			ep = nv_getsub(nq);
+		else
+		{
+			int savtop = staktell();
+			char *savptr = stakfreeze(0);
+			stakputs(nv_name(nr));
+			stakputs(ep-1);
+			ep = stakfreeze(1);
+			nq = nv_open(ep,hp,NV_ARRAY);
+			stakset(savptr,savtop);
+			ep = 0;
+		}
 	}
 	nv_unset(np);
 	np->nvalue.nrp = newof(0,struct Namref,1,0);
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/nvdisc.c ksh93_2007_06_28/src/cmd/ksh93/sh/nvdisc.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/nvdisc.c	2007-05-15 05:08:51.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/nvdisc.c	2007-05-24 03:11:27.000000000 +0200
@@ -1188,6 +1188,8 @@
 			return(tp->dict);
 #if 0
 		np = nv_create(np,(const char*)0, NV_FIRST, (Namfun_t*)0);
+#else
+		break;
 #endif
 	}
 	return(sh.var_tree);
@@ -1239,12 +1241,18 @@
 	return(0);
 }
 
+Namval_t *nv_type(Namval_t *np)
+{
+	return(0);
+}
+
 /*
  * This function turns variable <np>  to the type <tp>
  */
 int nv_settype(Namval_t* np, Namval_t *tp, int flags)
 {
 	int isnull = nv_isnull(np);
+	int rdonly = nv_isattr(np,NV_RDONLY);
 	char *val=0;
 	if(isnull)
 		flags &= ~NV_APPEND;
@@ -1256,6 +1264,8 @@
 	}
 	if(!nv_clone(tp,np,flags|NV_NOFREE))
 		return(0);
+	if(!rdonly)
+		nv_offattr(np,NV_RDONLY);
 	if(val)
 	{
 		nv_putval(np,val,NV_RDONLY);
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/nvtree.c ksh93_2007_06_28/src/cmd/ksh93/sh/nvtree.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/nvtree.c	2007-05-14 22:35:54.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/nvtree.c	2007-05-24 01:25:55.000000000 +0200
@@ -31,6 +31,8 @@
 #include	"name.h"
 #include	"argnod.h"
 
+#define Empty	((char*)(e_sptbnl+3))
+
 struct nvdir
 {
 	Dt_t		*root;
@@ -399,10 +401,12 @@
 			if(fp = nv_stack(np,NIL(Namfun_t*)))
 				free((void*)fp);
 			np->nvfun = 0;
+			return;
 		}
-		return;
+		if(!np->nvalue.cp)
+			return;
 	}
-	if(nv_isnull(np))
+	if(nv_isnull(np) || np->nvalue.cp==Empty)
 		return;
 	if(special || nv_isarray(np))
 	{
@@ -423,7 +427,9 @@
 		return;
 	if(special)
 	{
+#if 0
 		associative = 1;
+#endif
 		sfnputc(wp->out,'\t',wp->indent);
 	}
 	else
@@ -440,6 +446,9 @@
 			sfnputc(wp->out,'\t',++wp->indent);
 		}
 	}
+	fp = np->nvfun;
+	if(*name=='.')
+		np->nvfun = 0;
 	while(1)
 	{
 		char *fmtq,*ep;
@@ -470,6 +479,8 @@
 			break;
 		sfnputc(wp->out,'\t',wp->indent);
 	}
+	if(*name=='.')
+		np->nvfun = fp;
 	if(isarray && !special)
 	{
 		sfnputc(wp->out,'\t',--wp->indent);
@@ -533,7 +544,7 @@
 				sfnputc(outfile,'\t',wp->indent);
 				nv_attribute(np,outfile,"typeset",1);
 				nv_close(np);
-				sfputr(outfile,arg+m+(n?n+1:0),'=');
+				sfputr(outfile,arg+m+(n?n:0),'=');
 				argv = genvalue(++argv,cp,cp-arg ,wp);
 				sfputc(outfile,'\n');
 			}
@@ -581,8 +592,9 @@
 	char *subscript=0;
 	void *dir;
 	int n=0, noscope=(dlete&NV_NOSCOPE);
+	Namarr_t *arp = nv_arrayptr(np);
 	stakputs(nv_name(np));
-	if(subscript = nv_getsub(np))
+	if(arp && !(arp->nelem&ARRAY_SCAN) && (subscript = nv_getsub(np)))
 	{
 		stakputc('[');
 		stakputs(subscript);
@@ -641,8 +653,10 @@
 	NOT_USED(fp);
 	if(nv_isattr(np,NV_BINARY) &&  nv_isattr(np,NV_RAW))
 		return(nv_getv(np,fp));
+#if 0
 	if(nv_isattr(np,NV_ARRAY) && nv_arraychild(np,(Namval_t*)0,0)==np)
 		return(nv_getv(np,fp));
+#endif
 	return(walk_tree(np,0));
 }
 
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/parse.c ksh93_2007_06_28/src/cmd/ksh93/sh/parse.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/parse.c	2006-11-29 15:32:12.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/parse.c	2007-05-21 23:51:20.000000000 +0200
@@ -298,6 +298,9 @@
 	    case LPAREN:
 		t = sh_cmd(RPAREN,SH_NL|SH_EMPTY);
 		break;
+	    case LBRACE:
+		t = sh_cmd(RBRACE,SH_NL|SH_EMPTY);
+		break;
 	}
 	shlex.comsub = 0;
 	if(!sp && (sp=fcfile()))
@@ -801,7 +804,18 @@
 			ap->argflag |= ARG_MESSAGE;
 			*settail = ap;
 			settail = &(ap->argnxt.ap);
-			n = skipnl(0);
+			while((n = skipnl(0))==0)
+			{
+				ap = (struct argnod*)stakseek(ARGVAL);
+				ap->argflag= ARG_ASSIGN;
+				sfprintf(stkstd,"[%d]=",index++);
+				stakputs(shlex.arg->argval);
+				ap = (struct argnod*)stakfreeze(1);
+				ap->argnxt.ap = 0;
+				ap->argflag = shlex.arg->argflag;
+				*settail = ap;
+				settail = &(ap->argnxt.ap);
+			}
 		}
 	}
 	else if(n)
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/subshell.c ksh93_2007_06_28/src/cmd/ksh93/sh/subshell.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/subshell.c	2007-04-30 17:29:04.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/subshell.c	2007-05-15 23:38:02.000000000 +0200
@@ -367,7 +367,7 @@
 	if(!shp->pwd)
 		path_pwd(0);
 	sp->bckpid = shp->bckpid;
-	if(!comsub || !sh_isoption(SH_SUBSHARE))
+	if(!comsub || (comsub==1 && !sh_isoption(SH_SUBSHARE)))
 	{
 		sp->shpwd = shp->pwd;
 		sp->pwd = (shp->pwd?strdup(shp->pwd):0);
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh/xec.c ksh93_2007_06_28/src/cmd/ksh93/sh/xec.c
--- ksh93_2007_05_15/src/cmd/ksh93/sh/xec.c	2007-05-02 23:52:12.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/sh/xec.c	2007-06-25 22:13:32.000000000 +0200
@@ -1012,7 +1012,8 @@
 			int pipes[2];
 			no_fork = (execflg && !(type&(FAMP|FPOU)) &&
 				!sh.subshell && !sh.st.trapcom[0] && 
-				!sh.st.trap[SH_ERRTRAP] && sh.fn_depth==0);
+				!sh.st.trap[SH_ERRTRAP] && sh.fn_depth==0 &&
+				!(pipejob && sh_isoption(SH_PIPEFAIL)));
 			if(sh.subshell)
 				sh_subtmpfile();
 			if(sh_isstate(SH_PROFILE) || sh.dot_depth)
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/sh.1 ksh93_2007_06_28/src/cmd/ksh93/sh.1
--- ksh93_2007_05_15/src/cmd/ksh93/sh.1	2007-03-06 20:57:14.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/sh.1	2007-06-22 04:34:48.000000000 +0200
@@ -1107,8 +1107,10 @@
 .I parameter\^
 is followed by a letter, digit, or underscore
 that is not to be interpreted as part of its name,
-when the variable name contains a \fB\s+2.\s-2\fP,
-or when a variable is subscripted.
+when the variable name contains a \fB\s+2.\s-2\fP.
+The braces are also required when a variable is subscripted
+unless it is part of an Arithmetic Expression
+or a Conditional Expression.
 If
 .I parameter\^
 is one or more digits then it is a positional parameter.
@@ -6375,7 +6377,7 @@
 to fail or zero of no command has failed.
 .TP 8
 .B showme
-When enabled, simple commands or pipelines preceded by a a semicolon
+When enabled, simple commands or pipelines preceded by a semicolon
 .RB ( ; )
 will be displayed as if the
 .B xtrace
@@ -7086,6 +7088,11 @@
 .I name\^
 even if name is an alias, a function, or a reserved word.
 The
+.B \-p
+option turns off the
+.B \-v
+option.
+The
 .B \-a
 option
 is similar to the
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/arrays2.sh ksh93_2007_06_28/src/cmd/ksh93/tests/arrays2.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/arrays2.sh	1970-01-01 01:00:00.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/arrays2.sh	2007-05-23 16:37:02.000000000 +0200
@@ -0,0 +1,124 @@
+########################################################################
+#                                                                      #
+#               This software is part of the ast package               #
+#           Copyright (c) 1982-2007 AT&T Knowledge Ventures            #
+#                      and is licensed under the                       #
+#                  Common Public License, Version 1.0                  #
+#                      by AT&T Knowledge Ventures                      #
+#                                                                      #
+#                A copy of the License is available at                 #
+#            http://www.opensource.org/licenses/cpl1.0.txt             #
+#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
+#                                                                      #
+#              Information and Software Systems Research               #
+#                            AT&T Research                             #
+#                           Florham Park NJ                            #
+#                                                                      #
+#                  David Korn <dgk at research.att.com>                   #
+#                                                                      #
+########################################################################
+function err_exit
+{
+	print -u2 -n "\t"
+	print -u2 -r ${Command}[$1]: "${@:2}"
+	let Errors+=1
+}
+alias err_exit='err_exit $LINENO'
+
+Command=${0##*/}
+integer Errors=0
+for	((i=0; i < 4; i++ ))
+do	for	((j=0; j < 5; j++ ))
+	do	a[i][j]=$i$j
+	done
+done
+for	((i=0; i < 4; i++ ))
+do	for	((j=0; j < 5; j++ ))
+	do	[[ ${a[i][j]} == "$i$j" ]] || err_exit "\${a[$i][$j]} != $i$j"
+	done
+done
+for	((i=0; i < 4; i++ ))
+do	j=0;for k in ${a[i][@]}
+	do	[[ $k == "$i$j" ]] || err_exit "\${a[i][@]} != $i$j"
+		(( j++ ))
+	done
+done
+unset a
+a=(
+	( 00 01 02 03 04 )
+	( 10 11 12 13 14 15)
+	( 20 21 22 23 24 )
+	( 30 31 32 33 34 )
+)
+
+function check
+{
+	nameref a=$1
+	nameref b=a[2]
+	typeset c=$1
+	integer i j
+	for	((i=0; i < 4; i++ ))
+	do	for	((j=0; j < 5; j++ ))
+		do	[[ ${a[$i][$j]} == "$i$j" ]] || err_exit "\${$c[$i][$j]} != $i$j"
+		done
+	done
+	(( ${#a[@]} == 4 )) || err_exit "\${#$c[@]} not 4"
+	(( ${#a[0][@]} == 5 )) || err_exit "\${#$c[0][@]} not 5"
+	(( ${#a[1][@]} == 6 )) || err_exit "\${#$c[1][@]} not 6"
+	set -s -- ${!a[@]}
+	[[ ${@} == '0 1 2 3' ]] || err_exit "\${!$c[@]} not 0 1 2 3"
+	set -s -- ${!a[0][@]}
+	[[ ${@} == '0 1 2 3 4' ]] || err_exit "\${!$c[0][@]} not 0 1 2 3 4"
+	set -s -- ${!a[1][@]}
+	[[ ${@} == '0 1 2 3 4 5' ]] || err_exit "\${!$c[1][@]} not 0 1 2 3 4 5"
+	[[ $a == 00 ]] || err_exit  "\$$c is not 00"
+	[[ ${a[0]} == 00 ]] || err_exit  "\${$a[0]} is not 00"
+	[[ ${a[0][0]} == 00 ]] || err_exit  "${a[0][0]} is not 00"
+	[[ ${a[0][0][0]} == 00 ]] || err_exit  "\${$c[0][0][0]} is not 00"
+	[[ ${a[0][0][1]} == '' ]] || err_exit  "\${$c[0][0][1]} is not empty"
+	[[ ${b[3]} == 23 ]] || err_exit "${!b}[3] not = 23"
+}
+
+check a
+
+exit
+unset a
+typeset -A a
+for	((i=0; i < 4; i++ ))
+do	for	((j=0; j < 5; j++ ))
+	do	a[$i][j]=$i$j
+	done
+done
+for	((i=0; i < 4; i++ ))
+do	for	((j=0; j < 5; j++ ))
+	do	[[ ${a[$i][j]} == "$i$j" ]] || err_exit "\${a[$i][$j]} == $i$j"
+	done
+done
+a[1][5]=15
+b=(
+	[0]=( 00 01 02 03 04 )
+	[1]=( 10 11 12 13 14 15)
+	[2]=( 20 21 22 23 24 )
+	[3]=( 30 31 32 33 34 )
+)
+check b
+[[ ${a[1][@]} == "${b[1][@]}" ]] || err_exit "a[1] not equal to b[1]"
+c=(
+	[0]=( [0]=00 [1]=01 [2]=02 [3]=03 [4]=04 )
+	[1]=( [0]=10 [1]=11 [2]=12 [3]=13 [4]=14 [5]=15)
+	[2]=( [0]=20 [1]=21 [2]=22 [3]=23 [4]=24 )
+	[3]=( [0]=30 [1]=31 [2]=32 [3]=33 [4]=34 )
+)
+check c
+typeset -A d
+d[0]=( [0]=00 [1]=01 [2]=02 [3]=03 [4]=04 )
+d[1]=( [0]=10 [1]=11 [2]=12 [3]=13 [4]=14 [5]=15)
+d[2]=( [0]=20 [1]=21 [2]=22 [3]=23 [4]=24 )
+d[3]=( [0]=30 [1]=31 [2]=32 [3]=33 [4]=34 )
+check d
+unset a b c d
+[[ ${a-set} ]] || err_exit "a is set after unset"
+[[ ${b-set} ]] || err_exit "b is set after unset"
+[[ ${c-set} ]] || err_exit "c is set after unset"
+[[ ${d-set} ]] || err_exit "c is set after unset"
+exit $((Errors))
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/arrays.sh ksh93_2007_06_28/src/cmd/ksh93/tests/arrays.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/arrays.sh	2007-01-04 02:59:14.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/arrays.sh	2007-06-18 19:28:47.000000000 +0200
@@ -378,4 +378,19 @@
 unset bar
 : ${_foo[bar=4]}
 (( bar == 4 )) || err_exit 'subscript of unset variable not evaluated'
+unset foo bar
+foo[5]=4
+bar[4]=3
+bar[0]=foo
+foo[0]=bam
+foo[4]=5
+[[ ${bar[${foo[5]}]} == 3 ]] || err_exit  'array subscript cannot be an array instance'
+[[ $bar[4] == 3 ]] || err_exit '$bar[x] != ${bar[x]} inside [[ ]]'
+(( $bar[4] == 3  )) || err_exit '$bar[x] != ${bar[x]} inside (( ))'
+[[ $bar[$foo[5]] == 3 ]]  || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside [[ ]]'
+(( $bar[$foo[5]] == 3  )) || err_exit '$bar[foo[x]] != ${bar[foo[x]]} inside (( ))'
+x=$bar[4]
+[[ $x == 4 ]] && err_exit '$bar[4] should not be an array in an assignment'
+x=${bar[$foo[5]]}
+(( $x == 3 )) || err_exit '${bar[$foo[sub]]} not working'
 exit $((Errors))
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/expand.sh ksh93_2007_06_28/src/cmd/ksh93/tests/expand.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/expand.sh	2006-08-23 08:37:01.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/expand.sh	2007-05-29 02:54:33.000000000 +0200
@@ -37,6 +37,8 @@
 	'f{d,e,f}g'				'fdg feg ffg' \
 	'{l,n,m}xyz'				'lxyz nxyz mxyz' \
 	'{abc\,def}'				'{abc,def}' \
+	'{"abc,def"}'				'{abc,def}' \
+	"{'abc,def'}"				'{abc,def}' \
 	'{abc}'					'{abc}' \
 	'\{a,b,c,d,e}'				'{a,b,c,d,e}' \
 	'{x,y,\{a,b,c}}'			'x} y} {a} b} c}' \
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/functions.sh ksh93_2007_06_28/src/cmd/ksh93/tests/functions.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/functions.sh	2006-11-29 15:40:15.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/functions.sh	2007-05-29 02:57:19.000000000 +0200
@@ -755,4 +755,19 @@
 	done
 }
 [[ $(foo 'NUMBERED RECORDSIZE') == ok ]] || err_exit 'optimization error with undefined variable'
+unset x
+x=$(
+	set -e
+	integer count=0
+	function err_f
+	{
+		if	((count++==3))  
+		then	print failed
+		else	false
+		fi
+	}
+	trap 'err_f' ERR
+	false
+)
+[[ $x == failed ]] && err_exit 'ERR trap executed multiple times'
 exit $((Errors))
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/options.sh ksh93_2007_06_28/src/cmd/ksh93/tests/options.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/options.sh	2007-05-11 22:42:25.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/options.sh	2007-06-25 22:19:56.000000000 +0200
@@ -310,6 +310,7 @@
 false | true | true    && err_exit 'pipe with first not failing with pipefail'
 true | false | true    && err_exit 'pipe middle not failing with pipefail'
 true | true | false    && err_exit 'pipe last not failing with pipefail'
+$SHELL -c 'set -o pipefail; false | /bin/true;' && err_exit 'pipefail not returning failure with sh -c'
 $SHELL -c '[[ $- == *c* ]]' || err_exit  'option c not in $-'
 trap 'rm -f /tmp/.profile' EXIT
 > /tmp/.profile
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/restricted.sh ksh93_2007_06_28/src/cmd/ksh93/tests/restricted.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/restricted.sh	2007-03-06 18:28:39.000000000 +0100
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/restricted.sh	2007-06-26 09:01:51.000000000 +0200
@@ -72,7 +72,6 @@
 #! $SHELL
 print hello
 !
-cp script /tmp/dgk
 check_restricted 'script;:' ||  err_exit 'script with #! pathname should not run in restricted mode'
 check_restricted 'script' ||  err_exit 'script with #! pathname should not run in restricted mode even if last command in script'
 exit $((Errors))
diff -r -N -u ksh93_2007_05_15/src/cmd/ksh93/tests/substring.sh ksh93_2007_06_28/src/cmd/ksh93/tests/substring.sh
--- ksh93_2007_05_15/src/cmd/ksh93/tests/substring.sh	2007-05-14 16:55:20.000000000 +0200
+++ ksh93_2007_06_28/src/cmd/ksh93/tests/substring.sh	2007-06-25 17:14:35.000000000 +0200
@@ -170,6 +170,17 @@
 if	[[ ${xx//%28/abc\)} != 'abc)text%29' ]]
 then	 err_exit '${xx//%28/abc\)} not working'
 fi
+xx='a:b'
+str='(){}[]*?|&^%$#@l'
+for ((i=0 ; i < ${#str}; i++))
+do      [[ $(eval print -r -- \${xx//:/\\${str:i:1}}) == "a${str:i:1}b" ]] || err_exit "substitution of \\${str:i:1}} failed"
+        [[ $(eval print -rn -- \${xx//:/\'${str:i:1}\'}) == "a${str:i:1}b" ]] || err_exit "substitution of '${str:i:1}' failed"
+        [[ $(eval print -r -- \${xx//:/\"${str:i:1}\"}) == "a${str:i:1}b" ]] || err_exit "substitution of \"${str:i:1}\" failed"
+done
+[[ ${xx//:/\\n} == 'a\nb' ]]  || err_exit "substituion of \\\\n failed"
+[[ ${xx//:/'\n'} == 'a\nb' ]] || err_exit "substituion of '\\n' failed"
+[[ ${xx//:/"\n"} ==  'a\nb' ]] || err_exit "substituion of \"\\n\" failed"
+[[ ${xx//:/$'\n'} ==  $'a\nb' ]] || err_exit "substituion of \$'\\n' failed"
 unset foo
 foo=one/two/three
 if	[[ ${foo//'/'/_} != one_two_three ]]
@@ -274,6 +285,10 @@
 a='\[abc @(*) def\]'
 b='[abc 123 def]'
 [[ ${b//$a/\1} == 123 ]] || err_exit "\${var/pattern} not working with \[ in pattern"
+unset foo
+foo='(win32.i386) '
+[[ ${foo/'('/'(x11-'} == '(x11-win32.i386) ' ]] || err_exit "\${var/pattern} not working with ' in pattern" 
+$SHELL -c $'v=\'$(hello)\'; [[ ${v//\'$(\'/-I\'$(\'} == -I"$v" ]]' 2> /dev/null || err_exit "\${var/pattern} not working with \$( as pattern"
 unset X
 $SHELL -c '[[ ! ${X[@]:0:300} ]]' 2> /dev/null || err_exit '${X[@]:0:300} with X undefined fails'
 $SHELL -c '[[ ${@:0:300} == "$0" ]]' 2> /dev/null || err_exit '${@:0:300} with no arguments fails'
diff -r -N -u ksh93_2007_05_15/src/lib/libast/features/fs ksh93_2007_06_28/src/lib/libast/features/fs
--- ksh93_2007_05_15/src/lib/libast/features/fs	2006-09-21 06:41:53.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libast/features/fs	2007-05-24 17:28:16.000000000 +0200
@@ -54,6 +54,7 @@
 }end
 
 header	sys/stat.h
+header	sys/mkdev.h
 
 extern	chmod		int	(const char*, mode_t)
 extern	fstat		int	(int, struct stat*)
diff -r -N -u ksh93_2007_05_15/src/lib/libast/Mamfile ksh93_2007_06_28/src/lib/libast/Mamfile
--- ksh93_2007_05_15/src/lib/libast/Mamfile	2007-05-16 05:16:04.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libast/Mamfile	2007-06-29 07:09:12.000000000 +0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-06-21
 setv INSTALLROOT ../../..
 setv PACKAGEROOT ../../../../..
 setv AR ar
diff -r -N -u ksh93_2007_05_15/src/lib/libast/RELEASE ksh93_2007_06_28/src/lib/libast/RELEASE
--- ksh93_2007_05_15/src/lib/libast/RELEASE	2007-05-16 02:08:01.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libast/RELEASE	2007-05-21 19:30:43.000000000 +0200
@@ -1,3 +1,4 @@
+07-05-21 tm/tmxfmt.c,tmxscan.c: %F => %L (TM_DEFAULT); %F => %Y-%m-%d
 07-05-15 sfio/sfvprintf.c: %h? and SFFMT_SHORT => raw bytes
 07-05-09 features/signal.c,features/siglist: use kill -l & strsignal()
 07-04-25 misc/optctx.c: add for opt_info switching
diff -r -N -u ksh93_2007_05_15/src/lib/libast/tm/tmxfmt.c ksh93_2007_06_28/src/lib/libast/tm/tmxfmt.c
--- ksh93_2007_05_15/src/lib/libast/tm/tmxfmt.c	2007-01-17 21:36:13.000000000 +0100
+++ ksh93_2007_06_28/src/lib/libast/tm/tmxfmt.c	2007-05-21 19:27:32.000000000 +0200
@@ -242,9 +242,8 @@
 		case 'o':	/* OBSOLETE */
 			p = tm_info.deformat;
 			goto push;
-		case 'F':	/* TM_DEFAULT */
-		case 'O':	/* OBSOLETE */
-			p = tm_info.format[TM_DEFAULT];
+		case 'F':	/* ISO 8601:2000 standard date format */
+			p = "%Y-%m-%d";
 			goto push;
 		case 'g':	/* %V 2 digit year */
 		case 'G':	/* %V 4 digit year */
@@ -303,6 +302,10 @@
 			}
 			p = tm_info.format[TM_RECENT];
 			goto push;
+		case 'L':	/* TM_DEFAULT */
+		case 'O':	/* OBSOLETE */
+			p = tm_info.format[TM_DEFAULT];
+			goto push;
 		case 'm':	/* month number */
 			cp = number(cp, ep, (long)(tp->tm_mon + 1), 2, width, pad);
 			continue;
diff -r -N -u ksh93_2007_05_15/src/lib/libast/tm/tmxscan.c ksh93_2007_06_28/src/lib/libast/tm/tmxscan.c
--- ksh93_2007_05_15/src/lib/libast/tm/tmxscan.c	2007-03-11 12:43:11.000000000 +0100
+++ ksh93_2007_06_28/src/lib/libast/tm/tmxscan.c	2007-05-21 19:30:12.000000000 +0200
@@ -262,6 +262,9 @@
 					goto more;
 				}
 				continue;
+			case 'F':
+				p = "%Y-%m-%d";
+				break;
 			case 'H':
 			case 'k':
 				NUMBER(2, 0, 23);
diff -r -N -u ksh93_2007_05_15/src/lib/libcmd/cksum.c ksh93_2007_06_28/src/lib/libcmd/cksum.c
--- ksh93_2007_05_15/src/lib/libcmd/cksum.c	2007-05-08 23:13:36.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libcmd/cksum.c	2007-05-20 20:57:02.000000000 +0200
@@ -27,7 +27,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: sum (AT&T Research) 2007-02-07 $\n]"
+"[-?\n@(#)$Id: sum (AT&T Research) 2007-05-20 $\n]"
 USAGE_LICENSE
 "[+NAME?cksum,md5sum,sum - print file checksum and block count]"
 "[+DESCRIPTION?\bsum\b lists the checksum, and for most methods the block"
@@ -106,6 +106,7 @@
 #include <cmd.h>
 #include <sum.h>
 #include <ls.h>
+#include <modex.h>
 #include <fts.h>
 #include <error.h>
 
diff -r -N -u ksh93_2007_05_15/src/lib/libcmd/cmd.h ksh93_2007_06_28/src/lib/libcmd/cmd.h
--- ksh93_2007_05_15/src/lib/libcmd/cmd.h	2007-05-11 21:32:56.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libcmd/cmd.h	2007-05-20 20:57:40.000000000 +0200
@@ -141,7 +141,11 @@
 
 #define _CMD_CONTEXT_OK(p)	(((Shbltin_t*)(p))->version>=20070511&&((Shbltin_t*)(p))->version<20350101)
 #undef	cmdinit
+#ifdef _MSC_VER
+#define cmdinit(a,b,c,d,e)	do{if(_cmd_init(a,b,c,d,e))return -1;}while(0)
+#else
 #define cmdinit(a,b,c,d,e)	do{if((c)&&!_CMD_CONTEXT_OK(c))c=0;if(_cmd_init(a,b,c,d,e))return -1;}while(0)
+#endif
 
 #if _BLD_cmd && defined(__EXPORT__)
 #define extern			extern __EXPORT__
diff -r -N -u ksh93_2007_05_15/src/lib/libcmd/date.c ksh93_2007_06_28/src/lib/libcmd/date.c
--- ksh93_2007_05_15/src/lib/libcmd/date.c	2007-05-09 06:07:11.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libcmd/date.c	2007-05-21 19:32:32.000000000 +0200
@@ -27,7 +27,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: date (AT&T Research) 2007-03-28 $\n]"
+"[-?\n@(#)$Id: date (AT&T Research) 2007-05-21 $\n]"
 USAGE_LICENSE
 "[+NAME?date - set/list/convert dates]"
 "[+DESCRIPTION?\bdate\b sets the current date and time (with appropriate"
@@ -96,7 +96,7 @@
 "		[+e?blank padded day of month number]"
 "		[+E?unpadded day of month number]"
 "		[+f?locale default override date format]"
-"		[+F?locale default date format]"
+"		[+F?%ISO 8601:2000 standard date format; equivalent to Y-%m-%d]"
 "		[+g?\bls\b(1) \b-l\b recent date with \ahh:mm\a]"
 "		[+G?\bls\b(1) \b-l\b distant date with \ayyyy\a]"
 "		[+h?abbreviated month name]"
@@ -108,6 +108,7 @@
 "		[+k?\bdate\b(1) style date]"
 "		[+K?all numeric date; equivalent to \b%Y-%m-%d+%H:%M:%S\b]"
 "		[+l?\bls\b(1) \b-l\b date; equivalent to \b%Q/%g/%G/\b]"
+"		[+L?locale default date format]"
 "		[+m?month number]"
 "		[+M?minutes]"
 "		[+n?newline character]"
diff -r -N -u ksh93_2007_05_15/src/lib/libcmd/Mamfile ksh93_2007_06_28/src/lib/libcmd/Mamfile
--- ksh93_2007_05_15/src/lib/libcmd/Mamfile	2007-05-16 05:16:05.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libcmd/Mamfile	2007-06-29 07:09:13.000000000 +0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-06-21
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
@@ -182,6 +182,13 @@
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/error.h
 prev ${PACKAGE_ast_INCLUDE}/fts.h implicit
+make ${PACKAGE_ast_INCLUDE}/modex.h implicit
+make ${PACKAGE_ast_INCLUDE}/modecanon.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/modecanon.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast_fs.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/modex.h
 prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
 make ${PACKAGE_ast_INCLUDE}/sum.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
diff -r -N -u ksh93_2007_05_15/src/lib/libcmd/RELEASE ksh93_2007_06_28/src/lib/libcmd/RELEASE
--- ksh93_2007_05_15/src/lib/libcmd/RELEASE	2007-05-11 21:32:32.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libcmd/RELEASE	2007-05-20 20:58:47.000000000 +0200
@@ -1,3 +1,5 @@
+07-05-20 cmd.h: handle msvc's balk at if(0)0=0;
+07-05-20 cksum.c: #include <modex.h>
 07-05-11 cmd.h: add _CMD_CONTEXT_OK() to verify >= 20070511 context
 07-05-09 fds.c: handle ipv6 sockets
 07-05-09 cmd.h: <shbltin.h> : cmdquit() => sh_checksig(context)
diff -r -N -u ksh93_2007_05_15/src/lib/libdll/Mamfile ksh93_2007_06_28/src/lib/libdll/Mamfile
--- ksh93_2007_05_15/src/lib/libdll/Mamfile	2007-04-20 21:57:17.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libdll/Mamfile	2007-06-29 07:09:14.000000000 +0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-06-21
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
diff -r -N -u ksh93_2007_05_15/src/lib/libsum/Mamfile ksh93_2007_06_28/src/lib/libsum/Mamfile
--- ksh93_2007_05_15/src/lib/libsum/Mamfile	2007-04-20 21:57:19.000000000 +0200
+++ ksh93_2007_06_28/src/lib/libsum/Mamfile	2007-06-29 07:09:14.000000000 +0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-06-21
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib


More information about the ksh93-integration-discuss mailing list