[ksh93-integration-discuss] [Fwd: [ast-users] 2007-05-15 beta source tarballs]

Felix Schulte felix.schulte at gmail.com
Wed May 23 06:27:48 PDT 2007


On 5/20/07, Roland Mainz <roland.mainz at nrubsig.org> wrote:
>
> Hi!
>
> ----
>
> ast-ksh.2007-05-15 is out (yes, yes, I know... I am little bit late with
> this annoucement... ;-( )
>
> -------- Original Message --------
patch diff from 20070418 to 20070515 attached
-- 
      _        Felix Schulte
    _|_|_     mailto:felix.schulte at gmail.com
    (0 0)
ooO--(_)--Ooo
-------------- next part --------------
diff -r -N -u ksh93_2007_04_18/lib/package/ast-ksh.html ksh93_2007_05_15/lib/package/ast-ksh.html
--- ksh93_2007_04_18/lib/package/ast-ksh.html	2007-04-18 20:07:29.000000000 +0200
+++ ksh93_2007_05_15/lib/package/ast-ksh.html	2007-05-16 05:16:01.000000000 +0200
@@ -193,7 +193,19 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="ksh93 changes">ksh93 changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
-07-04-18  --- Release ksh93s+  ---
+07-05-15  --- Release ksh93s+  ---
+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
+	  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
+	  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
 	  been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
@@ -1654,6 +1666,19 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libast changes">libast changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+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
+07-04-24 misc/cmdarg.c,include/cmdarg.h: add CMD_CHECKED, CMD_SILENT
+07-04-24 misc/procopen.c,include/proc.h: add PROC_CHECK
+07-04-24 misc/procrun.c: add flags arg (current use PROC_ARGMOD)
+07-04-24 misc/cmdarg.c,include/cmdarg.h: move from src/cmd/tw
+07-04-20 port/(lclang.h|lc.c|mc.c|lclib.h|lcgen.c): separate lctab.c
+07-04-20 comp/conf.sh: defer to systems without 'grep -q' -- sigh
+07-04-20 comp/conf.sh: probe for LL integer constant initializer suffix
+07-04-20 include/syslog.h: &lt;namval.h&gt; =&gt; &lt;ast_namval.h&gt; for win32
+07-04-20 ast_namval.h: add as copy of include/namval.h for win32
+07-04-19 comp/conf.tab: fix SVID SI entries to probe SI_* (not _SI_*)
 07-04-13 tm/tmxdate.c,tm/tmzone.c: handle &#0091;-+&#0093;0000 UTC zone offset
 07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
 07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER =&gt; nan/inf vs. NAN/INF
@@ -1661,6 +1686,7 @@
 07-03-28 misc/optget.c: fix l10n --?-
 07-03-25 features/common: fix { ast_std.h ast_map.h stdint.h } logic
 07-03-21 error.h: move from error_info to (*_error_data_)
+07-03-21 misc/error.c: add errorctx() for error_info switching
 07-03-21 option.h: move from opt_info to (*_opt_data_)
 07-03-19 regex/regdecomp.c: fix REX_ONECHAR escapes and add REX_KMP
 07-03-11 tm/tmxscan.c,regex/regnexec.c: fix strict-alias transgressions
@@ -3080,7 +3106,13 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libcmd changes">libcmd changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
-07-03-28 date.c: add --unelepsed=scale, -U: fmtelapsed() =&gt; strelapsed()
+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)
+07-04-25 mkdir.c: force (S_ISVTX|S_ISUID|S_ISGID) after mkdir(2)
+07-04-24 procrun.c: add -last intercept =&gt; sh_run() and whence -q
+07-04-19 uname.c: name operands first checked for CS_NAME, then NAME
+07-03-28 date.c: add --unelapsed=scale, -U: fmtelapsed() =&gt; strelapsed()
 07-03-25 wclib.h: iswspace() requires &lt;wctype.h&gt;!
 07-03-11 tty.c: add sysV --line-number, -l
 07-02-26 Makefile: sumlib.o: direct extract from +lsum (vcodex someday)
@@ -3364,7 +3396,7 @@
 <TR>
 <TD align=left></TD>
 <TD align=center></TD>
-<TD align=right>April 18, 2007</TD>
+<TD align=right>May 15, 2007</TD>
 </TR>
 </TABLE>
 <P>
diff -r -N -u ksh93_2007_04_18/lib/package/ast-ksh.README ksh93_2007_05_15/lib/package/ast-ksh.README
--- ksh93_2007_04_18/lib/package/ast-ksh.README	2007-04-18 20:07:28.000000000 +0200
+++ ksh93_2007_05_15/lib/package/ast-ksh.README	2007-05-16 05:16:00.000000000 +0200
@@ -92,7 +92,19 @@
 
 :::::::: ksh93 ::::::::
 
-07-04-18  --- Release ksh93s+  ---
+07-05-15  --- Release ksh93s+  ---
+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
+	  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
+	  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
 	  been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
@@ -1550,6 +1562,19 @@
 
 :::::::: libast ::::::::
 
+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
+07-04-24 misc/cmdarg.c,include/cmdarg.h: add CMD_CHECKED, CMD_SILENT
+07-04-24 misc/procopen.c,include/proc.h: add PROC_CHECK
+07-04-24 misc/procrun.c: add flags arg (current use PROC_ARGMOD)
+07-04-24 misc/cmdarg.c,include/cmdarg.h: move from src/cmd/tw
+07-04-20 port/(lclang.h|lc.c|mc.c|lclib.h|lcgen.c): separate lctab.c
+07-04-20 comp/conf.sh: defer to systems without 'grep -q' -- sigh
+07-04-20 comp/conf.sh: probe for LL integer constant initializer suffix
+07-04-20 include/syslog.h: <namval.h> => <ast_namval.h> for win32
+07-04-20 ast_namval.h: add as copy of include/namval.h for win32
+07-04-19 comp/conf.tab: fix SVID SI entries to probe SI_* (not _SI_*)
 07-04-13 tm/tmxdate.c,tm/tmzone.c: handle [-+]0000 UTC zone offset
 07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
 07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER => nan/inf vs. NAN/INF
@@ -1557,6 +1582,7 @@
 07-03-28 misc/optget.c: fix l10n --?-
 07-03-25 features/common: fix { ast_std.h ast_map.h stdint.h } logic
 07-03-21 error.h: move from error_info to (*_error_data_)
+07-03-21 misc/error.c: add errorctx() for error_info switching
 07-03-21 option.h: move from opt_info to (*_opt_data_)
 07-03-19 regex/regdecomp.c: fix REX_ONECHAR escapes and add REX_KMP
 07-03-11 tm/tmxscan.c,regex/regnexec.c: fix strict-alias transgressions
@@ -2973,7 +2999,13 @@
 
 :::::::: libcmd ::::::::
 
-07-03-28 date.c: add --unelepsed=scale, -U: fmtelapsed() => strelapsed()
+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)
+07-04-25 mkdir.c: force (S_ISVTX|S_ISUID|S_ISGID) after mkdir(2)
+07-04-24 procrun.c: add -last intercept => sh_run() and whence -q
+07-04-19 uname.c: name operands first checked for CS_NAME, then NAME
+07-03-28 date.c: add --unelapsed=scale, -U: fmtelapsed() => strelapsed()
 07-03-25 wclib.h: iswspace() requires <wctype.h>!
 07-03-11 tty.c: add sysV --line-number, -l
 07-02-26 Makefile: sumlib.o: direct extract from +lsum (vcodex someday)
diff -r -N -u ksh93_2007_04_18/lib/package/ast-ksh.ver ksh93_2007_05_15/lib/package/ast-ksh.ver
--- ksh93_2007_04_18/lib/package/ast-ksh.ver	2007-04-18 20:07:27.000000000 +0200
+++ ksh93_2007_05_15/lib/package/ast-ksh.ver	2007-05-15 07:49:57.000000000 +0200
@@ -1 +1 @@
-ast-ksh 2007-04-18 2007-04-18 1
+ast-ksh 2007-05-15 2007-05-15 1
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/print.c ksh93_2007_05_15/src/cmd/ksh93/bltins/print.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/print.c	2007-04-12 20:21:06.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/print.c	2007-05-16 04:36:53.000000000 +0200
@@ -751,6 +751,7 @@
 		break;
 	case 'B':
 		value->s = (char*)fmtbase64(value->s, &fe->size);
+		fe->flags |= SFFMT_SHORT;
 		break;
 	case 'H':
 		value->s = fmthtml(value->s);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/shopen.c ksh93_2007_05_15/src/cmd/ksh93/bltins/shopen.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/shopen.c	2007-03-20 20:08:28.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/shopen.c	2007-05-09 15:53:14.000000000 +0200
@@ -447,11 +447,11 @@
 ;
 
 
-extern int b_open(int argc, char *argv[], void *extra)
+extern int b_open(int argc, char *argv[], void *context)
 {
 	register Namval_t *np;
 	register int n,oflag=0;
-	Shell_t *shp = (Shell_t*)extra;
+	Shell_t *shp = ((Shbltin_t*)context)->shp;
 	struct filedata *fdp;
 	struct stat statb;
 	mode_t mode = 0666;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/typeset.c ksh93_2007_05_15/src/cmd/ksh93/bltins/typeset.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/typeset.c	2007-04-11 04:36:37.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/typeset.c	2007-05-02 23:46:02.000000000 +0200
@@ -535,14 +535,15 @@
 	return(r);
 }
 
-typedef void (*Iptr_t)(int);
+typedef void (*Iptr_t)(int,void*);
 typedef int (*Fptr_t)(int, char*[], void*);
 
 #define GROWLIB	4
 
-static void**	liblist;
-static int	nlib;
-static int	maxlib;
+static void		**liblist;
+static unsigned short	*libattr;
+static int		nlib;
+static int		maxlib;
 
 /*
  * This allows external routines to load from the same library */
@@ -562,26 +563,38 @@
 	register int	n;
 	register int	r;
 	Iptr_t		initfn;
+	Shbltin_t	*sp = &sh.bltindata;
 
+	sp->nosfio = 0;
 	for (n = r = 0; n < nlib; n++)
 	{
 		if (r)
+		{
 			liblist[n-1] = liblist[n];
+			libattr[n-1] = libattr[n];
+		}
 		else if (liblist[n] == library)
 			r++;
 	}
 	if (r)
 		nlib--;
 	else if ((initfn = (Iptr_t)dlllook(library, "lib_init")))
-		(*initfn)(0);
+		(*initfn)(0,sp);
 	if (nlib >= maxlib)
 	{
 		maxlib += GROWLIB;
 		if (liblist)
+		{
 			liblist = (void**)realloc((void*)liblist, (maxlib+1)*sizeof(void**));
+			libattr = (unsigned short*)realloc((void*)liblist, (maxlib+1)*sizeof(unsigned short*));
+		}
 		else
+		{
 			liblist = (void**)malloc((maxlib+1)*sizeof(void**));
+			libattr = (unsigned short*)malloc((maxlib+1)*sizeof(unsigned short*));
+		}
 	}
+	libattr[nlib] = NV_BLTINOPT|(sp->nosfio?BLT_NOSFIO:0);
 	liblist[nlib++] = library;
 	liblist[nlib] = 0;
 	return !r;
@@ -678,6 +691,8 @@
 				{
 					if(dlete || nv_isattr(np,BLT_SPC))
 						errmsg = "restricted name";
+					else
+						nv_onattr(np,libattr[n]);
 				}
 				break;
 			}
@@ -893,7 +908,11 @@
 				sfprintf(file,"[%s]\n", sh_fmtq(nv_refsub(np)));
 			}
 			else
+#if SHOPT_TYPEDEF
+				sfputr(file,nv_isvtree(np)?cp:sh_fmtq(cp),'\n');
+#else
 				sfputr(file,sh_fmtq(cp),'\n');
+#endif /* SHOPT_TYPEDEF */
 		}
 		return(1);
 	}
@@ -936,6 +955,10 @@
 	tp->scanmask = flag&~NV_NOSCOPE;
 	tp->scanroot = root;
 	tp->outfile = file;
+#if SHOPT_TYPEDEF
+	if(!tp->prefix && tp->tp)
+		tp->prefix = nv_name(tp->tp);
+#endif /* SHOPT_TYPEDEF */
 	if(flag&NV_INTEGER)
 		tp->scanmask |= (NV_DOUBLE|NV_EXPNOTE);
 	namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/bltins/whence.c ksh93_2007_05_15/src/cmd/ksh93/bltins/whence.c
--- ksh93_2007_04_18/src/cmd/ksh93/bltins/whence.c	2005-12-07 17:14:16.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/bltins/whence.c	2007-04-24 22:12:48.000000000 +0200
@@ -40,6 +40,7 @@
 #define A_FLAG	4
 #define F_FLAG	010
 #define X_FLAG	020
+#define Q_FLAG	040
 
 static int whence(Shell_t *,char**, int);
 
@@ -112,6 +113,9 @@
 	    case 'p':
 		flags |= P_FLAG;
 		break;
+	    case 'q':
+		flags |= Q_FLAG;
+		break;
 	    case ':':
 		errormsg(SH_DICT,2, "%s", opt_info.arg);
 		break;
@@ -140,6 +144,8 @@
 	Pathcomp_t *pp;
 #endif
 	int notrack = 1;
+	if(flags&Q_FLAG)
+		flags &= ~A_FLAG;
 	while(name= *argv++)
 	{
 		tofree=0;
@@ -151,6 +157,8 @@
 #endif
 		if(flags&P_FLAG)
 			goto search;
+		if(flags&Q_FLAG)
+			goto bltins;
 		/* reserved words first */
 		if(sh_lookup(name,shtab_reserved))
 		{
@@ -179,6 +187,7 @@
 			aflag++;
 		}
 		/* built-ins and functions next */
+	bltins:
 		root = (flags&F_FLAG)?shp->bltin_tree:shp->fun_tree;
 		if(np= nv_bfsearch(name, root, &nq, &notused))
 		{
@@ -194,6 +203,8 @@
 				else
 					cp = sh_translate(is_function);
 			}
+			if(flags&Q_FLAG)
+				continue;
 			sfprintf(sfstdout,"%s%s\n",name,cp);
 			if(!aflag)
 				continue;
@@ -227,7 +238,9 @@
 			cp = shp->lastpath;
 		shp->lastpath = 0;
 #endif
-		if(cp)
+		if(flags&Q_FLAG)
+			r |= !cp;
+		else if(cp)
 		{
 			if(flags&V_FLAG)
 			{
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/data/builtins.c ksh93_2007_05_15/src/cmd/ksh93/data/builtins.c
--- ksh93_2007_04_18/src/cmd/ksh93/data/builtins.c	2007-03-27 20:07:41.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/data/builtins.c	2007-05-15 05:07:06.000000000 +0200
@@ -44,7 +44,7 @@
 #	define SHOPT_CMDLIB_HDR	<cmdlist.h>
 #endif
 #define Q(f)		#f	/* libpp cpp workaround -- fixed 2005-04-11 */
-#define CMDLIST(f)	SH_CMDLIB_DIR "/" Q(f), NV_BLTIN|NV_NOFREE, bltin(f),
+#define CMDLIST(f)	SH_CMDLIB_DIR "/" Q(f), NV_BLTIN|NV_BLTINOPT|NV_NOFREE, bltin(f),
 
 #undef	basename
 #undef	dirname
@@ -105,7 +105,6 @@
 	"jobs",		NV_BLTIN|BLT_ENV,		bltin(jobs),
 #endif	/* JOBS */
 	"false",	NV_BLTIN|BLT_ENV,		bltin(false),
-SH_CMDLIB_DIR "/getconf",NV_BLTIN|BLT_ENV,		bltin(getconf),
 	"getopts",	NV_BLTIN|BLT_ENV,		bltin(getopts),
 	"print",	NV_BLTIN|BLT_ENV,		bltin(print),
 	"printf",	NV_BLTIN|NV_NOFREE,		bltin(printf),
@@ -131,6 +130,7 @@
 	CMDLIST(basename)
 	CMDLIST(chmod)
 	CMDLIST(dirname)
+	CMDLIST(getconf)
 	CMDLIST(head)
 	CMDLIST(mkdir)
 	CMDLIST(logname)
@@ -1368,14 +1368,19 @@
 "[D\f:dump-strings\f?Do not execute the script, but output the set of double "
 	"quoted strings preceded by a \b$\b.  These strings are needed for "
 	"localization of the script to different locales.]"
-"[E?Reads the file \b${ENV-$HOME/.kshrc}\b, if it exists, as a profile. "
+"[E?Reads the file "
+#if SHOPT_SYSRC
+	"\b/etc/ksh.kshrc\b, if it exists, as a profile, followed by "
+#endif
+	"\b${ENV-$HOME/.kshrc}\b, if it exists, as a profile. "
 	"On by default for interactive shells; use \b+E\b to disable.]"
 #if SHOPT_PFSH
 "[P?Invoke the shell as a profile shell.  See \bpfexec\b(1).]"
 #endif
 #if SHOPT_KIA
 "[R]:[file?Do not execute the script, but create a cross reference database "
-	"in \afile\a that can be used a separate shell script browser.]"
+	"in \afile\a that can be used a separate shell script browser.  The "
+	"-R option requires a script to be specified as the first operand.]"
 #endif /* SHOPT_KIA */
 #if SHOPT_BASH
    "\fbash2\f"
@@ -1784,7 +1789,7 @@
 #endif /* SHOPT_FS_3D */
 
 const char sh_optwhence[] =
-"[-1c?\n@(#)$Id: whence (AT&T Research) 1999-07-07 $\n]"
+"[-1c?\n@(#)$Id: whence (AT&T Research) 2007-04-24 $\n]"
 USAGE_LICENSE
 "[+NAME?whence - locate a command and describe its type]"
 "[+DESCRIPTION?Without \b-v\b, \bwhence\b writes on standard output an "
@@ -1798,6 +1803,8 @@
 "[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.]"
+"[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 "
 	"if that name is one of the following:]{"
 	"[+?Reserved word]"
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/data/options.c ksh93_2007_05_15/src/cmd/ksh93/data/options.c
--- ksh93_2007_04_18/src/cmd/ksh93/data/options.c	2006-09-07 01:00:31.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/data/options.c	2007-05-11 21:06:43.000000000 +0200
@@ -25,7 +25,7 @@
 #include	"shtable.h"
 
 #if SHOPT_BASH
-#   define bashopt(a,b)	a,	b|SH_BASHOPT,
+#   define bashopt(a,b)		a,	b|SH_BASHOPT,
 #   define bashextra(a,b)	a,	b|SH_BASHEXTRA,
 #else
 #   define bashopt(a,b)
@@ -92,8 +92,15 @@
 	bashextra("physical",		SH_PHYSICAL)
 	bashextra("posix",		SH_POSIX)
 	"privileged",			SH_PRIVILEGED,
-#if SHOPT_PFSH
+#if SHOPT_BASH
+	"profile",			SH_LOGIN_SHELL|SH_COMMANDLINE,
+#   if SHOPT_PFSH
+	"pfsh",				SH_PFSH|SH_COMMANDLINE,
+#   endif
+#else
+#   if SHOPT_PFSH
 	"profile",			SH_PFSH|SH_COMMANDLINE,
+#   endif
 #endif
 	bashopt("progcomp",		SH_PROGCOMP)
 	bashopt("promptvars",		SH_PROMPTVARS)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/data/signals.c ksh93_2007_05_15/src/cmd/ksh93/data/signals.c
--- ksh93_2007_04_18/src/cmd/ksh93/data/signals.c	2005-06-01 06:10:35.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/data/signals.c	2007-05-07 14:39:12.000000000 +0200
@@ -55,6 +55,9 @@
 #ifdef SIGBUS
 	"BUS",		VAL(SIGBUS,SH_SIGDONE),		S("Bus error"),
 #endif /* SIGBUS */
+#ifdef SIGCANCEL
+	"CANCEL",	VAL(SIGCANCEL,SH_SIGIGNORE), 	S("Thread cancellation"),
+#endif /*SIGCANCEL */
 #ifdef SIGCHLD
 	"CHLD",		VAL(SIGCHLD,SH_SIGFAULT), 	S("Death of Child"),
 #   ifdef SIGCLD
@@ -71,6 +74,9 @@
 	"CONT",		VAL(SIGCONT,SH_SIGIGNORE),	S("Stopped process continued"),
 #endif	/* SIGCONT */
 	"DEBUG",	VAL(TRAP(SH_DEBUGTRAP),0),	"",
+#ifdef SIGDANGER
+	"DANGER",	VAL(SIGDANGER,0),	S("System crash soon"),
+#endif	/* SIGDANGER */
 #ifdef SIGDIL
 	"DIL",		VAL(SIGDIL,0),			S("DIL signal"),
 #endif	/* SIGDIL */
@@ -99,6 +105,12 @@
 #ifdef SIGIOT
 	"IOT",		VAL(SIGIOT,SH_SIGDONE),		S("Abort"),
 #endif	/* SIGIOT */
+#ifdef SIGJVM1
+	"JVM1",		VAL(SIGJVM1,SH_SIGIGNORE), 	S("Special signal used by Java Virtual Machine"),
+#endif /*SIGJVM1 */
+#ifdef SIGJVM2
+	"JVM2",		VAL(SIGJVM2,SH_SIGIGNORE), 	S("Special signal used by Java Virtual Machine"),
+#endif /*SIGJVM2 */
 	"KEYBD",	VAL(TRAP(SH_KEYTRAP),0),	"",
 #ifdef SIGKILL
 	"KILL",		VAL(SIGKILL,0),			S("Killed"),
@@ -144,7 +156,7 @@
 #define SIGRTMIN	_SIGRTMIN
 #endif 
 #endif
-#ifdef SIGRTMIN
+#if defined(SIGRTMIN) && SIGRTMIN > 0
 	"RTMIN",	VAL(SIGRTMIN,0),		S("Lowest priority realtime signal"),
 #endif	/* SIGRTMIN */
 #ifdef __SIGRTMAX
@@ -156,7 +168,7 @@
 #define SIGRTMAX	_SIGRTMAX
 #endif 
 #endif
-#ifdef SIGRTMAX
+#if defined(SIGRTMAX) && SIGRTMAX > 0
 	"RTMAX",	VAL(SIGRTMAX,0),		S("Highest priority realtime signal"),
 #endif	/* SIGRTMAX */
 #endif	/* SIGQUIT */
@@ -205,9 +217,6 @@
 #ifdef SIGMIGRATE
 	"MIGRATE",		VAL(SIGMIGRATE,0),	S("Migrate process"),
 #endif	/* SIGMIGRATE */
-#ifdef SIGDANGER
-	"DANGER",		VAL(SIGDANGER,0),	S("System crash soon"),
-#endif	/* SIGDANGER */
 #ifdef SIGSOUND
 	"SOUND",		VAL(SIGSOUND,0),	S("Sound completed"),
 #endif	/* SIGSOUND */
@@ -223,5 +232,8 @@
 #ifdef SIGXFSZ
 	"XFSZ",		VAL(SIGXFSZ,SH_SIGDONE|SH_SIGINTERACTIVE),	S("Exceeded file size limit"),
 #endif	/* SIGXFSZ */
+#ifdef SIGXRES
+	"XRES",		VAL(SIGXRES,SH_SIGDONE|SH_SIGINTERACTIVE),	S("Exceeded resource control"),
+#endif	/* SIGRES */
 	"",	0,	0
 };
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/edit/edit.c ksh93_2007_05_15/src/cmd/ksh93/edit/edit.c
--- ksh93_2007_04_18/src/cmd/ksh93/edit/edit.c	2007-01-08 17:53:00.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/edit/edit.c	2007-04-26 21:38:41.000000000 +0200
@@ -583,6 +583,7 @@
 
 void	ed_setup(register Edit_t *ep, int fd, int reedit)
 {
+	Shell_t *shp = ep->sh;
 	register char *pp;
 	register char *last;
 	char *ppmax;
@@ -592,25 +593,28 @@
 	ep->e_fd = fd;
 	ep->e_multiline = sh_isoption(SH_MULTILINE)!=0;
 #ifdef SIGWINCH
-	if(!(sh.sigflag[SIGWINCH]&SH_SIGFAULT))
+	if(!(shp->sigflag[SIGWINCH]&SH_SIGFAULT))
 	{
 		signal(SIGWINCH,sh_fault);
-		sh.sigflag[SIGWINCH] |= SH_SIGFAULT;
+		shp->sigflag[SIGWINCH] |= SH_SIGFAULT;
 	}
+	pp = shp->st.trapcom[SIGWINCH];
+	shp->st.trapcom[SIGWINCH] = 0;
 	sh_fault(SIGWINCH);
+	shp->st.trapcom[SIGWINCH] = pp;
 #endif
 #if KSHELL
 	ep->e_stkptr = stakptr(0);
 	ep->e_stkoff = staktell();
-	if(!(last = sh.prompt))
+	if(!(last = shp->prompt))
 		last = "";
-	sh.prompt = 0;
+	shp->prompt = 0;
 #else
 	last = ep->e_prbuff;
 #endif /* KSHELL */
-	if(sh.hist_ptr)
+	if(shp->hist_ptr)
 	{
-		register History_t *hp = sh.hist_ptr;
+		register History_t *hp = shp->hist_ptr;
 		ep->e_hismax = hist_max(hp);
 		ep->e_hismin = hist_min(hp);
 	}
@@ -736,7 +740,7 @@
 #ifdef _cmd_tput
 		char *term;
 		if(!ep->e_term)
-			ep->e_term = nv_search("TERM",sh.var_tree,0);
+			ep->e_term = nv_search("TERM",shp->var_tree,0);
 		if(ep->e_term && (term=nv_getval(ep->e_term)) && strlen(term)<sizeof(ep->e_termname) && strcmp(term,ep->e_termname))
 		{
 			sh_trap(".sh.subscript=$(tput cuu1 2>/dev/null)",0);
@@ -774,8 +778,9 @@
 	register Edit_t *ep = (Edit_t*)context;
 	register int rv= -1;
 	register int delim = (ep->e_raw==RAWMODE?'\r':'\n');
+	Shell_t *shp = ep->sh;
 	int mode = -1;
-	int (*waitevent)(int,long,int) = sh.waitevent;
+	int (*waitevent)(int,long,int) = shp->waitevent;
 	if(ep->e_raw==ALTMODE)
 		mode = 1;
 	if(size < 0)
@@ -785,10 +790,10 @@
 	}
 	sh_onstate(SH_TTYWAIT);
 	errno = EINTR;
-	sh.waitevent = 0;
+	shp->waitevent = 0;
 	while(rv<0 && errno==EINTR)
 	{
-		if(sh.trapnote&(SH_SIGSET|SH_SIGTRAP))
+		if(shp->trapnote&(SH_SIGSET|SH_SIGTRAP))
 			goto done;
 		/* an interrupt that should be ignored */
 		errno = 0;
@@ -824,7 +829,7 @@
 			rv = read(fd,buff,size);
 			if(rv>=0 || errno!=EINTR)
 				break;
-			if(sh.trapnote&(SH_SIGSET|SH_SIGTRAP))
+			if(shp->trapnote&(SH_SIGSET|SH_SIGTRAP))
 				goto done;
 			/* an interrupt that should be ignored */
 			fixtime();
@@ -833,7 +838,7 @@
 	else if(rv>=0 && mode>0)
 		rv = read(fd,buff,rv>0?rv:1);
 done:
-	sh.waitevent = waitevent;
+	shp->waitevent = waitevent;
 	sh_offstate(SH_TTYWAIT);
 	return(rv);
 }
@@ -960,7 +965,7 @@
 		/* check for possible key mapping */
 		if((c = ep->e_lbuf[--ep->e_lookahead]) < 0)
 		{
-			if(mode<=0 && sh.st.trap[SH_KEYTRAP])
+			if(mode<=0 && ep->sh->st.trap[SH_KEYTRAP])
 			{
 				n=1;
 				if((readin[0]= -c) == ESC)
@@ -1446,6 +1451,7 @@
 {
 	register char *cp;
 	int savexit;
+	Shell_t *shp = ep->sh;
 #if SHOPT_MULTIBYTE
 	char buff[MAXLINE];
 	ed_external(ep->e_inbuf,cp=buff);
@@ -1465,9 +1471,9 @@
 	nv_putval(ED_COLNOD,(char*)&ep->e_col,NV_NOFREE|NV_INTEGER);
 	nv_putval(ED_TXTNOD,(char*)cp,NV_NOFREE);
 	nv_putval(ED_MODENOD,ep->e_vi_insert,NV_NOFREE);
-	savexit = sh.savexit;
-	sh_trap(sh.st.trap[SH_KEYTRAP],0);
-	sh.savexit = savexit;
+	savexit = shp->savexit;
+	sh_trap(shp->st.trap[SH_KEYTRAP],0);
+	shp->savexit = savexit;
 	if((cp = nv_getval(ED_CHRNOD)) == inbuff)
 		nv_unset(ED_CHRNOD);
 	else
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/features/sigfeatures ksh93_2007_05_15/src/cmd/ksh93/features/sigfeatures
--- ksh93_2007_04_18/src/cmd/ksh93/features/sigfeatures	2006-06-13 17:18:31.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/features/sigfeatures	2007-05-10 23:56:58.000000000 +0200
@@ -7,8 +7,8 @@
 	#endif
 	#ifdef _lib_sigprocmask
 	#    define sh_sigaction(s,action) do { sigset_t ss;\
-				sigemptyset(&ss);\
-				sigaddset(&ss,(s));\
+				sigemptyset(&ss); \
+				if(s) sigaddset(&ss,(s)); \
 				sigprocmask(action,&ss,0); \
 				}while(0)
 	#    define sigrelease(s)	sh_sigaction(s,SIG_UNBLOCK)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/defs.h ksh93_2007_05_15/src/cmd/ksh93/include/defs.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/defs.h	2007-03-27 20:14:45.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/include/defs.h	2007-05-08 23:55:18.000000000 +0200
@@ -34,6 +34,10 @@
 #include	<history.h>
 #include	"fault.h"
 #include	"argnod.h"
+#include	"name.h"
+#define _SH_PRIVATE
+#include	<shcmd.h>
+#undef _SH_PRIVATE
 
 #ifndef pointerof
 #define pointerof(x)		((void*)((char*)0+(x)))
@@ -52,6 +56,8 @@
  * note that the first few fields have to be the same as for
  * Shscoped_t in <shell.h>
  */
+
+
 struct sh_scoped
 {
 	struct sh_scoped *prevst;	/* pointer to previous state */
@@ -179,6 +185,7 @@
 	struct checkpt	checkbase; \
 	Shinit_f	userinit; \
 	Shbltin_f	bltinfun; \
+	Shbltin_t	bltindata; \
 	Shwait_f	waitevent; \
 	char		*cur_line; \
 	char		*rcfile; \
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/name.h ksh93_2007_05_15/src/cmd/ksh93/include/name.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/name.h	2007-03-05 14:52:11.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/include/name.h	2007-05-01 22:51:54.000000000 +0200
@@ -119,6 +119,7 @@
 #define BLT_SPC		(NV_LJUST)		/* special built-ins */
 #define BLT_EXIT	(NV_RJUST)		/* exit value can be > 255 */
 #define BLT_DCL		(NV_TAGGED)		/* declaration command */
+#define BLT_NOSFIO	(NV_IMPORT)		/* doesn't use sfio */
 #define nv_isref(n)	(nv_isattr((n),NV_REF)==NV_REF)
 #define nv_istable(n)	(nv_isattr((n),NV_TABLE|NV_LJUST|NV_RJUST)==NV_TABLE)
 #define is_abuiltin(n)	(nv_isattr(n,NV_BLTIN)==NV_BLTIN)
@@ -138,9 +139,6 @@
 #define nv_reftree(n)	((n)->nvalue.nrp->root)
 #define nv_reftable(n)	((n)->nvalue.nrp->table)
 #define nv_refsub(n)	((n)->nvalue.nrp->sub)
-#if SHOPT_OO
-#   define nv_class(np)		(nv_isattr(np,NV_REF|NV_IMPORT)?0:(Namval_t*)((np)->nvenv))
-#endif /* SHOPT_OO */
 
 /* ... etc */
 
@@ -181,6 +179,7 @@
 extern Namval_t		*nv_mount(Namval_t*, const char *name, Dt_t*);
 extern Namval_t		*nv_arraychild(Namval_t*, Namval_t*, int);
 extern int		nv_compare(Dt_t*, Void_t*, Void_t*, Dtdisc_t*);
+extern int		nv_isvtree(Namval_t*);
 
 extern const Namdisc_t	RESTRICTED_disc;
 extern char		nv_local;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/shell.h ksh93_2007_05_15/src/cmd/ksh93/include/shell.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/shell.h	2006-10-26 19:48:36.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/include/shell.h	2007-05-11 21:27:13.000000000 +0200
@@ -27,7 +27,7 @@
  *
  */
 
-#include	<cmd.h>
+#include	<ast.h>
 #include	<cdt.h>
 #ifdef _SH_PRIVATE
 #   include	"name.h"
@@ -35,7 +35,7 @@
 #   include	<nval.h>
 #endif /* _SH_PRIVATE */
 
-#define SH_VERSION	20060510
+#define SH_VERSION	20070511
 
 #undef NOT_USED
 #define NOT_USED(x)	(&x,1)
@@ -48,7 +48,6 @@
 Shopt_t;
 
 typedef void	(*Shinit_f)(int);
-typedef int     (*Shbltin_f)(int, char*[], void*);
 typedef int	(*Shwait_f)(int, long, int);
 
 union Shnode_u;
@@ -149,6 +148,8 @@
 #define SH_IOCOPROCESS	(-2)
 #define SH_IOHISTFILE	(-3)
 
+#include	<cmd.h>
+
 /* symbolic value for sh_fdnotify */
 #define SH_FDCLOSE	(-1)
 
@@ -170,6 +171,7 @@
 extern int 		sh_funscope(int,char*[],int(*)(void*),void*,int);
 extern Sfio_t		*sh_iogetiop(int,int);
 extern int		sh_main(int, char*[], void(*)(int));
+extern int		sh_run(int, char*[]);
 extern void		sh_menu(Sfio_t*, int, char*[]);
 extern Namval_t		*sh_addbuiltin(const char*, int(*)(int, char*[],void*), void*);
 extern char		*sh_fmtq(const char*);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/include/shtable.h ksh93_2007_05_15/src/cmd/ksh93/include/shtable.h
--- ksh93_2007_04_18/src/cmd/ksh93/include/shtable.h	2005-06-01 06:06:36.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/include/shtable.h	2007-05-07 14:31:08.000000000 +0200
@@ -33,20 +33,20 @@
 typedef struct shtable1
 {
 	const char	*sh_name;
-	unsigned	sh_number;
+	const unsigned	sh_number;
 } Shtable_t;
 
 struct shtable2
 {
 	const char	*sh_name;
-	unsigned	sh_number;
+	const unsigned	sh_number;
 	const char	*sh_value;
 };
 
 struct shtable3
 {
 	const char	*sh_name;
-	unsigned	sh_number;
+	const unsigned	sh_number;
 	int		(*sh_value)(int, char*[], void*);
 };
 
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/Makefile ksh93_2007_05_15/src/cmd/ksh93/Makefile
--- ksh93_2007_04_18/src/cmd/ksh93/Makefile	2007-03-25 05:47:28.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/Makefile	2007-05-15 19:05:05.000000000 +0200
@@ -185,7 +185,7 @@
 	echo ";" >> $(<)
 end
 
-:: math.tab syscall.s mamexec mamstate.c deparse.c $(DOCFILES) \
+:: math.tab syscall.s mamexec mamstate.c $(DOCFILES) \
 	bash.c bash_pre_rc.sh hexpand.c mkservice.c \
 	shopen.mk shopen.c
 
@@ -193,8 +193,8 @@
 	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 \
-	nameref.sh options.sh path.sh quoting.sh quoting2.sh return.sh \
-	select.sh substring.sh tilde.sh variables.sh 
+	nameref.sh options.sh path.sh quoting.sh quoting2.sh restricted.sh \
+	return.sh select.sh substring.sh tilde.sh variables.sh 
 
 if "$(PWD:B:N=cc-*)"
 
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/Mamfile ksh93_2007_05_15/src/cmd/ksh93/Mamfile
--- ksh93_2007_04_18/src/cmd/ksh93/Mamfile	2007-04-18 20:07:29.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/Mamfile	2007-05-16 05:16:02.000000000 +0200
@@ -41,8 +41,23 @@
 make pmain.o
 make sh/pmain.c
 make include/shell.h implicit
-make include/nval.h implicit
-make ${PACKAGE_ast_INCLUDE}/cdt.h implicit
+make ${PACKAGE_ast_INCLUDE}/cmd.h implicit
+make ${PACKAGE_ast_INCLUDE}/dlldefs.h implicit
+done ${PACKAGE_ast_INCLUDE}/dlldefs.h dontcare
+make ${PACKAGE_ast_INCLUDE}/cmdext.h implicit
+make ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+make ${INSTALLROOT}/include/prototyped.h implicit
+done ${INSTALLROOT}/include/prototyped.h dontcare
+done ${PACKAGE_ast_INCLUDE}/prototyped.h dontcare
+done ${PACKAGE_ast_INCLUDE}/cmdext.h dontcare
+make ${PACKAGE_ast_INCLUDE}/shcmd.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/shcmd.h dontcare
+make ${PACKAGE_ast_INCLUDE}/stak.h implicit
+make ${PACKAGE_ast_INCLUDE}/stk.h implicit
+make ${PACKAGE_ast_INCLUDE}/sfio.h implicit
+make ${PACKAGE_ast_INCLUDE}/sfio_s.h implicit
+done ${PACKAGE_ast_INCLUDE}/sfio_s.h dontcare
 make ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_map.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_map.h dontcare
@@ -55,10 +70,7 @@
 make ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
 make ${PACKAGE_ast_INCLUDE}/regex.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
-make ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-make ${INSTALLROOT}/include/prototyped.h implicit
-done ${INSTALLROOT}/include/prototyped.h dontcare
-done ${PACKAGE_ast_INCLUDE}/prototyped.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/regex.h dontcare
 prev ${PACKAGE_ast_INCLUDE}/ast_map.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_botch.h implicit
@@ -85,24 +97,39 @@
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_std.h dontcare
-done ${PACKAGE_ast_INCLUDE}/cdt.h dontcare
+done ${PACKAGE_ast_INCLUDE}/sfio.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/stk.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/stak.h dontcare
+make ${PACKAGE_ast_INCLUDE}/error.h implicit
+make ${PACKAGE_ast_INCLUDE}/option.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast.h implicit
 make ${PACKAGE_ast_INCLUDE}/vmalloc.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
 done ${PACKAGE_ast_INCLUDE}/vmalloc.h dontcare
-make ${PACKAGE_ast_INCLUDE}/sfio.h implicit
-make ${PACKAGE_ast_INCLUDE}/sfio_s.h implicit
-done ${PACKAGE_ast_INCLUDE}/sfio_s.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
-prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
-done ${PACKAGE_ast_INCLUDE}/sfio.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_version.h implicit
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_version.h dontcare
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/option.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/error.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/cmd.h dontcare
+make include/nval.h implicit
+make ${PACKAGE_ast_INCLUDE}/cdt.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
+done ${PACKAGE_ast_INCLUDE}/cdt.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done include/nval.h dontcare
 make include/name.h implicit
 prev include/nval.h implicit
@@ -112,30 +139,7 @@
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done include/name.h dontcare
 prev ${PACKAGE_ast_INCLUDE}/cdt.h implicit
-make ${PACKAGE_ast_INCLUDE}/cmd.h implicit
-make ${PACKAGE_ast_INCLUDE}/dlldefs.h implicit
-done ${PACKAGE_ast_INCLUDE}/dlldefs.h dontcare
-make ${PACKAGE_ast_INCLUDE}/cmdext.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/cmdext.h dontcare
-make ${PACKAGE_ast_INCLUDE}/stak.h implicit
-make ${PACKAGE_ast_INCLUDE}/stk.h implicit
-prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/stk.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/stak.h dontcare
-make ${PACKAGE_ast_INCLUDE}/error.h implicit
-make ${PACKAGE_ast_INCLUDE}/option.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/option.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/error.h dontcare
-prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/cmd.h dontcare
 done include/shell.h
 done sh/pmain.c
 meta pmain.o %.c>%.o sh/pmain.c pmain
@@ -236,6 +240,8 @@
 prev include/shell.h implicit
 make include/env.h implicit
 done include/env.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/shcmd.h implicit
+prev include/name.h implicit
 make include/argnod.h implicit
 prev ${PACKAGE_ast_INCLUDE}/stak.h implicit
 done include/argnod.h
@@ -1118,10 +1124,6 @@
 done waitevent.o generated
 make xec.o
 make sh/xec.c
-make ${PACKAGE_ast_INCLUDE}/proc.h implicit
-prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/proc.h
 prev ${PACKAGE_ast_INCLUDE}/vmalloc.h implicit
 prev include/streval.h implicit
 prev FEATURE/locale implicit
@@ -1140,7 +1142,7 @@
 done sh/xec.c
 meta xec.o %.c>%.o sh/xec.c xec
 prev sh/xec.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -D_PACKAGE_ast -DSHOPT_FILESCAN -DSHOPT_NAMESPACE -DSHOPT_OPTIMIZE -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DKSHELL -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/xec.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} -DSHOPT_FILESCAN -DSHOPT_NAMESPACE -DSHOPT_OPTIMIZE -D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DKSHELL -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/xec.c
 done xec.o generated
 make env.o
 make sh/env.c
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/RELEASE ksh93_2007_05_15/src/cmd/ksh93/RELEASE
--- ksh93_2007_04_18/src/cmd/ksh93/RELEASE	2007-04-18 16:21:50.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/RELEASE	2007-05-16 04:40:29.000000000 +0200
@@ -1,4 +1,16 @@
-07-04-18  --- Release ksh93s+  ---
+07-05-15  --- Release ksh93s+  ---
+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
+	  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
+	  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
 	  been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/args.c ksh93_2007_05_15/src/cmd/ksh93/sh/args.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/args.c	2007-03-27 20:52:51.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/args.c	2007-05-12 08:13:20.000000000 +0200
@@ -43,7 +43,7 @@
 #   define PFSHOPT
 #endif
 #if SHOPT_BASH
-#   define BASHOPT	"\375\374\373"
+#   define BASHOPT	"\374"
 #else
 #   define BASHOPT
 #endif
@@ -70,7 +70,7 @@
 	SH_PFSH,
 #endif
 #if SHOPT_BASH
-	SH_NOPROFILE, SH_RC, SH_POSIX,
+	SH_POSIX,
 #endif
 	SH_DICTIONARY, SH_INTERACTIVE, SH_RESTRICTED, SH_CFLAG,
 	SH_ALLEXPORT, SH_NOTIFY, SH_ERREXIT, SH_NOGLOB, SH_TRACKALL,
@@ -159,7 +159,7 @@
 	while((n = optget(argv,setflag?sh_optset:sh_optksh)))
 	{
 		o=0;
-		f=*opt_info.option=='-';
+		f=*opt_info.option=='-' && (opt_info.num || opt_info.arg);
 		switch(n)
 		{
 	 	    case 'A':
@@ -204,28 +204,28 @@
 		    case -1:	/* --rcfile */
 			sh.rcfile = opt_info.arg;
 			continue;
-		    case -6:	/* --version */
-			sfputr(sfstdout, "ksh bash emulation, version ",-1);
-			np = nv_open("BASH_VERSION",sh.var_tree,0);
-			sfputr(sfstdout, nv_getval(np),-1);
-			np = nv_open("MACHTYPE",sh.var_tree,0);
-			sfprintf(sfstdout, " (%s)\n", nv_getval(np));
-			sh_exit(0);
-
 		    case -2:	/* --noediting */
-			off_option(&newflags,SH_VI);
-			off_option(&newflags,SH_EMACS);
-			off_option(&newflags,SH_GMACS);
+			if (!f)
+			{
+				off_option(&newflags,SH_VI);
+				off_option(&newflags,SH_EMACS);
+				off_option(&newflags,SH_GMACS);
+			}
 			continue;
-
 		    case -3:	/* --profile */
-			f = !f;
-			/*FALLTHROUGH*/
-		    case -4:	/* --rc */
-		    case -5:	/* --posix */
+			n = 'l';
+			goto skip;
+		    case -4:	/* --posix */
 			/* mask lower 8 bits to find char in optksh string */
 			n&=0xff;
 			goto skip;
+		    case -5:	/* --version */
+			sfputr(sfstdout, "ksh bash emulation, version ",-1);
+			np = nv_open("BASH_VERSION",sh.var_tree,0);
+			sfputr(sfstdout, nv_getval(np),-1);
+			np = nv_open("MACHTYPE",sh.var_tree,0);
+			sfprintf(sfstdout, " (%s)\n", nv_getval(np));
+			sh_exit(0);
 #endif
 	 	    case 'D':
 			on_option(&newflags,SH_NOEXEC);
@@ -336,6 +336,8 @@
 #if SHOPT_KIA
 	if(ap->kiafile)
 	{
+		if(!argv[0])
+			errormsg(SH_DICT,ERROR_usage(2),"-R requires scriptname");
 		if(!(shlex.kiafile=sfopen(NIL(Sfio_t*),ap->kiafile,"w+")))
 			errormsg(SH_DICT,ERROR_system(3),e_create,ap->kiafile);
 		if(!(shlex.kiatmp=sftmp(2*SF_BUFSIZE)))
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/arith.c ksh93_2007_05_15/src/cmd/ksh93/sh/arith.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/arith.c	2007-04-12 20:13:29.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/arith.c	2007-05-10 05:51:11.000000000 +0200
@@ -97,6 +97,7 @@
 {
 	register Sfdouble_t r= 0;
 	char *str = (char*)*ptr;
+	register char *cp;
 	switch(type)
 	{
 	    case ASSIGN:
@@ -119,7 +120,6 @@
 		{
 			register Namval_t *np;
 			int dot=0;
-			char *cp;
 			while(1)
 			{
 				while(xp=str, c=mbchar(str), isaname(c));
@@ -190,13 +190,14 @@
 					}
 				}
 				*str = 0;
-				if(strcasecmp(*ptr,"Inf")==0)
+				cp = (char*)*ptr;
+				if ((cp[0] == 'i' || cp[0] == 'I') && (cp[1] == 'n' || cp[1] == 'N') && (cp[2] == 'f' || cp[2] == 'F') && cp[3] == 0)
 				{
 					Inf = 1.0/Zero;
 					Infnod.nvalue.ldp = &Inf;
 					np = &Infnod;
 				}
-				else if(strcasecmp(*ptr,"NaN")==0)
+				else if ((cp[0] == 'n' || cp[0] == 'N') && (cp[1] == 'a' || cp[1] == 'A') && (cp[2] == 'n' || cp[2] == 'N') && cp[3] == 0)
 				{
 					NaN = 0.0/Zero;
 					NaNnod.nvalue.ldp = &NaN;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/bash.c ksh93_2007_05_15/src/cmd/ksh93/sh/bash.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/bash.c	2006-10-13 05:59:11.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/bash.c	2007-05-12 07:39:25.000000000 +0200
@@ -50,8 +50,6 @@
 	"[P?Do not follow symbolic links, use physical directory structure "
 	"instead. Only available in bash compatibility mode.]";
 const char sh_bash2[] =
-"[l:login?Make the shell act as if it had been invoked as a login shell. "
-"Only available if invoked as \bbash\b.]"
 "[O]:?[shopt_option?\ashopt_option\a is one of the shell options accepted by "
 	"the \bshopt\b builtin. If \ashopt_option\a is present, \b-O\b sets "
 	"the value of that option; \b+O\b unsets it. If \ashopt_option\a is "
@@ -66,12 +64,9 @@
 "[03:profile?Read either the system-wide startup file or any of the "
 	"personal initialization files. On by default for interactive "
 	"shells. Only available if invoked as \bbash\b.]"
-"[04:rc?Read and execute the personal initialization file "
-	"\b$HOME/.bashrc\b. On by default for interactive shells. Only "
-	"available if invoked as \bbash\b.]"
-"[05:posix?If invoked as \bbash\b, turn on POSIX compatibility. \bBash\b in "
+"[04:posix?If invoked as \bbash\b, turn on POSIX compatibility. \bBash\b in "
 	"POSIX mode is not the same as \bksh\b.]"
-"[06:version?Print version number and exit.]";
+"[05:version?Print version number and exit.]";
 
 const char sh_optshopt[] =
 "+[-1c?\n@(#)$Id: shopt (AT&T Research) 2003-02-13 $\n]"
@@ -404,7 +399,7 @@
 
 	/* set startup files */
 	n=0;
-	if(!sh_isoption(SH_NOPROFILE))
+	if(sh_isoption(SH_LOGIN_SHELL))
 	{
 		if(!sh_isoption(SH_POSIX))
 		{
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/fault.c ksh93_2007_05_15/src/cmd/ksh93/sh/fault.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/fault.c	2007-02-14 08:59:55.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/fault.c	2007-05-02 16:22:55.000000000 +0200
@@ -59,9 +59,10 @@
 */
 void	sh_fault(register int sig)
 {
-	register int 	flag=0;
-	register char	*trap;
-	register struct checkpt	*pp = (struct checkpt*)sh.jmplist;
+	register Shell_t	*shp = sh_getinterp();
+	register int 		flag=0;
+	register char		*trap;
+	register struct checkpt	*pp = (struct checkpt*)shp->jmplist;
 	int	action=0;
 	/* reset handler */
 	if(!(sig&SH_TRAP))
@@ -79,17 +80,17 @@
 			nv_putval(LINES, (char*)&v, NV_INT32);
 	}
 #endif  /* SIGWINCH */
-	if(sh.savesig)
+	if(shp->savesig)
 	{
 		/* critical region, save and process later */
-		sh.savesig = sig;
+		shp->savesig = sig;
 		return;
 	}
 
 	/* handle ignored signals */
-	if((trap=sh.st.trapcom[sig]) && *trap==0)
+	if((trap=shp->st.trapcom[sig]) && *trap==0)
 		return;
-	flag = sh.sigflag[sig]&~SH_SIGOFF;
+	flag = shp->sigflag[sig]&~SH_SIGOFF;
 	if(!trap)
 	{
 		if(flag&SH_SIGIGNORE)
@@ -97,14 +98,14 @@
 		if(flag&SH_SIGDONE)
 		{
 			void *ptr=0;
-			if((flag&SH_SIGINTERACTIVE) && sh_isstate(SH_INTERACTIVE) && !sh_isstate(SH_FORKED) && ! sh.subshell)
+			if((flag&SH_SIGINTERACTIVE) && sh_isstate(SH_INTERACTIVE) && !sh_isstate(SH_FORKED) && ! shp->subshell)
 			{
 				/* check for TERM signal between fork/exec */
 				if(sig==SIGTERM && job.in_critical)
-					sh.trapnote |= SH_SIGTERM;
+					shp->trapnote |= SH_SIGTERM;
 				return;
 			}
-			sh.lastsig = sig;
+			shp->lastsig = sig;
 			sigrelease(sig);
 			if(pp->mode < SH_JMPFUN)
 				pp->mode = SH_JMPFUN;
@@ -114,14 +115,14 @@
 			{
 				if(ptr)
 					free(ptr);
-				if(!sh.subshell)
+				if(!shp->subshell)
 					sh_done(sig);
 				sh_exit(SH_EXITSIG);
 			}
 			/* mark signal and continue */
-			sh.trapnote |= SH_SIGSET;
-			if(sig < sh.sigmax)
-				sh.sigflag[sig] |= SH_SIGSET;
+			shp->trapnote |= SH_SIGSET;
+			if(sig < shp->sigmax)
+				shp->sigflag[sig] |= SH_SIGSET;
 #if  defined(VMFL) && (VMALLOC_VERSION>=20031205L)
 			if(abortsig(sig))
 			{
@@ -137,7 +138,7 @@
 	}
 	errno = 0;
 	if(pp->mode==SH_JMPCMD)
-		sh.lastsig = sig;
+		shp->lastsig = sig;
 	if(trap)
 	{
 		/*
@@ -149,12 +150,12 @@
 	}
 	else
 	{
-		sh.lastsig = sig;
+		shp->lastsig = sig;
 		flag = SH_SIGSET;
 #ifdef SIGTSTP
 		if(sig==SIGTSTP)
 		{
-			sh.trapnote |= SH_SIGTSTP;
+			shp->trapnote |= SH_SIGTSTP;
 			if(pp->mode==SH_JMPCMD && sh_isstate(SH_STOPOK))
 			{
 				sigrelease(sig);
@@ -165,14 +166,20 @@
 #endif /* SIGTSTP */
 	}
 #ifdef ERROR_NOTIFY
-	if((error_info.flags&ERROR_NOTIFY) && sh.bltinfun)
-		action = (*sh.bltinfun)(-sig,(char**)0,(void*)0);
-#endif
+	/* This is obsolete */
+	if((error_info.flags&ERROR_NOTIFY) && shp->bltinfun)
+		action = (*shp->bltinfun)(-sig,(char**)0,(void*)0);
 	if(action>0)
 		return;
-	sh.trapnote |= flag;
-	if(sig < sh.sigmax)
-		sh.sigflag[sig] |= flag;
+#endif
+	if(shp->bltinfun && shp->bltindata.notify)
+	{
+		shp->bltindata.sigset = 1;
+		return;
+	}
+	shp->trapnote |= flag;
+	if(sig < shp->sigmax)
+		shp->sigflag[sig] |= flag;
 	if(pp->mode==SH_JMPCMD && sh_isstate(SH_STOPOK))
 	{
 		if(action<0)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/init.c ksh93_2007_05_15/src/cmd/ksh93/sh/init.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/init.c	2007-04-11 18:10:20.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/init.c	2007-05-04 20:02:00.000000000 +0200
@@ -1089,6 +1089,12 @@
 	sh.login_files = login_files;
 	if(sh.userinit=userinit)
 		(*userinit)(0);
+	sh.bltindata.version = SH_VERSION;
+	sh.bltindata.shp = &sh;
+	sh.bltindata.shrun = sh_run;
+	sh.bltindata.shtrap = sh_trap;
+	sh.bltindata.shexit = sh_exit;
+	sh.bltindata.shbltin = sh_addbuiltin;
 	return(&sh);
 }
 
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/jobs.c ksh93_2007_05_15/src/cmd/ksh93/sh/jobs.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/jobs.c	2007-04-10 23:15:58.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/jobs.c	2007-04-26 14:41:21.000000000 +0200
@@ -366,7 +366,7 @@
  */
 void job_init(int lflag)
 {
-	register int i,ntry=0;
+	register int ntry=0;
 	job.fd = JOBTTY;
 	signal(SIGCHLD,job_waitsafe);
 #   if defined(SIGCLD) && (SIGCLD!=SIGCHLD)
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/macro.c ksh93_2007_05_15/src/cmd/ksh93/sh/macro.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/macro.c	2007-02-20 17:21:07.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/macro.c	2007-05-14 17:08:10.000000000 +0200
@@ -2281,21 +2281,27 @@
 
 /*
  * Given pattern/string, replace / with 0 and return pointer to string
- * \ characters are stripped from string.
+ * \ characters are stripped from string.  The \ are stripped in the
+ * replacement string unless followed by a digit or \.
  */ 
 static char *mac_getstring(char *pattern)
 {
-	register char *cp = pattern;
-	register int c;
+	register char	*cp=pattern, *rep=0, *dp;
+	register int	c;
 	while(c = *cp++)
 	{
-		if(c==ESCAPE)
-			cp++;
-		else if(c=='/')
+		if(c==ESCAPE && (!rep || (*cp && !isadigit(*cp) && *cp!=ESCAPE)))
+			c = *cp++;
+		else if(!rep && c=='/')
 		{
 			cp[-1] = 0;
-			return(cp);
+			rep = dp = cp;
+			continue;
 		}
+		if(rep)
+			*dp++ = c;
 	}
-	return(NIL(char*));
+	if(rep)
+		*dp = 0;
+	return(rep);
 }
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/main.c ksh93_2007_05_15/src/cmd/ksh93/sh/main.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/main.c	2007-04-11 18:03:39.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/main.c	2007-05-12 08:15:11.000000000 +0200
@@ -140,7 +140,7 @@
 	int i, rshflag;		/* set for restricted shell */
 	char *command;
 #ifdef _lib_sigvec
-	/* This is to clear mask that my be left on by rlogin */
+	/* This is to clear mask that may be left on by rlogin */
 	clearsigmask(SIGALRM);
 	clearsigmask(SIGHUP);
 	clearsigmask(SIGCHLD);
@@ -210,7 +210,7 @@
 			sh_onoption(SH_MONITOR);
 		}
 		job_init(sh_isoption(SH_LOGIN_SHELL));
-		if(sh_isoption(SH_LOGIN_SHELL) && !sh_isoption(SH_NOPROFILE))
+		if(sh_isoption(SH_LOGIN_SHELL))
 		{
 			/*	system profile	*/
 			sh_source(shp, iop, e_sysprofile);
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/nvdisc.c ksh93_2007_05_15/src/cmd/ksh93/sh/nvdisc.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/nvdisc.c	2007-02-14 09:07:50.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/nvdisc.c	2007-05-15 05:08:51.000000000 +0200
@@ -993,7 +993,7 @@
 	register const char *name = path_basename(path);
 	char *cp;
 	register Namval_t *np, *nq=0;
-	int offset = staktell();
+	int attr=0, offset = staktell();
 	if(name==path && (nq=nv_bfsearch(name,sh.bltin_tree,(Namval_t**)0,&cp)))
 		path = name = stakptr(offset);
 	if(np = nv_search(path,sh.bltin_tree,0))
@@ -1019,7 +1019,10 @@
 			if(nv_isattr(np,BLT_SPC))
 				return(np);
 			if(!bltin)
+			{
 				bltin = np->nvalue.bfp;
+				attr = nv_isattr(np,NV_BLTINOPT);
+			}
 			if(np->nvenv)
 				dtdelete(sh.bltin_tree,np);
 			if(extra == (void*)1)
@@ -1034,7 +1037,7 @@
 		return(np);
 	np->nvenv = 0;
 	np->nvfun = 0;
-	nv_setattr(np,0);
+	nv_setattr(np,attr);
 	if(bltin)
 	{
 		np->nvalue.bfp = bltin;
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/nvtree.c ksh93_2007_05_15/src/cmd/ksh93/sh/nvtree.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/nvtree.c	2007-02-19 21:48:09.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/nvtree.c	2007-05-14 22:35:54.000000000 +0200
@@ -559,7 +559,7 @@
 		outval(".",prefix-n,wp);
 		if(c=='.')
 			cp[m-1] = c;
-		sfnputc(outfile,'\t',wp->indent-1);
+		sfnputc(outfile,'\t',--wp->indent);
 		sfputc(outfile,')');
 	}
 	return(--argv);
@@ -590,7 +590,9 @@
 		stakputc('.');
 	}
 	name = stakfreeze(1);
+	sh.last_root = 0;
 	dir = nv_diropen(name);
+	walk.root = sh.last_root;
 	if(subscript)
 		name[strlen(name)-1] = 0;
 	while(cp = nv_dirnext(dir))
@@ -616,7 +618,6 @@
 	else
 		sfseek(outfile,0L,SEEK_SET);
 	walk.out = outfile;
-	walk.root = sh.last_root;
 	walk.indent = 0;
 	walk.noscope = noscope;
 	genvalue(argv,name,0,&walk);
@@ -627,6 +628,11 @@
 	return((char*)out->_data);
 }
 
+int nv_isvtree(Namval_t *np)
+{
+	return(np && nv_hasdisc(np,&treedisc));
+}
+
 /*
  * get discipline for compound initializations
  */
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/path.c ksh93_2007_05_15/src/cmd/ksh93/sh/path.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/path.c	2007-03-06 18:25:51.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/path.c	2007-05-09 05:49:44.000000000 +0200
@@ -685,6 +685,7 @@
 					if(strcmp(cp,LIBCMD)==0 && (addr=(Fptr_t)dlllook((void*)0,stakptr(n))))
 					{
 						np = sh_addbuiltin(stakptr(PATH_OFFSET),addr,NiL);
+						nv_onattr(np,NV_BLTINOPT);
 						np->nvfun = (Namfun_t*)np->nvname;
 						return(oldpp);
 					}
@@ -699,6 +700,7 @@
 				   (!(np = sh_addbuiltin(stakptr(PATH_OFFSET),NiL,NiL)) || np->nvalue.bfp!=addr) &&
 				   (np = sh_addbuiltin(stakptr(PATH_OFFSET),addr,NiL)))
 				{
+					nv_onattr(np,NV_BLTINOPT);
 					np->nvenv = oldpp->bltin_lib;
 					return(oldpp);
 				}
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/subshell.c ksh93_2007_05_15/src/cmd/ksh93/sh/subshell.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/subshell.c	2007-02-26 22:27:37.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/subshell.c	2007-04-30 17:29:04.000000000 +0200
@@ -209,6 +209,7 @@
 	subshell_data->svar = lp;
 	save = sh.subshell;
 	sh.subshell = 0;;
+	mp->nvname = np->nvname;
 	nv_clone(np,mp,NV_NOFREE);
 	sh.subshell = save;
 	return(np);
@@ -236,7 +237,7 @@
 			mp->nvenv = np->nvenv;
 		mp->nvfun = np->nvfun;
 		mp->nvflag = np->nvflag;
-		if((mp==nv_scoped(PATHNOD)) || (mp==nv_scoped(IFSNOD)))
+		if(nv_cover(mp))
 			nv_putval(mp, np->nvalue.cp,0);
 		else
 			mp->nvalue.cp = np->nvalue.cp;
@@ -329,6 +330,7 @@
 	register struct subshell *sp = &sub_data;
 	int jmpval,nsig;
 	int savecurenv = shp->curenv;
+	int savejobpgid = job.curpgid;
 	int16_t subshell;
 	char *savsig;
 	Sfio_t *iop=0;
@@ -344,6 +346,7 @@
 		subenv = 0;
 	}
 	shp->curenv = ++subenv;
+	job.curpgid = 0;
 	savst = shp->st;
 	sh_pushcontext(&buff,SH_JMPSUB);
 	subshell = shp->subshell+1;
@@ -489,6 +492,7 @@
 #endif
 	job_subrestore(sp->jobs);
 	shp->jobenv = savecurenv;
+	job.curpgid = savejobpgid;
 	shp->bckpid = sp->bckpid;
 	if(sp->shpwd)	/* restore environment if saved */
 	{
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/sh/xec.c ksh93_2007_05_15/src/cmd/ksh93/sh/xec.c
--- ksh93_2007_04_18/src/cmd/ksh93/sh/xec.c	2007-04-18 15:17:02.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/sh/xec.c	2007-05-02 23:52:12.000000000 +0200
@@ -172,13 +172,13 @@
 	if(com->comstate  && np)
 	{
 		/* call builtin to cleanup state */
-		Nambltin_t bdata; 
-		bdata.shp = &sh;
-		bdata.np = com->comnamq;
-		bdata.ptr =nv_context(np);
-		bdata.data = com->comstate;
-		bdata.flags = SH_END_OPTIM;
-		(*funptr(np))(0,(char**)0, &bdata);
+		Shbltin_t *bp = &sh.bltindata;
+		bp->bnode = np;
+		bp->vnode = com->comnamq;
+		bp->ptr =nv_context(np);
+		bp->data = com->comstate;
+		bp->flags = SH_END_OPTIM;
+		(*funptr(np))(0,(char**)0, bp);
 	}
 	com->comstate = 0;
 	if(com->comarg && !np)
@@ -544,7 +544,6 @@
 	}
 }
 
-
 int sh_exec(register const Shnode_t *t, int flags)
 {
 	sh_sigcheck();
@@ -560,7 +559,7 @@
 #endif
 		int		topfd = sh.topfd;
 		char 		*sav=stakptr(0);
-		char		*cp=0, **com=0;
+		char		*cp=0, **com=0, *comn;
 		int		argn;
 		int 		skipexitset = 0;
 		int		was_interactive = 0;
@@ -628,21 +627,25 @@
 			argn -= command;
 			if(!command && np && is_abuiltin(np))
 				np = dtsearch(sh.fun_tree,np);
-			if(com0 && !np && !strchr(com0,'/'))
+			if(com0)
 			{
-				Dt_t *root = command?sh.bltin_tree:sh.fun_tree;
-				np = nv_bfsearch(com0, root, &nq, &cp); 
-#if SHOPT_NAMESPACE
-				if(sh.namespace && !nq && !cp)
+				if(!np && !strchr(com0,'/'))
 				{
-					int offset = staktell();
-					stakputs(nv_name(sh.namespace));
-					stakputc('.');
-					stakputs(com0);
-					stakseek(offset);
-					np = nv_bfsearch(stakptr(offset), root, &nq, &cp); 
-				}
+					Dt_t *root = command?sh.bltin_tree:sh.fun_tree;
+					np = nv_bfsearch(com0, root, &nq, &cp); 
+#if SHOPT_NAMESPACE
+					if(sh.namespace && !nq && !cp)
+					{
+						int offset = staktell();
+						stakputs(nv_name(sh.namespace));
+						stakputc('.');
+						stakputs(com0);
+						stakseek(offset);
+						np = nv_bfsearch(stakptr(offset), root, &nq, &cp); 
+					}
 #endif /* SHOPT_NAMESPACE */
+				}
+				comn = com[argn-1];
 			}
 			io = t->tre.treio;
 			if(sh.envlist = argp = t->com.comset)
@@ -751,7 +754,6 @@
 				/* check for builtins */
 				if(np && is_abuiltin(np))
 				{
-					Nambltin_t bdata; 
 					void *context;
 					int scope=0, jmpval, save_prompt,share;
 					struct checkpt buff;
@@ -817,12 +819,17 @@
 						sh.bltinfun = funptr(np);
 						if(nv_isattr(np,NV_BLTINOPT))
 						{
-							bdata.shp = &sh;
-							bdata.np = nq;
-							bdata.ptr = context;
-							bdata.data = t->com.comstate;
-							bdata.flags = (OPTIMIZE!=0);
-							context = (void*)&bdata;
+							Shbltin_t *bp = &sh.bltindata;
+							bp->bnode = np;
+							bp->vnode = nq;
+							bp->ptr = context;
+							bp->data = t->com.comstate;
+							bp->sigset = 0;
+							bp->notify = 0;
+							bp->flags = (OPTIMIZE!=0);
+							if(sh.subshell && nv_isattr(np,BLT_NOSFIO))
+								sh_subtmpfile();
+							context = (void*)bp;
 						}
 						if(execflg && !sh.subshell &&
 							!sh.st.trapcom[0] && !sh.st.trap[SH_ERRTRAP] && sh.fn_depth==0 && !nv_isattr(np,BLT_ENV))
@@ -837,7 +844,7 @@
 						if(error_info.flags&ERROR_INTERACTIVE)
 							tty_check(ERRIO);
 						if(nv_isattr(np,NV_BLTINOPT))
-							((Shnode_t*)t)->com.comstate = bdata.data;
+							((Shnode_t*)t)->com.comstate = sh.bltindata.data;
 						if(!nv_isattr(np,BLT_EXIT) && sh.exitval!=SH_RUNPROG)
 							sh.exitval &= SH_EXITMASK;
 					}
@@ -855,6 +862,8 @@
 									sfclose(item->strm);
 							}
 						}
+						if(sh.bltinfun && (error_info.flags&ERROR_NOTIFY))
+							(*sh.bltinfun)(-2,com,context);
 						/* failure on special built-ins fatal */
 						if(jmpval<=SH_JMPCMD  && (!nv_isattr(np,BLT_SPC) || command))
 							jmpval=0;
@@ -1332,7 +1341,7 @@
 			struct comnod	*tp;
 			char *cp, *trap, *nullptr = 0;
 			int nameref, refresh=1;
-			static char *av[5] = { "for", 0, "in" };
+			char *av[5];
 #if SHOPT_OPTIMIZE
 			int  jmpval = ((struct checkpt*)sh.jmplist)->mode;
 			struct checkpt buff;
@@ -1415,7 +1424,9 @@
 				{
 					av[0] = (t->tre.tretyp&COMSCAN)?"select":"for";
 					av[1] = t->for_.fornam;
+					av[2] = "in";
 					av[3] = cp;
+					av[4] = 0;
 					sh_debug(trap,(char*)0,(char*)0,av,0);
 				}
 				sh_exec(t->for_.fortre,flag);
@@ -1537,12 +1548,15 @@
 		    case TARITH: /* (( expression )) */
 		    {
 			register char *trap;
-			static char *arg[4]=  {"((", 0, "))"};
+			char *arg[4];
 			error_info.line = t->ar.arline-sh.st.firstline;
+			arg[0] = "((";
 			if(!(t->ar.arexpr->argflag&ARG_RAW))
 				arg[1] = sh_macpat(t->ar.arexpr,OPTIMIZE|ARG_ARITH);
 			else
 				arg[1] = t->ar.arexpr->argval;
+			arg[2] = "))";
+			arg[3] = 0;
 			if(trap=sh.st.trap[SH_DEBUGTRAP])
 				sh_debug(trap,(char*)0, (char*)0, arg, ARG_ARITH);
 			if(sh_isoption(SH_XTRACE))
@@ -1574,8 +1588,11 @@
 			t= (Shnode_t*)(tt->sw.swlst);
 			if(trap=sh.st.trap[SH_DEBUGTRAP])
 			{
-				static char *av[4] = {"case", 0, "in" };
+				char *av[4];
+				av[0] = "case";
 				av[1] = r;
+				av[2] = "in";
+				av[3] = 0;
 				sh_debug(trap, (char*)0, (char*)0, av, 0);
 			}
 			while(t)
@@ -1924,15 +1941,15 @@
 				sh_done(0);
 			if(sh.lastarg!= lastarg && sh.lastarg)
 				free(sh.lastarg);
-			if(strlen(com[argn-1]) < sizeof(lastarg))
+			if(strlen(comn) < sizeof(lastarg))
 			{
 				nv_onattr(L_ARGNOD,NV_NOFREE);
-				sh.lastarg = strcpy(lastarg,com[argn-1]);
+				sh.lastarg = strcpy(lastarg,comn);
 			}
 			else
 			{
 				nv_offattr(L_ARGNOD,NV_NOFREE);
-				sh.lastarg = strdup(com[argn-1]);
+				sh.lastarg = strdup(comn);
 			}
 		}
 		if(!skipexitset)
@@ -1956,6 +1973,34 @@
 	return(sh.exitval);
 }
 
+int sh_run(int argn, char *argv[])
+{
+	register struct dolnod	*dp;
+	register struct comnod	*t = (struct comnod*)stakalloc(sizeof(struct comnod));
+	int			savtop = staktell();
+	char			*savptr = stakfreeze(0);
+	Opt_t			*op, *np = optctx(0, 0);
+	Shbltin_t		bltindata;
+	bltindata = sh.bltindata;
+	op = optctx(np, 0);
+	memset(t, 0, sizeof(struct comnod));
+	dp = (struct dolnod*)stakalloc((unsigned)sizeof(struct dolnod) + ARG_SPARE*sizeof(char*) + argn*sizeof(char*));
+	dp->dolnum = argn;
+	dp->dolbot = ARG_SPARE;
+	memcpy(dp->dolval+ARG_SPARE, argv, (argn+1)*sizeof(char*));
+	t->comarg = (struct argnod*)dp;
+	if(!strchr(argv[0],'/'))
+		t->comnamp = (void*)nv_bfsearch(argv[0],sh.fun_tree,(Namval_t**)&t->comnamq,(char**)0);
+	argn=sh_exec((Shnode_t*)t,sh_isstate(SH_ERREXIT));
+	optctx(op,np);
+	sh.bltindata = bltindata;
+	if(savptr!=stakptr(0))
+		stakset(savptr,savtop);
+	else
+		stakseek(savtop);
+	return(argn);
+}
+
 /*
  * test for equality with second argument trimmed
  * returns 1 if r == trim(s) otherwise 0
@@ -2533,7 +2578,7 @@
  */
 static int run_subshell(const Shnode_t *t,pid_t grp)
 {
-	static char prolog[] = "(print $(typeset +A);set; typeset -p; print .sh.dollar=$$;set +o)";
+	static const char prolog[] = "(print $(typeset +A);set; typeset -p; print .sh.dollar=$$;set +o)";
 	register int i, fd, trace = sh_isoption(SH_XTRACE);
 	int pin,pout;
 	pid_t pid;
@@ -2933,15 +2978,3 @@
 	}
 #   endif /* _lib_fork */
 #endif /* SHOPT_SPAWN */
-
-/*
- * override procrun() since it is used in libcmd
- */
-#include	<proc.h>
-int procrun(const char *path, char *argv[])
-{
-	if(sh.subshell)
-		sh_subtmpfile();
-	return(procclose(procopen(path, argv, NiL, NiL, PROC_FOREGROUND|PROC_GID
-|PROC_UID)));
-}
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/basic.sh ksh93_2007_05_15/src/cmd/ksh93/tests/basic.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/basic.sh	2007-03-20 19:30:26.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/basic.sh	2007-04-30 17:48:30.000000000 +0200
@@ -330,6 +330,12 @@
 print 'print  -- $0' >> /tmp/ksh$$x
 chmod +x /tmp/ksh$$x
 [[ $(/tmp/ksh$$x) == /tmp/ksh$$x ]] || err_exit  "\$0 is $0 instead of /tmp/ksh$$x"
+cat > /tmp/ksh$$x <<- \EOF
+	myfilter() { x=$(print ok | cat); print  -r -- $SECONDS;}
+	set -o pipefail
+	sleep 3 | myfilter
+EOF
+(( $($SHELL /tmp/ksh$$x) > 2.0 )) && err_exit 'command substitution causes pipefail option to hang'
 rm -f /tmp/ksh$$x
 exec 3<&-
 ( typeset -r foo=bar) 2> /dev/null || err_exit 'readonly variables set in a subshell cannot unset'
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/options.sh ksh93_2007_05_15/src/cmd/ksh93/tests/options.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/options.sh	2006-10-06 19:28:13.000000000 +0200
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/options.sh	2007-05-11 22:42:25.000000000 +0200
@@ -310,4 +310,22 @@
 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 '[[ $- == *c* ]]' || err_exit  'option c not in $-'
+trap 'rm -f /tmp/.profile' EXIT
+> /tmp/.profile
+for i in  i l r s D E a b e f h k n r t u v  x B C G H
+do	HOME=/tmp ENV= $SHELL -$i  2> /dev/null <<- ++EOF++ || err_exit "option $i not in \$-"
+	[[ \$- == *$i* ]]  ||   exit 1
+	++EOF++
+done
+letters=ilrabefhknuvxBCGE
+integer j=0
+for i in  interactive login restricted allexport notify errexit \
+	noglob  trackall keyword noexec nounset verbose xtrace braceexpand \
+	noclobber globstar rc
+do	HOME=/tmp ENV= $SHELL   -o $i  2> /dev/null <<- ++EOF++ || err_exit "option $i not equivalent to ${letters:j:1}"
+	[[ \$- == *${letters:j:1}* ]]  ||   exit 1
+	++EOF++
+	((j++))
+done
 exit $((Errors))
diff -r -N -u ksh93_2007_04_18/src/cmd/ksh93/tests/restricted.sh ksh93_2007_05_15/src/cmd/ksh93/tests/restricted.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/restricted.sh	1970-01-01 01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/restricted.sh	2007-03-06 18:28:39.000000000 +0100
@@ -0,0 +1,78 @@
+########################################################################
+#                                                                      #
+#               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'
+
+# test restricted shell
+Command=${0##*/}
+integer Errors=0
+mkdir  /tmp/ksh$$ || err_exit "mkdir /tmp/ksh$$ failed" 
+trap "cd /; rm -rf /tmp/ksh$$" EXIT
+pwd=$PWD
+case $SHELL in
+/*)	;;
+*/*)	SHELL=$pwd/$SHELL;;
+*)	SHELL=$(whence "$SHELL");;
+esac
+function check_restricted
+{
+	rm -f out
+	rksh -c "$@" 2> out > /dev/null
+	grep restricted out  > /dev/null 2>&1 
+}
+
+[[ $SHELL != /* ]] && SHELL=$pwd/$SHELL
+cd /tmp/ksh$$ || err_exit "cd /tmp/ksh$$ failed"
+ln -s $SHELL rksh
+PATH=$PWD:$PATH
+rksh -c  '[[ -o restricted ]]' || err_exit 'restricted option not set' 
+[[ $(rksh -c 'print hello') == hello ]] || err_exit 'unable to run print'
+check_restricted /bin/echo || err_exit '/bin/echo not resticted'
+check_restricted ./echo || err_exit './echo not resticted'
+check_restricted 'SHELL=ksh' || err_exit 'SHELL asignment not resticted'
+check_restricted 'PATH=/bin' || err_exit 'PATH asignment not resticted'
+check_restricted 'FPATH=/bin' || err_exit 'FPATH asignment not resticted'
+check_restricted 'ENV=/bin' || err_exit 'ENV asignment not resticted'
+check_restricted 'print > file' || err_exit '> file not restricted'
+> empty
+check_restricted 'print <> empty' || err_exit '<> file not restricted'
+print 'echo hello' > script
+chmod +x ./script
+! check_restricted script ||  err_exit 'script without builtins should run in restricted mode'
+check_restricted ./script ||  err_exit 'script with / in name should not run in restricted mode'
+print '/bin/echo hello' > script
+check_restricted script ||  err_exit 'script with pathnames should not run in restricted mode'
+print 'echo hello> file' > script
+check_restricted script ||  err_exit 'script with output redirection should not run in restricted mode'
+print 'PATH=/bin' > script
+check_restricted script ||  err_exit 'script with PATH assignment should not run in restricted mode'
+cat > script <<!
+#! $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_04_18/src/cmd/ksh93/tests/substring.sh ksh93_2007_05_15/src/cmd/ksh93/tests/substring.sh
--- ksh93_2007_04_18/src/cmd/ksh93/tests/substring.sh	2007-03-20 19:43:39.000000000 +0100
+++ ksh93_2007_05_15/src/cmd/ksh93/tests/substring.sh	2007-05-14 16:55:20.000000000 +0200
@@ -166,6 +166,10 @@
 if	[[ "${x//\[(*)\]/\{\1\}}" != {123}def ]]
 then	err_exit 'closing brace escape not working'
 fi
+xx=%28text%29
+if	[[ ${xx//%28/abc\)} != 'abc)text%29' ]]
+then	 err_exit '${xx//%28/abc\)} not working'
+fi
 unset foo
 foo=one/two/three
 if	[[ ${foo//'/'/_} != one_two_three ]]
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/conf.sh ksh93_2007_05_15/src/lib/libast/comp/conf.sh
--- ksh93_2007_04_18/src/lib/libast/comp/conf.sh	2007-04-02 21:43:47.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/conf.sh	2007-04-20 19:45:43.000000000 +0200
@@ -21,7 +21,7 @@
 ########################################################################
 : generate getconf and limits info
 #
-# @(#)conf.sh (AT&T Research) 2007-04-02
+# @(#)conf.sh (AT&T Research) 2007-04-20
 #
 # this script generates these files from the table file in the first arg
 # the remaining args are the C compiler name and flags
@@ -128,8 +128,33 @@
 }
 !
 if	$cc -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe
-then	LL='ll'
-else	LL='l'
+then	LL_format='ll'
+else	LL_format='l'
+fi
+
+# determine the intmax_t constant suffix
+
+cat > $tmp.c <<!
+${head}
+int
+main()
+{
+#if _ast_intmax_long
+	return 1;
+#else
+	_ast_intmax_t		s = 0x7fffffffffffffffLL;
+	unsigned _ast_intmax_t	u = 0xffffffffffffffffLL;
+
+	return 0;
+#endif
+}
+!
+if	$cc -o $tmp.exe $tmp.c >/dev/null 2>&1
+then	if	./$tmp.exe
+	then	LL_suffix='LL'
+	else	LL_suffix='L'
+	fi
+else	LL_suffix=''
 fi
 
 # set up the names and keys
@@ -200,7 +225,7 @@
 						;;
 					*" -$f- "*)
 						;;
-					*)	if	iffe -n - hdr $f | grep -q _hdr_$f
+					*)	if	iffe -n - hdr $f | grep _hdr_$f >/dev/null
 						then	hdr="$hdr $f"
 							headers=$headers$nl#include$sp'<'$1'>'
 						else	hdr="$hdr -$f-"
@@ -984,9 +1009,6 @@
 	case $flags in
 	*W*)	conf_flags="${conf_flags}|CONF_PREFIX_ONLY" ;;
 	esac
-	case $shell in
-	ksh)	conf_flags=${conf_flags#0?} ;;
-	esac
 	case $debug in
 	?*)	case $standard in
 		????)	sep=" " ;;
@@ -1058,10 +1080,10 @@
 						;;
 					'')	case $conf_name in
 						SIZE_*|U*|*_MAX)	
-							f="%${LL}u"
+							f="%${LL_format}u"
 							t="unsigned _ast_intmax_t"
 							;;
-						*)	f="%${LL}d"
+						*)	f="%${LL_format}d"
 							t="_ast_intmax_t"
 							;;
 						esac
@@ -1294,9 +1316,86 @@
 			conf_minmax=0x$conf_minmax
 			;;
 		esac
+		case $conf_limit in
+		?*[-+]*|*['()']*)
+			;;
+		*[lLuU])
+			case $LL_suffix in
+			??)	case $conf_limit in
+				*[!lL][lL]|*[!lL][lL][uU])
+					conf_limit=${conf_limit}L
+					;;
+				esac
+				;;
+			esac
+			;;
+		-*[2468])	
+			case $shell in
+			ksh)	p=${conf_limit%?}
+				s=${conf_limit#$p}
+				((s=s-1))
+				;;
+			*)	eval `echo '' $conf_limit | sed 's/ *\(.*\)\(.\) */p=\1 s=\2/'`
+				s=`expr $s - 1`
+				;;
+			esac
+			conf_limit=${p}${s}${LL_suffix}-1${LL_suffix}
+			;;
+		0[xX]*[abcdefABCDEF])
+			conf_limit=${conf_limit}${LL_suffix}
+			;;
+		-*[0123456789])
+			conf_limit=${conf_limit}${LL_suffix}
+			;;
+		*[0123456789])
+			conf_limit=${conf_limit}U${LL_suffix}
+			;;
+		esac
+		case $conf_minmax in
+		?*[-+]*|*['()']*)
+			;;
+		*[lLuU])
+			case $LL_suffix in
+			??)	case $conf_minmax in
+				*[!lL][lL]|*[!lL][lL][uU])
+					conf_minmax=${conf_minmax}L
+					;;
+				esac
+				;;
+			esac
+			;;
+		-*[2468])	
+			case $shell in
+			ksh)	p=${conf_minmax%?}
+				s=${conf_minmax#$p}
+				((s=s-1))
+				;;
+			*)	eval `echo '' $conf_minmax | sed 's/ *\(.*\)\(.\) */p=\1 s=\2/'`
+				s=`expr $s - 1`
+				;;
+			esac
+			conf_minmax=${p}${s}${LL_suffix}-1${LL_suffix}
+			;;
+		0[xX]*[abcdefABCDEF])
+			conf_minmax=${conf_minmax}${LL_suffix}
+			;;
+		-*[0123456789])
+			conf_minmax=${conf_minmax}${LL_suffix}
+			;;
+		*[0123456789])
+			conf_minmax=${conf_minmax}U${LL_suffix}
+			;;
+		esac
 		conf_limit="{ $conf_limit, 0 }" conf_minmax="{ $conf_minmax, 0 }"
 		;;
 	esac
+	case $conf_flags in
+	'0|'*)	case $shell in
+		ksh)	conf_flags=${conf_flags#0?} ;;
+		*)	conf_flags=`echo "$conf_flags" | sed 's/^0.//'` ;;
+		esac
+		;;
+	esac
 	echo "{ \"$conf_name\", $conf_limit, $conf_minmax, $conf_flags, $conf_standard, $conf_section, $conf_call, $conf_op },"
 	case $shell in
 	ksh)	len=${#conf_name}
@@ -1327,14 +1426,16 @@
 esac
 {
 cat <<!
-#pragma prototyped
-
 #ifndef _CONFTAB_H
 #define _CONFTAB_H
 $systeminfo
 
 ${generated}
 
+#if !defined(const) && !defined(__STDC__) && !defined(__cplusplus) && !defined(c_plusplus)
+#define const
+#endif
+
 #define conf		_ast_conf_data
 #define conf_elements	_ast_conf_ndata
 
@@ -1385,8 +1486,6 @@
 
 struct Conf_s; typedef struct Conf_s Conf_t;
 
-typedef int (*Conf_f)(Conf_t*, intmax_t*, char**);
-
 typedef struct Value_s
 {
 	intmax_t	number;
@@ -1421,8 +1520,7 @@
 
 #endif
 !
-} > $tmp.1
-proto < $tmp.1 > $tmp.2
+} > $tmp.2
 case $debug in
 -d7)	echo $command: $tmp.2 ${base}.h ;;
 *)	cmp -s $tmp.2 ${base}.h 2>/dev/null || mv $tmp.2 ${base}.h ;;
@@ -1433,7 +1531,6 @@
 esac
 {
 cat <<!
-#pragma prototyped
 ${head}
 #include <sys/types.h>
 #include <limits.h>
@@ -1480,8 +1577,7 @@
 
 int	conf_elements = (int)sizeof(conf) / (int)sizeof(conf[0]);
 !
-} > $tmp.3
-proto < $tmp.3 > $tmp.4
+} > $tmp.4
 case $debug in
 -d7)	echo $command: $tmp.4 ${base}.c ;;
 *)	cmp -s $tmp.4 ${base}.c 2>/dev/null || mv $tmp.4 ${base}.c ;;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/conf.tab ksh93_2007_05_15/src/lib/libast/comp/conf.tab
--- ksh93_2007_04_18/src/lib/libast/comp/conf.tab	2007-04-02 21:45:47.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/conf.tab	2007-04-19 23:05:07.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # posix { getconf limits } macro table
 #
-# @(#)conf.tab (AT&T Research) 2007-04-01
+# @(#)conf.tab (AT&T Research) 2007-04-19
 #
 # name standard section call flags [ header ... ] [ value ... ]
 #
@@ -45,7 +45,7 @@
 AIO_MAX				POSIX	SC 1 LMU	1
 AIO_PRIO_DELTA_MAX		POSIX	SC 1 LMU
 ALLOC_SIZE_MIN			POSIX	PC 1 LUVW
-ARCHITECTURE			SVID	SI 1 0
+ARCHITECTURE			SVID	SI 1 O
 ARG_MAX				POSIX	SC 1 CDLMUX	NCARGS 4096
 ASYNCHRONOUS_IO			POSIX	SC 1 CDFUW
 ASYNC_IO			POSIX	PC 1 FUW
@@ -58,7 +58,7 @@
 BC_DIM_MAX			POSIX	SC 2 LMN	2048
 BC_SCALE_MAX			POSIX	SC 2 LMN	99
 BC_STRING_MAX			POSIX	SC 2 LMN	1000
-BUSTYPES			SVID	SI 1 0
+BUSTYPES			SVID	SI 1 O
 CHARCLASS_NAME_MAX		XOPEN	XX 1 L		14
 CHAR_BIT			C	XX 1 L		8
 CHAR_MAX			C	XX 1 L
@@ -116,9 +116,9 @@
 GETGR_R_SIZE_MAX		C	QQ 1 L
 GETPW_R_SIZE_MAX		C	QQ 1 L
 HOSTID				C	QQ 1 L
-HOSTNAME			SVID	SI 1 0
+HOSTNAME			SVID	SI 1 O
 HOST_NAME_MAX			POSIX	SC 1 LMU	255
-HW_PROVIDER			SVID	SI 1 0
+HW_PROVIDER			SVID	SI 1 O
 HW_SERIAL			C	QQ 1 L
 ILP32_OFF32			XBS5	SC 1 FU
 ILP32_OFF32_CFLAGS		XBS5	CS 1 FU
@@ -130,7 +130,7 @@
 ILP32_OFFBIG_LDFLAGS		XBS5	CS 1 FU
 ILP32_OFFBIG_LIBS		XBS5	CS 1 FU
 ILP32_OFFBIG_LINTFLAGS		XBS5	CS 1 FU
-INITTAB_NAME			SVID	SI 1 0
+INITTAB_NAME			SVID	SI 1 O
 INT_MAX				C	XX 1 L		32767
 INT_MIN				C	XX 1 L		-32767
 IOV_MAX				XOPEN	SC 1 LMU	16
@@ -169,7 +169,7 @@
 KERNEL_REGION_MAX		SCO	SC 1 0
 KERNEL_S5INODE			SCO	SC 1 0
 KERNEL_S5INODE_MAX		SCO	SC 1 0
-KERNEL_STAMP			SVID	SI 1 0
+KERNEL_STAMP			SVID	SI 1 O
 KERN_POINTERS			C	QQ 1 L
 KERN_SIM			C	QQ 1 L
 LEGACY				XOPEN	SC 1 FU
@@ -214,7 +214,7 @@
 LPBIG_OFFBIG_LDFLAGS		XBS5	CS 1 FU
 LPBIG_OFFBIG_LIBS		XBS5	CS 1 FU
 LPBIG_OFFBIG_LINTFLAGS		XBS5	CS 1 FU
-MACHINE				SVID	SI 1 0
+MACHINE				SVID	SI 1 O
 MAPPED_FILES			POSIX	SC 1 CDFUW	_lib_mmap
 MAX_CANON			POSIX	PC 1 LMU	CANBSIZ 255
 MAX_INPUT			POSIX	PC 1 LMU	MAX_CANON 255	
@@ -343,8 +343,8 @@
 OSREL_MAJ			C	QQ 1 L
 OSREL_MIN			C	QQ 1 L
 OSREL_PATCH			C	QQ 1 L
-OS_BASE				SVID	SI 1 0
-OS_PROVIDER			SVID	SI 1 0
+OS_BASE				SVID	SI 1 O
+OS_PROVIDER			SVID	SI 1 O
 OS_VERSION			AES	SC 1 FSU
 PAGESIZE			POSIX	SC 1 MU		PAGESIZE PAGE_SIZE 4096	cc{
 	int main()
@@ -506,7 +506,7 @@
 SYMLOOP_MAX			POSIX	SC 1 LMU	8
 SYNCHRONIZED_IO			POSIX	SC 1 CDFUW
 SYNC_IO				POSIX	PC 1 FUW
-SYSNAME				SVID	SI 1 0
+SYSNAME				SVID	SI 1 O
 SYSPID_MAX			SVID	SC 1 LMU	2
 THREADS				POSIX	SC 1 CDFUW
 THREADS_PRIO_CEILING		POSIX	SC 1 FUW
@@ -550,7 +550,7 @@
 ULONG_MAX			C	XX 1 L		4294967295
 UNIX				XOPEN	SC 1 FSUW
 UPE				POSIX	SC 2 FUW
-USER_LIMIT			SVID	SI 1 0
+USER_LIMIT			SVID	SI 1 O
 USHRT_MAX			C	XX 1 L		65535
 V6_ILP32_OFF32			POSIX	SC 1 W
 V6_ILP32_OFFBIG			POSIX	SC 1 W
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/rename.c ksh93_2007_05_15/src/lib/libast/comp/rename.c
--- ksh93_2007_04_18/src/lib/libast/comp/rename.c	2004-07-23 08:13:51.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/rename.c	2007-04-23 22:54:35.000000000 +0200
@@ -49,7 +49,7 @@
 		argv[1] = from;
 		argv[2] = to;
 		argv[3] = 0;
-		if (!procrun(argv[0], argv))
+		if (!procrun(argv[0], argv, 0))
 		{
 			errno = oerrno;
 			return 0;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/setlocale.c ksh93_2007_05_15/src/lib/libast/comp/setlocale.c
--- ksh93_2007_04_18/src/lib/libast/comp/setlocale.c	2006-12-19 06:08:54.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/comp/setlocale.c	2007-04-20 21:44:46.000000000 +0200
@@ -151,7 +151,7 @@
 		return 0;
 	sys = uwin_setlocale(category, usr);
 	if (ast.locale.set & AST_LC_debug)
-		sfprintf(sfstderr, "locale uwin %17s %-24s %-24s\n", categories[lcindex(category, 0)].name, usr, sys);
+		sfprintf(sfstderr, "locale uwin %17s %-24s %-24s\n", lc_categories[lcindex(category, 0)].name, usr, sys);
 	return sys;
 }
 
@@ -558,7 +558,7 @@
 			dp = &default_numeric;
 		LCINFO(category)->data = (void*)dp;
 		if (ast.locale.set & (AST_LC_debug|AST_LC_setlocale))
-			sfprintf(sfstderr, "locale info %17s decimal '%c' thousands '%c'\n", categories[category].name, dp->decimal, dp->thousand >= 0 ? dp->thousand : 'X');
+			sfprintf(sfstderr, "locale info %17s decimal '%c' thousands '%c'\n", lc_categories[category].name, dp->decimal, dp->thousand >= 0 ? dp->thousand : 'X');
 	}
 	return 0;
 }
@@ -567,7 +567,7 @@
  * this table is indexed by AST_LC_[A-Z]*
  */
 
-Lc_category_t		categories[] =
+Lc_category_t		lc_categories[] =
 {
 { "LC_ALL",           LC_ALL,           AST_LC_ALL,           0               },
 { "LC_COLLATE",       LC_COLLATE,       AST_LC_COLLATE,       set_collate     },
@@ -645,11 +645,11 @@
 	const char*	sys;
 	int		i;
 
-	if (!lc && !(lc = categories[category].prev))
+	if (!lc && !(lc = lc_categories[category].prev))
 		lc = lcmake(NiL);
 	if (locales[category] != lc)
 	{
-		if (categories[category].external == -categories[category].internal)
+		if (lc_categories[category].external == -lc_categories[category].internal)
 		{
 			sys = 0;
 			for (i = 1; i < AST_LC_COUNT; i++)
@@ -660,13 +660,13 @@
 				}
 		}
 		else if (lc->flags & (LC_debug|LC_local))
-			sys = setlocale(categories[category].external, lcmake(NiL)->name);
-		else if (!(sys = setlocale(categories[category].external, lc->name)) &&
-			 (streq(lc->name, lc->code) || !(sys = setlocale(categories[category].external, lc->code))) &&
+			sys = setlocale(lc_categories[category].external, lcmake(NiL)->name);
+		else if (!(sys = setlocale(lc_categories[category].external, lc->name)) &&
+			 (streq(lc->name, lc->code) || !(sys = setlocale(lc_categories[category].external, lc->code))) &&
 			 !streq(lc->code, lc->language->code))
-				sys = setlocale(categories[category].external, lc->language->code);
+				sys = setlocale(lc_categories[category].external, lc->language->code);
 		if (ast.locale.set & (AST_LC_debug|AST_LC_setlocale))
-			sfprintf(sfstderr, "locale set  %17s %-24s %-24s\n", categories[category].name, lc->name, sys);
+			sfprintf(sfstderr, "locale set  %17s %-24s %-24s\n", lc_categories[category].name, lc->name, sys);
 		if (!sys)
 		{
 			/*
@@ -684,13 +684,13 @@
 			}
 			if (!(lc->flags & LC_local))
 				return 0;
-			if (categories[category].external != -categories[category].internal)
-				setlocale(categories[category].external, lcmake(NiL)->name);
+			if (lc_categories[category].external != -lc_categories[category].internal)
+				setlocale(lc_categories[category].external, lcmake(NiL)->name);
 		}
 		locales[category] = lc;
-		if (categories[category].setf && (*categories[category].setf)(&categories[category]))
+		if (lc_categories[category].setf && (*lc_categories[category].setf)(&lc_categories[category]))
 		{
-			locales[category] = categories[category].prev;
+			locales[category] = lc_categories[category].prev;
 			return 0;
 		}
 		if (lc->flags & LC_default)
@@ -729,7 +729,7 @@
 		for (i = 1; i < AST_LC_COUNT; i++)
 		{
 			s = w;
-			t = categories[i].name;
+			t = lc_categories[i].name;
 			while (*t && *s++ == *t++);
 			if (!*t && *s++ == '=')
 			{
@@ -776,8 +776,8 @@
 				}
 				stk[k++] = cat[i];
 			}
-			else if (!categories[cat[i]].prev)
-				categories[cat[i]].prev = p;
+			else if (!lc_categories[cat[i]].prev)
+				lc_categories[cat[i]].prev = p;
 	}
 	while (s[0] == '/' && s[1] && n < AST_LC_COUNT)
 	{
@@ -802,8 +802,8 @@
 				return -1;
 			}
 		}
-		else if (!categories[n].prev)
-			categories[n].prev = p;
+		else if (!lc_categories[n].prev)
+			lc_categories[n].prev = p;
 	}
 	return n;
 }
@@ -862,7 +862,7 @@
 					if (cat[j] == k)
 					{
 						cat[j] = -1;
-						sfprintf(sp, "%s=", categories[j].name);
+						sfprintf(sp, "%s=", lc_categories[j].name);
 					}
 				sfprintf(sp, "%s", locales[i]->name);
 			}
@@ -888,11 +888,11 @@
 			if (!(a = getenv("LC_ALL")) || !*a)
 			{
 				for (i = 1; i < AST_LC_COUNT; i++)
-					if ((s = getenv(categories[i].name)) && *s)
+					if ((s = getenv(lc_categories[i].name)) && *s)
 					{
 						if (streq(s, local) && (u || (u = native_locale(locale, tmp, sizeof(tmp)))))
 							s = u;
-						categories[i].prev = lcmake(s);
+						lc_categories[i].prev = lcmake(s);
 					}
 				a = getenv("LANG");
 			}
@@ -906,13 +906,13 @@
 			p = 0;
 			for (i = 1; i < AST_LC_COUNT; i++)
 			{
-				if (!categories[i].prev)
+				if (!lc_categories[i].prev)
 				{
 					if (!p && !(p = lcmake(a)))
 						break;
-					categories[i].prev = p;
+					lc_categories[i].prev = p;
 				}
-				if (!single(i, categories[i].prev))
+				if (!single(i, lc_categories[i].prev))
 				{
 					while (i--)
 						single(i, NiL);
@@ -921,7 +921,7 @@
 			}
 			if (ast.locale.set & AST_LC_debug)
 				for (i = 1; i < AST_LC_COUNT; i++)
-					sfprintf(sfstderr, "locale env  %17s %s\n", categories[i].name, locales[i]->name);
+					sfprintf(sfstderr, "locale env  %17s %s\n", lc_categories[i].name, locales[i]->name);
 			initialized = 1;
 		}
 		goto compose;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/syslog.h ksh93_2007_05_15/src/lib/libast/comp/syslog.h
--- ksh93_2007_04_18/src/lib/libast/comp/syslog.h	2003-06-15 12:29:15.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/syslog.h	2007-04-21 00:22:54.000000000 +0200
@@ -95,7 +95,7 @@
 
 /* encoding support */
 
-#include <namval.h>
+#include <ast_namval.h>
 
 #define log_facility	_log_facility
 #define log_severity	_log_severity
diff -r -N -u ksh93_2007_04_18/src/lib/libast/comp/system.c ksh93_2007_05_15/src/lib/libast/comp/system.c
--- ksh93_2007_04_18/src/lib/libast/comp/system.c	2006-09-22 17:28:36.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/comp/system.c	2007-04-23 22:54:44.000000000 +0200
@@ -51,5 +51,5 @@
 	sh[1] = "-c";
 	sh[2] = (char*)cmd;
 	sh[3] = 0;
-	return procrun(NiL, sh);
+	return procrun(NiL, sh, 0);
 }
diff -r -N -u ksh93_2007_04_18/src/lib/libast/features/siglist ksh93_2007_05_15/src/lib/libast/features/siglist
--- ksh93_2007_04_18/src/lib/libast/features/siglist	1970-01-01 01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/features/siglist	2007-05-09 18:21:19.000000000 +0200
@@ -0,0 +1,14 @@
+lib	strsignal string.h signal.h
+
+tst	- run{
+	for sig in `/bin/kill -l 2>/dev/null`
+	do	case $sig in
+		*[!A-Za-z0-9_]*|*MIN|*MAX)
+			;;
+		*)	echo "#if defined(SIG$sig) && !defined(HAD_SIG$sig)"
+			echo "0,\"$sig\",SIG$sig,"
+			echo "#endif"
+			;;
+		esac
+	done
+}end
diff -r -N -u ksh93_2007_04_18/src/lib/libast/features/signal.c ksh93_2007_05_15/src/lib/libast/features/signal.c
--- ksh93_2007_04_18/src/lib/libast/features/signal.c	2006-09-28 20:16:56.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/features/signal.c	2007-05-09 18:14:04.000000000 +0200
@@ -22,13 +22,19 @@
 #pragma prototyped
 /*
  * Glenn Fowler
- * AT&T Bell Laboratories
+ * AT&T Research
  *
  * generate signal features
  */
 
+#include "FEATURE/standards"
+
+#define strsignal	______strsignal
+
 #include <signal.h>
 
+#undef	strsignal
+
 struct _m_
 {
 	char*		text;
@@ -41,170 +47,226 @@
 static struct _m_ map[] =
 {
 #ifdef SIGABRT
+#define HAD_SIGABRT	1
 "Abort",			"ABRT",		SIGABRT,
 #endif
 #ifdef SIGAIO
+#define HAD_SIGAIO	1
 "Asynchronous I/O",		"AIO",		SIGAIO,
 #endif
 #ifdef SIGALRM
+#define HAD_SIGALRM	1
 "Alarm call",			"ALRM",		SIGALRM,
 #endif
 #ifdef SIGAPOLLO
+#define HAD_SIGAPOLLO	1
 "Apollo",			"APOLLO",	SIGAPOLLO,
 #endif
 #ifdef SIGBUS
+#define HAD_SIGBUS	1
 "Bus error",			"BUS",		SIGBUS,
 #endif
 #ifdef SIGCHLD
+#define HAD_SIGCHLD	1
 "Child status change",		"CHLD",		SIGCHLD,
 #endif
 #ifdef SIGCLD
+#define HAD_SIGCLD	1
 "Death of child", 		"CLD",		SIGCLD,
 #endif
 #ifdef SIGCONT
+#define HAD_SIGCONT	1
 "Stopped process continued",	"CONT",		SIGCONT,
 #endif
 #ifdef SIGDANGER
+#define HAD_SIGDANGER	1
 "System crash soon",		"DANGER",	SIGDANGER,
 #endif
 #ifdef SIGDEBUG
+#define HAD_SIGDEBUG	1
 "Debug trap",			"DEBUG",	SIGDEBUG,
 #endif
 #ifdef SIGDIL
+#define HAD_SIGDIL	1
 "DIL trap",			"DIL",		SIGDIL,
 #endif
 #ifdef SIGEMT
+#define HAD_SIGEMT	1
 "EMT trap",			"EMT",		SIGEMT,
 #endif
 #ifdef SIGERR
+#define HAD_SIGERR	1
 "ERR trap",			"ERR",		SIGERR,
 #endif
 #ifdef SIGEXIT
+#define HAD_SIGEXIT	1
 "Exit",				"EXIT",		SIGEXIT,
 #endif
 #ifdef SIGFPE
+#define HAD_SIGFPE	1
 "Floating exception",		"FPE",		SIGFPE,
 #endif
 #ifdef SIGFREEZE
+#define HAD_SIGFREEZE	1
 "CPR freeze",			"FREEZE",	SIGFREEZE,
 #endif
 #ifdef SIGHUP
+#define HAD_SIGHUP	1
 "Hangup",			"HUP",		SIGHUP,
 #endif
 #ifdef SIGILL
+#define HAD_SIGILL	1
 "Illegal instruction",		"ILL",		SIGILL,
 #endif
 #ifdef SIGINT
+#define HAD_SIGINT	1
 "Interrupt",			"INT",		SIGINT,
 #endif
 #ifdef SIGIO
+#define HAD_SIGIO	1
 "IO possible",			"IO",		SIGIO,
 #endif
 #ifdef SIGIOT
+#define HAD_SIGIOT	1
 "IOT trap",			"IOT",		SIGIOT,
 #endif
 #ifdef SIGKILL
+#define HAD_SIGKILL	1
 "Killed",			"KILL",		SIGKILL,
 #endif
 #ifdef SIGLAB
+#define HAD_SIGLAB	1
 "Security label changed",	"LAB",		SIGLAB,
 #endif
 #ifdef SIGLOST
+#define HAD_SIGLOST	1
 "Resources lost",		"LOST",		SIGLOST,
 #endif
 #ifdef SIGLWP
+#define HAD_SIGLWP	1
 "Thread event",			"LWP",		SIGLWP,
 #endif
 #ifdef SIGMIGRATE
+#define HAD_SIGMIGRATE	1
 "Migrate process",		"MIGRATE",	SIGMIGRATE,
 #endif
 #ifdef SIGPHONE
+#define HAD_SIGPHONE	1
 "Phone status change",		"PHONE",	SIGPHONE,
 #endif
 #ifdef SIGPIPE
+#define HAD_SIGPIPE	1
 "Broken pipe",			"PIPE",		SIGPIPE,
 #endif
 #ifdef SIGPOLL
+#define HAD_SIGPOLL	1
 "Poll event",			"POLL",		SIGPOLL,
 #endif
 #ifdef SIGPROF
+#define HAD_SIGPROF	1
 "Profile timer alarm",		"PROF",		SIGPROF,
 #endif
 #ifdef SIGPWR
+#define HAD_SIGPWR	1
 "Power fail",			"PWR",		SIGPWR,
 #endif
 #ifdef SIGQUIT
+#define HAD_SIGQUIT	1
 "Quit",				"QUIT",		SIGQUIT,
 #endif
 #ifdef SIGSEGV
+#define HAD_SIGSEGV	1
 "Memory fault",			"SEGV",		SIGSEGV,
 #endif
 #ifdef SIGSOUND
+#define HAD_SIGSOUND	1
 "Sound completed",		"SOUND",	SIGSOUND,
 #endif
 #ifdef SIGSSTOP
+#define HAD_SIGSSTOP	1
 "Sendable stop",		"SSTOP",	SIGSSTOP,
 #endif
 #ifdef gould
+#define HAD_gould	1
 "Stack overflow",		"STKOV",	28,
 #endif
 #ifdef SIGSTOP
+#define HAD_SIGSTOP	1
 "Stopped (signal)",		"STOP",		SIGSTOP,
 #endif
 #ifdef SIGSYS
+#define HAD_SIGSYS	1
 "Bad system call", 		"SYS",		SIGSYS,
 #endif
 #ifdef SIGTERM
+#define HAD_SIGTERM	1
 "Terminated",			"TERM",		SIGTERM,
 #endif
 #ifdef SIGTHAW
+#define HAD_SIGTHAW	1
 "CPR thaw",			"THAW",		SIGTHAW,
 #endif
 #ifdef SIGTINT
+#define HAD_SIGTINT	1
 "Interrupt (terminal)",		"TINT",		SIGTINT,
 #endif
 #ifdef SIGTRAP
+#define HAD_SIGTRAP	1
 "Trace trap",			"TRAP",		SIGTRAP,
 #endif
 #ifdef SIGTSTP
+#define HAD_SIGTSTP	1
 "Stopped",			"TSTP",		SIGTSTP,
 #endif
 #ifdef SIGTTIN
+#define HAD_SIGTTIN	1
 "Stopped (tty input)",		"TTIN",		SIGTTIN,
 #endif
 #ifdef SIGTTOU
+#define HAD_SIGTTOU	1
 "Stopped (tty output)",		"TTOU",		SIGTTOU,
 #endif
 #ifdef SIGURG
+#define HAD_SIGURG	1
 "Urgent IO",			"URG",		SIGURG,
 #endif
 #ifdef SIGUSR1
+#define HAD_SIGUSR1	1
 "User signal 1",		"USR1",		SIGUSR1,
 #endif
 #ifdef SIGUSR2
+#define HAD_SIGUSR2	1
 "User signal 2",		"USR2",		SIGUSR2,
 #endif
 #ifdef SIGVTALRM
+#define HAD_SIGVTALRM	1
 "Virtual timer alarm",		"VTALRM",	SIGVTALRM,
 #endif
 #ifdef SIGWAITING
+#define HAD_SIGWAITING	1
 "All threads blocked",		"WAITING",	SIGWAITING,
 #endif
 #ifdef SIGWINCH
+#define HAD_SIGWINCH	1
 "Window change", 		"WINCH",	SIGWINCH,
 #endif
 #ifdef SIGWIND
+#define HAD_SIGWIND	1
 "Window change",		"WIND",		SIGWIND,
 #endif
 #ifdef SIGWINDOW
+#define HAD_SIGWINDOW	1
 "Window change",		"WINDOW",	SIGWINDOW,
 #endif
 #ifdef SIGXCPU
+#define HAD_SIGXCPU	1
 "CPU time limit",		"XCPU",		SIGXCPU,
 #endif
 #ifdef SIGXFSZ
+#define HAD_SIGXFSZ	1
 "File size limit",		"XFSZ",		SIGXFSZ,
 #endif
+#include "FEATURE/siglist"
 0
 };
 
@@ -214,7 +276,11 @@
 
 #define RANGE_SIG	(~(RANGE_MIN|RANGE_MAX|RANGE_RT))
 
-static int		index[64];
+static int		mapindex[1024];
+
+#if _lib_strsignal
+extern char*		strsignal(int);
+#endif
 
 int
 main()
@@ -223,13 +289,17 @@
 	register int	j;
 	register int	k;
 	int		n;
+#if _lib_strsignal
+	char*		s;
+#endif
 
 	k = 0;
 	for (i = 0; map[i].name; i++)
-		if ((j = map[i].value) > 0 && j < elementsof(index) && !index[j])
+		if ((j = map[i].value) > 0 && j < elementsof(mapindex) && !mapindex[j])
 		{
-			if (j > k) k = j;
-			index[j] = i;
+			if (j > k)
+				k = j;
+			mapindex[j] = i;
 		}
 #ifdef SIGRTMIN
 	i = SIGRTMIN;
@@ -238,15 +308,17 @@
 #else
 	j = i;
 #endif
-	if (j >= elementsof(index)) j = elementsof(index) - 1;
-	if (i <= j && i > 0 && i < elementsof(index) && j > 0 && j < elementsof(index))
+	if (j >= elementsof(mapindex))
+		j = elementsof(mapindex) - 1;
+	if (i <= j && i > 0 && i < elementsof(mapindex) && j > 0 && j < elementsof(mapindex))
 	{
-		if (j > k) k = j;
-		index[i] = RANGE_MIN | RANGE_RT;
+		if (j > k)
+			k = j;
+		mapindex[i] = RANGE_MIN | RANGE_RT;
 		n = 1;
 		while (++i < j)
-			index[i] = RANGE_RT | n++;
-		index[j] = RANGE_MAX | RANGE_RT | n;
+			mapindex[i] = RANGE_RT | n++;
+		mapindex[j] = RANGE_MAX | RANGE_RT | n;
 	}
 #endif
 	printf("#pragma prototyped\n");
@@ -255,23 +327,37 @@
 	printf("static const char* const	sig_name[] =\n");
 	printf("{\n");
 	for (i = 0; i <= k; i++)
-		if (!(j = index[i])) printf("	\"%d\",\n", i);
+		if (!(j = mapindex[i]))
+			printf("	\"%d\",\n", i);
 		else if (j & RANGE_RT)
 		{
-			if (j & RANGE_MIN) printf("	\"RTMIN\",\n");
-			else if (j & RANGE_MAX) printf("	\"RTMAX\",\n");
-			else printf("	\"RT%d\",\n", j & RANGE_SIG);
+			if (j & RANGE_MIN)
+				printf("	\"RTMIN\",\n");
+			else if (j & RANGE_MAX)
+				printf("	\"RTMAX\",\n");
+			else
+				printf("	\"RT%d\",\n", j & RANGE_SIG);
 		}
-		else printf("	\"%s\",\n", map[j].name);
+		else
+			printf("	\"%s\",\n", map[j].name);
 	printf("	0\n");
 	printf("};\n");
 	printf("\n");
 	printf("static const char* const	sig_text[] =\n");
 	printf("{\n");
 	for (i = 0; i <= k; i++)
-		if (!(j = index[i])) printf("	\"Signal %d\",\n", i);
-		else if (j & RANGE_RT) printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
-		else printf("	\"%s\",\n", map[j].text);
+		if (!(j = mapindex[i]))
+			printf("	\"Signal %d\",\n", i);
+		else if (j & RANGE_RT)
+			printf("	\"Realtime priority %d%s\",\n", j & RANGE_SIG, (j & RANGE_MIN) ? " (lo)" : (j & RANGE_MAX) ? " (hi)" : "");
+		else if (map[j].text)
+			printf("	\"%s\",\n", map[j].text);
+#if _lib_strsignal
+		else if (s = strsignal(i))
+			printf("	\"%s\",\n", s);
+#endif
+		else
+			printf("	\"Signal %d\",\n", i);
 	printf("	0\n");
 	printf("};\n");
 	return 0;
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/cmdarg.h ksh93_2007_05_15/src/lib/libast/include/cmdarg.h
--- ksh93_2007_04_18/src/lib/libast/include/cmdarg.h	1970-01-01 01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/include/cmdarg.h	2007-04-24 21:53:36.000000000 +0200
@@ -0,0 +1,84 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1985-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                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                   Phong Vo <kpv at research.att.com>                    *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * xargs/tw command arg list interface definitions
+ */
+
+#ifndef _CMDARG_H
+#define _CMDARG_H
+
+#define CMD_CHECKED	(1<<9)		/* cmdopen() argv[0] ok		*/
+#define CMD_EMPTY	(1<<0)		/* run once, even if no args	*/
+#define CMD_EXACT	(1<<1)		/* last command must have argmax*/
+#define CMD_IGNORE	(1<<2)		/* ignore EXIT_QUIT exit	*/
+#define CMD_INSERT	(1<<3)		/* argpat for insertion		*/
+#define CMD_MINIMUM	(1<<4)		/* argmax is a minimum		*/
+#define CMD_NEWLINE	(1<<5)		/* echo separator is newline	*/
+#define CMD_POST	(1<<6)		/* argpat is post arg position	*/
+#define CMD_QUERY	(1<<7)		/* trace and query each command	*/
+#define CMD_SILENT	(1<<10)		/* no error messages		*/
+#define CMD_TRACE	(1<<8)		/* trace each command		*/
+
+#define CMD_USER	(1<<12)
+
+typedef struct				/* cmd + args info		*/
+{
+	struct
+	{
+	size_t		args;		/* total args			*/
+	size_t		commands;	/* total commands		*/
+	}		total;
+
+	int		argcount;	/* current arg count		*/
+	int		argmax;		/* max # args			*/
+	int		echo;		/* just an echo			*/
+	int		flags;		/* CMD_* flags			*/
+	int		insertlen;	/* strlen(insert)		*/
+	int		offset;		/* post arg offset		*/
+
+	char**		argv;		/* exec argv			*/
+	char**		firstarg;	/* first argv file arg		*/
+	char**		insertarg;	/* argv before insert		*/
+	char**		postarg;	/* start of post arg list	*/
+	char**		nextarg;	/* next argv file arg		*/
+	char*		nextstr;	/* next string ends before here	*/
+	char*		laststr;	/* last string ends before here	*/
+	char*		insert;		/* replace with current arg	*/
+	char		buf[1];		/* argv and arg buffer		*/
+} Cmdarg_t;
+
+#if _BLD_ast && defined(__EXPORT__)
+#define extern		__EXPORT__
+#endif
+
+extern Cmdarg_t*	cmdopen(char**, int, int, const char*, int);
+extern int		cmdflush(Cmdarg_t*);
+extern int		cmdarg(Cmdarg_t*, const char*, int);
+extern int		cmdclose(Cmdarg_t*);
+
+#undef	extern
+
+#endif
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/fts.h ksh93_2007_05_15/src/lib/libast/include/fts.h
--- ksh93_2007_04_18/src/lib/libast/include/fts.h	1999-10-11 09:31:30.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/include/fts.h	2007-04-24 18:50:44.000000000 +0200
@@ -118,6 +118,10 @@
 
 #ifdef _FTSENT_PRIVATE_
 	_FTSENT_PRIVATE_
+#else
+	short		_fts_pad_1;	/* <ftwalk.h> compatibility	*/
+	struct stat	_fts_pad_2;	/* <ftwalk.h> compatibility	*/
+	FTS*		fts;		/* fts_open() handle		*/
 #endif
 
 };
@@ -125,6 +129,7 @@
 struct Fts
 {
 	int		fts_errno;	/* last errno			*/
+	void*		fts_handle;	/* user defined handle		*/
 
 #ifdef _FTS_PRIVATE_
 	_FTS_PRIVATE_
@@ -139,6 +144,7 @@
 extern FTSENT*	fts_children(FTS*, int);
 extern int	fts_close(FTS*);
 extern int	fts_flags(void);
+extern int	fts_local(FTSENT*);
 extern int	fts_notify(int(*)(FTS*, FTSENT*, void*), void*);
 extern FTS*	fts_open(char* const*, int, int(*)(FTSENT* const*, FTSENT* const*));
 extern FTSENT*	fts_read(FTS*);
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/option.h ksh93_2007_05_15/src/lib/libast/include/option.h
--- ksh93_2007_04_18/src/lib/libast/include/option.h	2007-03-22 23:14:38.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/include/option.h	2007-04-25 19:24:44.000000000 +0200
@@ -99,6 +99,7 @@
 extern char*		optusage(const char*);
 extern int		optstr(const char*, const char*);
 extern int		optesc(Sfio_t*, const char*, int);
+extern Opt_t*		optctx(Opt_t*, Opt_t*);
 
 #undef	extern
 
diff -r -N -u ksh93_2007_04_18/src/lib/libast/include/proc.h ksh93_2007_05_15/src/lib/libast/include/proc.h
--- ksh93_2007_04_18/src/lib/libast/include/proc.h	1998-04-13 21:03:07.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/include/proc.h	2007-04-24 21:34:24.000000000 +0200
@@ -32,12 +32,14 @@
 
 #define PROC_ARGMOD	(1<<0)	/* argv[-1],argv[0] can be modified	*/
 #define PROC_BACKGROUND	(1<<1)	/* shell background (&) setup		*/
+#define PROC_CHECK	(1<<17)	/* check that command exists		*/
 #define PROC_CLEANUP	(1<<2)	/* close parent redirect fds on error	*/
 #define PROC_DAEMON	(1<<3)	/* daemon setup				*/
 #define PROC_ENVCLEAR	(1<<4)	/* clear environment			*/
 #define PROC_FOREGROUND	(1<<14)	/* system(3) setup			*/
 #define PROC_GID	(1<<5)	/* setgid(getgid())			*/
 #define PROC_IGNORE	(1<<6)	/* ignore parent pipe errors		*/
+#define PROC_IGNOREPATH	(1<<16)	/* procrun() intercept to ignore path	*/
 #define PROC_OVERLAY	(1<<7)	/* overlay current process if possible	*/
 #define PROC_PARANOID	(1<<8)	/* restrict everything			*/
 #define PROC_PRIVELEGED	(1<<9)	/* setuid(0), setgid(getegid())		*/
@@ -94,8 +96,8 @@
 
 extern int	procclose(Proc_t*);
 extern int	procfree(Proc_t*);
-extern Proc_t*	procopen(const char*, char**, char**, long*, long);
-extern int	procrun(const char*, char**);
+extern Proc_t*	procopen(const char*, char**, char**, long*, int);
+extern int	procrun(const char*, char**, int);
 
 #undef	extern
 
diff -r -N -u ksh93_2007_04_18/src/lib/libast/Makefile ksh93_2007_05_15/src/lib/libast/Makefile
--- ksh93_2007_04_18/src/lib/libast/Makefile	2007-03-22 18:27:48.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/Makefile	2007-04-25 19:54:20.000000000 +0200
@@ -28,11 +28,11 @@
 __OBSOLETE__ == $("6 months ago":@F=%(%Y0101)T)
 
 HEADERSRC = ast.h ast_dir.h ast_getopt.h ast_std.h \
-	ast_version.h ast_windows.h \
-	ccode.h cdt.h debug.h dt.h error.h find.h ftw.h ftwalk.h fts.h \
-	fs3d.h getopt.h glob.h hash.h hashkey.h hashpart.h lc.h ls.h \
-	magic.h mc.h mime.h mnt.h modecanon.h modex.h namval.h option.h \
-	proc.h re_comp.h recfmt.h regex.h regexp.h \
+	ast_namval.h ast_version.h ast_windows.h \
+	ccode.h cdt.h cmdarg.h debug.h dt.h error.h find.h ftw.h ftwalk.h \
+	fts.h fs3d.h getopt.h glob.h hash.h hashkey.h hashpart.h lc.h \
+	ls.h magic.h mc.h mime.h mnt.h modecanon.h modex.h namval.h \
+	option.h proc.h re_comp.h recfmt.h regex.h regexp.h \
 	sfio.h sfio_s.h sfio_t.h sfdisc.h \
 	stack.h stak.h stk.h swap.h tar.h times.h tm.h tok.h \
 	usage.h vdb.h vecargs.h vmalloc.h wait.h wordexp.h \
@@ -79,11 +79,11 @@
 	pathnative.c pathposix.c pathtemp.c pathtmp.c pathstat.c \
 	pathgetlink.c pathsetlink.c pathbin.c pathshell.c pathcd.c \
 	fs3d.c ftwalk.c ftwflags.c fts.c setenviron.c \
-	optget.c optjoin.c optesc.c strsort.c struniq.c \
+	optget.c optjoin.c optesc.c optctx.c strsort.c struniq.c \
 	magic.c mime.c mimetype.c signal.c systrace.c \
 	error.c errorf.c errormsg.c errorx.c \
 	localeconv.c setlocale.c translate.c \
-	catopen.c iconv.c lc.c mc.c \
+	catopen.c iconv.c lc.c lctab.c mc.c \
 	base64.c recfmt.c recstr.c reclen.c fmtrec.c \
 	fmtbase.c fmtbuf.c fmtclock.c fmtdev.c fmtelapsed.c fmterror.c \
 	fmtesc.c fmtfmt.c fmtfs.c fmtident.c fmtip4.c fmtls.c fmtmatch.c \
@@ -99,7 +99,7 @@
 	tmxdate.c tmxfmt.c tmxgettime.c tmxleap.c tmxmake.c \
 	tmxscan.c tmxsettime.c tmxsleep.c tmxtime.c tmxtouch.c \
 	tvcmp.c tvgettime.c tvsettime.c tvsleep.c tvtouch.c \
-	vecargs.c vecfile.c vecfree.c vecload.c vecstring.c \
+	cmdarg.c vecargs.c vecfile.c vecfree.c vecload.c vecstring.c \
 	univlib.h univdata.c touch.c mnt.c \
 	memccpy.c memchr.c memcmp.c memcpy.c memdup.c memmove.c memset.c \
 	mkdir.c mkfifo.c mknod.c rmdir.c remove.c rename.c link.c unlink.c \
@@ -226,7 +226,7 @@
  * NOTE: sun4 runtime link botches ro data so advertized sig_info is rw
  */
 
-:READONLY: conftab.c modedata.c /*sftable.c*/ \
+:READONLY: conftab.c lctab.c modedata.c /*sftable.c*/ \
 	/*sigdata.c*/ tmdata.c univdata.c
 
 :: atmain.C \
@@ -246,10 +246,12 @@
 
 $(HEADERGEN) :COPY: FEATURE/$$(<:B:/$(ID)_//)
 
+ast_namval.h :COPY: namval.h
+
 lcgen : lcgen.c
 	$(CC.NATIVE|CC) -o $(<) $(*)
 
-lc.h lctab.h :JOINT: lcgen lc.tab
+lc.h lctab.c :JOINT: lcgen lc.tab
 	$(*:O=1:C,^[^/],./&,) $(tmp).1 $(tmp).2 < $(*:O=2) # :P=E: in 2006
 	$(PROTO) -p $(PROTOFLAGS) $(tmp).1 $(PROTOINSTALL) > $(tmp).3
 	$(RM) -f $(tmp).1
diff -r -N -u ksh93_2007_04_18/src/lib/libast/Mamfile ksh93_2007_05_15/src/lib/libast/Mamfile
--- ksh93_2007_04_18/src/lib/libast/Mamfile	2007-04-18 20:07:32.000000000 +0200
+++ ksh93_2007_05_15/src/lib/libast/Mamfile	2007-05-16 05:16:04.000000000 +0200
@@ -924,16 +924,16 @@
 exec - then	rm ${COTEMP}.3
 exec - else	mv ${COTEMP}.3 lc.h
 exec - fi
-exec - if	cmp 2>/dev/null -s ${COTEMP}.2 lctab.h
+exec - if	cmp 2>/dev/null -s ${COTEMP}.2 lctab.c
 exec - then	rm ${COTEMP}.2
-exec - else	mv ${COTEMP}.2 lctab.h
+exec - else	mv ${COTEMP}.2 lctab.c
 exec - fi
 prev include/ast.h implicit
 make ${INSTALLROOT}/include/prototyped.h implicit
 done ${INSTALLROOT}/include/prototyped.h dontcare
 done lc.h dontcare generated
-make lctab.h
-done lctab.h generated
+make lctab.c
+done lctab.c generated
 done joint.lc.h virtual
 prev include/error.h implicit
 prev include/ast.h implicit
@@ -1124,6 +1124,7 @@
 make fts.o
 make misc/fts.c
 prev include/fts.h implicit
+prev include/ls.h implicit
 prev include/fs3d.h implicit
 prev include/error.h implicit
 prev include/ast_dir.h implicit
@@ -1175,6 +1176,14 @@
 prev misc/optesc.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd -D_PACKAGE_ast -c misc/optesc.c
 done optesc.o generated
+make optctx.o
+make misc/optctx.c
+prev misc/optlib.h implicit
+done misc/optctx.c
+meta optctx.o %.c>%.o misc/optctx.c optctx
+prev misc/optctx.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd -D_PACKAGE_ast -c misc/optctx.c
+done optctx.o generated
 make strsort.o
 make string/strsort.c
 prev include/ast.h implicit
@@ -1271,7 +1280,6 @@
 done systrace.o generated
 make error.o
 make misc/error.c
-prev include/error.h implicit
 prev include/regex.h implicit
 prev include/times.h implicit
 prev include/stk.h implicit
@@ -1283,7 +1291,7 @@
 done misc/error.c
 meta error.o %.c>%.o misc/error.c error
 prev misc/error.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -DERROR_CATALOG=\""libast"\" -c misc/error.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd -I${INSTALLROOT}/include -DERROR_CATALOG=\""libast"\" -D_PACKAGE_ast -c misc/error.c
 done error.o generated
 make errorf.o
 make misc/errorf.c
@@ -1393,15 +1401,24 @@
 done iconv.o generated
 make lc.o
 make port/lc.c
-make lctab.h implicit
-done lctab.h
+make port/lclang.h implicit
 prev include/ast_windows.h implicit
+done port/lclang.h
 prev port/lclib.h implicit
 done port/lc.c
 meta lc.o %.c>%.o port/lc.c lc
 prev port/lc.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c port/lc.c
 done lc.o generated
+make lctab.o
+make lctab.c
+prev port/lclang.h implicit
+prev port/lclib.h implicit
+done lctab.c
+meta lctab.o %.c>%.o lctab.c lctab
+prev lctab.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Iinclude -Istd -I${INSTALLROOT}/include -D_PACKAGE_ast  -c lctab.c
+done lctab.o generated
 make mc.o
 make port/mc.c
 prev std/nl_types.h implicit
@@ -1862,9 +1879,17 @@
 make FEATURE/signal implicit
 meta FEATURE/signal features/%.c>FEATURE/% features/signal.c signal
 make features/signal.c
+make FEATURE/siglist implicit
+meta FEATURE/siglist features/%>FEATURE/% features/siglist siglist
+make features/siglist
+done features/siglist
+prev ast.req
+exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '   run features/siglist
+done FEATURE/siglist generated
+prev FEATURE/standards implicit
 done features/signal.c
 prev ast.req
-exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '   run features/signal.c
+exec - iffe -v -X ast -X std -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I.  ${LDFLAGS} '   run features/signal.c
 done FEATURE/signal generated
 prev sig.h implicit
 prev include/ast.h implicit
@@ -1932,7 +1957,7 @@
 done misc/procrun.c
 meta procrun.o %.c>%.o misc/procrun.c procrun
 prev misc/procrun.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd -D_PACKAGE_ast -c misc/procrun.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Imisc -Iinclude -Istd -D__OBSOLETE__=20060101 -D_PACKAGE_ast -c misc/procrun.c
 done procrun.o generated
 make procfree.o
 make misc/procfree.c
@@ -2263,6 +2288,18 @@
 prev tm/tvtouch.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c tm/tvtouch.c
 done tvtouch.o generated
+make cmdarg.o
+make misc/cmdarg.c
+make include/cmdarg.h implicit
+done include/cmdarg.h
+prev include/proc.h implicit
+prev include/error.h implicit
+prev include/ast.h implicit
+done misc/cmdarg.c
+meta cmdarg.o %.c>%.o misc/cmdarg.c cmdarg
+prev misc/cmdarg.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c misc/cmdarg.c
+done cmdarg.o generated
 make vecargs.o
 make vec/vecargs.c
 make include/vecargs.h implicit
@@ -3263,7 +3300,10 @@
 make comp/closelog.c
 make comp/sysloglib.h implicit
 make comp/syslog.h implicit
-prev include/namval.h implicit
+make ast_namval.h implicit
+prev include/namval.h
+exec - cmp 2>/dev/null -s include/namval.h ast_namval.h || { rm -f ast_namval.h; silent test -d . || mkdir .; ${STDCP} include/namval.h ast_namval.h; }
+done ast_namval.h dontcare generated
 done comp/syslog.h dontcare
 done comp/sysloglib.h dontcare
 prev include/ast.h implicit
@@ -5755,12 +5795,12 @@
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd -D_PACKAGE_ast -c obsolete/spawn.c
 done spawn.o generated
 exec - ${AR} cr libast.a state.o transition.o opendir.o readdir.o rewinddir.o seekdir.o telldir.o getcwd.o fastfind.o hashalloc.o hashdump.o hashfree.o hashlast.o hashlook.o hashscan.o hashsize.o hashview.o hashwalk.o memhash.o memsum.o strhash.o strkey.o strsum.o stracmp.o strnacmp.o ccmap.o ccmapid.o ccnative.o chresc.o chrtoi.o
-exec - ${AR} cr libast.a streval.o strexpr.o strmatch.o strcopy.o modei.o modex.o strmode.o strlcat.o strlcpy.o strlook.o strncopy.o strsearch.o strpsearch.o stresc.o stropt.o strtape.o tok.o tokline.o tokscan.o pathaccess.o pathcat.o pathcanon.o pathcheck.o pathpath.o pathexists.o pathfind.o pathkey.o pathprobe.o pathrepl.o pathnative.o pathposix.o pathtemp.o pathtmp.o pathstat.o pathgetlink.o pathsetlink.o pathbin.o pathshell.o pathcd.o fs3d.o ftwalk.o ftwflags.o fts.o setenviron.o optget.o optjoin.o optesc.o strsort.o struniq.o magic.o mime.o mimetype.o signal.o systrace.o error.o errorf.o errormsg.o errorx.o localeconv.o setlocale.o translate.o catopen.o iconv.o lc.o mc.o base64.o recfmt.o recstr.o reclen.o fmtrec.o fmtbase.o fmtbuf.o fmtclock.o fmtdev.o fmtelapsed.o fmterror.o fmtesc.o fmtfmt.o fmtfs.o fmtident.o fmtip4.o fmtls.o fmtmatch.o fmtmode.o fmtnum.o fmtperm.o fmtre.o fmttime.o fmtuid.o fmtgid.o fmtsignal.o fmtscale.o fmttmx.o fmttv.o fmtversion.o strelapsed.o strperm.o struid.o strgid.o strtoip4.o stack.o
-exec - ${AR} cr libast.a stk.o swapget.o swapmem.o swapop.o swapput.o sigdata.o sigcrit.o sigunblock.o procopen.o procclose.o procrun.o procfree.o tmdate.o tmequiv.o tmfix.o tmfmt.o tmform.o tmgoff.o tminit.o tmleap.o tmlex.o tmlocale.o tmmake.o tmpoff.o tmscan.o tmsleep.o tmtime.o tmtype.o tmweek.o tmword.o tmzone.o tmxdate.o tmxfmt.o tmxgettime.o tmxleap.o tmxmake.o tmxscan.o tmxsettime.o tmxsleep.o tmxtime.o tmxtouch.o tvcmp.o tvgettime.o tvsettime.o tvsleep.o tvtouch.o vecargs.o vecfile.o vecfree.o vecload.o vecstring.o univdata.o touch.o mnt.o memccpy.o memchr.o memcmp.o memcpy.o memdup.o memmove.o memset.o mkdir.o mkfifo.o mknod.o rmdir.o remove.o rename.o link.o unlink.o strdup.o strchr.o strrchr.o strstr.o strtod.o strtold.o strtol.o strtoll.o strtoul.o strtoull.o strton.o strtonll.o strntod.o strntold.o strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o strncasecmp.o strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o execvpe.o spawnveg.o vfork.o killpg.o hsearch.o
-exec - ${AR} cr libast.a tsearch.o getlogin.o putenv.o setenv.o unsetenv.o lstat.o statvfs.o eaccess.o gross.o omitted.o readlink.o symlink.o getpgrp.o setpgid.o setsid.o waitpid.o creat64.o fcntl.o open.o atexit.o getdents.o getwd.o dup2.o errno.o getpreroot.o ispreroot.o realopen.o setpreroot.o getgroups.o mount.o system.o iblocks.o modedata.o tmdata.o memfatal.o sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o sfdcseekable.o sfdcslow.o sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o sfdcprefix.o wc.o basename.o closelog.o dirname.o fmtmsglib.o fnmatch.o ftw.o getdate.o getsubopt.o glob.o nftw.o openlog.o re_comp.o resolvepath.o realpath.o regcmp.o regexp.o setlogmask.o strftime.o strptime.o swab.o syslog.o tempnam.o wordexp.o mktime.o regalloc.o regclass.o regcoll.o regcomp.o regcache.o regdecomp.o regerror.o regexec.o regfatal.o reginit.o regnexec.o regsubcomp.o regsubexec.o regsub.o regrecord.o regrexec.o regstat.o dtclose.o dtdisc.o dtextract.o dtflatten.o dthash.o dtlist.o dtmethod.o dtnew.o dtopen.o dtrenew.o dtrestore.o dtsize.o dtstat.o
-exec - ${AR} cr libast.a dtstrhash.o dttree.o dttreeset.o dtview.o dtwalk.o sfclose.o sfclrlock.o sfdisc.o sfdlen.o sfexcept.o sfgetl.o sfgetu.o sfcvt.o sfecvt.o sffcvt.o sfextern.o sffilbuf.o sfflsbuf.o sfprints.o sfgetd.o sfgetr.o sfllen.o sfmode.o sfmove.o sfnew.o sfpkrd.o sfnotify.o sfnputc.o sfopen.o sfpeek.o sfpoll.o sfpool.o sfpopen.o sfprintf.o sfputd.o sfputl.o sfputr.o sfputu.o sfrd.o sfread.o sfreserve.o sfscanf.o sfseek.o sfset.o sfsetbuf.o sfsetfd.o sfsize.o sfsk.o sfstack.o sfstrtod.o sfsync.o sfswap.o sftable.o sftell.o sftmp.o sfungetc.o sfvprintf.o sfvscanf.o sfwr.o sfwrite.o sfpurge.o sfraise.o sfgetm.o sfmutex.o sfputm.o sfresize.o _sfclrerr.o _sfeof.o _sferror.o _sffileno.o _sfopen.o _sfstacked.o _sfvalue.o _sfgetc.o _sfgetl.o _sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o _sfllen.o _sfslen.o _sfulen.o _sfputc.o _sfputd.o _sfputl.o _sfputm.o _sfputu.o clearerr.o fclose.o fdopen.o feof.o ferror.o fflush.o fgetc.o fgetpos.o fgets.o fileno.o fopen.o fprintf.o fpurge.o fputc.o
-exec - ${AR} cr libast.a fputs.o fread.o freopen.o fscanf.o fseek.o fseeko.o fsetpos.o ftell.o ftello.o fwrite.o getc.o getchar.o getw.o pclose.o popen.o printf.o putc.o putchar.o puts.o putw.o rewind.o scanf.o setbuf.o setbuffer.o setlinebuf.o setvbuf.o snprintf.o sprintf.o sscanf.o asprintf.o vasprintf.o tmpfile.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o vsprintf.o vsscanf.o _doprnt.o _doscan.o _filbuf.o _flsbuf.o _stdfun.o _stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o _stdvbuf.o _stdvsnprnt.o _stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o putwchar.o vfwscanf.o wprintf.o fgetws.o fwscanf.o swprintf.o vswprintf.o wscanf.o fputwc.o getwc.o swscanf.o vswscanf.o fputws.o getwchar.o ungetwc.o vwprintf.o fwide.o putwc.o vfwprintf.o vwscanf.o stdio_c99.o stdio_gnu.o frexp.o frexpl.o astcopy.o astconf.o astdynamic.o astlicense.o astquery.o astwinsize.o conftab.o aststatic.o getopt.o getoptl.o vmbest.o vmclear.o vmclose.o vmdcheap.o vmdebug.o vmdisc.o vmexit.o vmlast.o vmopen.o vmpool.o vmprivate.o vmprofile.o
-exec - ${AR} cr libast.a vmregion.o vmsegment.o vmset.o vmstat.o vmstrdup.o vmtrace.o vmwalk.o vmmopen.o malloc.o vmgetmem.o a64l.o acosh.o asinh.o atanh.o cbrt.o crypt.o erf.o err.o exp.o exp__E.o expm1.o gamma.o getpass.o lgamma.o log.o log1p.o log__L.o rand48.o random.o rcmd.o rint.o support.o sfstrtmp.o spawn.o
+exec - ${AR} cr libast.a streval.o strexpr.o strmatch.o strcopy.o modei.o modex.o strmode.o strlcat.o strlcpy.o strlook.o strncopy.o strsearch.o strpsearch.o stresc.o stropt.o strtape.o tok.o tokline.o tokscan.o pathaccess.o pathcat.o pathcanon.o pathcheck.o pathpath.o pathexists.o pathfind.o pathkey.o pathprobe.o pathrepl.o pathnative.o pathposix.o pathtemp.o pathtmp.o pathstat.o pathgetlink.o pathsetlink.o pathbin.o pathshell.o pathcd.o fs3d.o ftwalk.o ftwflags.o fts.o setenviron.o optget.o optjoin.o optesc.o optctx.o strsort.o struniq.o magic.o mime.o mimetype.o signal.o systrace.o error.o errorf.o errormsg.o errorx.o localeconv.o setlocale.o translate.o catopen.o iconv.o lc.o lctab.o mc.o base64.o recfmt.o recstr.o reclen.o fmtrec.o fmtbase.o fmtbuf.o fmtclock.o fmtdev.o fmtelapsed.o fmterror.o fmtesc.o fmtfmt.o fmtfs.o fmtident.o fmtip4.o fmtls.o fmtmatch.o fmtmode.o fmtnum.o fmtperm.o fmtre.o fmttime.o fmtuid.o fmtgid.o fmtsignal.o fmtscale.o fmttmx.o fmttv.o fmtversion.o strelapsed.o strperm.o struid.o strgid.o
+exec - ${AR} cr libast.a strtoip4.o stack.o stk.o swapget.o swapmem.o swapop.o swapput.o sigdata.o sigcrit.o sigunblock.o procopen.o procclose.o procrun.o procfree.o tmdate.o tmequiv.o tmfix.o tmfmt.o tmform.o tmgoff.o tminit.o tmleap.o tmlex.o tmlocale.o tmmake.o tmpoff.o tmscan.o tmsleep.o tmtime.o tmtype.o tmweek.o tmword.o tmzone.o tmxdate.o tmxfmt.o tmxgettime.o tmxleap.o tmxmake.o tmxscan.o tmxsettime.o tmxsleep.o tmxtime.o tmxtouch.o tvcmp.o tvgettime.o tvsettime.o tvsleep.o tvtouch.o cmdarg.o vecargs.o vecfile.o vecfree.o vecload.o vecstring.o univdata.o touch.o mnt.o memccpy.o memchr.o memcmp.o memcpy.o memdup.o memmove.o memset.o mkdir.o mkfifo.o mknod.o rmdir.o remove.o rename.o link.o unlink.o strdup.o strchr.o strrchr.o strstr.o strtod.o strtold.o strtol.o strtoll.o strtoul.o strtoull.o strton.o strtonll.o strntod.o strntold.o strntol.o strntoll.o strntoul.o strntoull.o strcasecmp.o strncasecmp.o strerror.o mktemp.o tmpnam.o fsync.o execlp.o execve.o execvp.o execvpe.o spawnveg.o
+exec - ${AR} cr libast.a vfork.o killpg.o hsearch.o tsearch.o getlogin.o putenv.o setenv.o unsetenv.o lstat.o statvfs.o eaccess.o gross.o omitted.o readlink.o symlink.o getpgrp.o setpgid.o setsid.o waitpid.o creat64.o fcntl.o open.o atexit.o getdents.o getwd.o dup2.o errno.o getpreroot.o ispreroot.o realopen.o setpreroot.o getgroups.o mount.o system.o iblocks.o modedata.o tmdata.o memfatal.o sfkeyprintf.o sfdcdio.o sfdcdos.o sfdcfilter.o sfdcseekable.o sfdcslow.o sfdcsubstr.o sfdctee.o sfdcunion.o sfdcmore.o sfdcprefix.o wc.o basename.o closelog.o dirname.o fmtmsglib.o fnmatch.o ftw.o getdate.o getsubopt.o glob.o nftw.o openlog.o re_comp.o resolvepath.o realpath.o regcmp.o regexp.o setlogmask.o strftime.o strptime.o swab.o syslog.o tempnam.o wordexp.o mktime.o regalloc.o regclass.o regcoll.o regcomp.o regcache.o regdecomp.o regerror.o regexec.o regfatal.o reginit.o regnexec.o regsubcomp.o regsubexec.o regsub.o regrecord.o regrexec.o regstat.o dtclose.o dtdisc.o dtextract.o dtflatten.o dthash.o dtlist.o dtmethod.o dtnew.o dtopen.o dtrenew.o
+exec - ${AR} cr libast.a dtrestore.o dtsize.o dtstat.o dtstrhash.o dttree.o dttreeset.o dtview.o dtwalk.o sfclose.o sfclrlock.o sfdisc.o sfdlen.o sfexcept.o sfgetl.o sfgetu.o sfcvt.o sfecvt.o sffcvt.o sfextern.o sffilbuf.o sfflsbuf.o sfprints.o sfgetd.o sfgetr.o sfllen.o sfmode.o sfmove.o sfnew.o sfpkrd.o sfnotify.o sfnputc.o sfopen.o sfpeek.o sfpoll.o sfpool.o sfpopen.o sfprintf.o sfputd.o sfputl.o sfputr.o sfputu.o sfrd.o sfread.o sfreserve.o sfscanf.o sfseek.o sfset.o sfsetbuf.o sfsetfd.o sfsize.o sfsk.o sfstack.o sfstrtod.o sfsync.o sfswap.o sftable.o sftell.o sftmp.o sfungetc.o sfvprintf.o sfvscanf.o sfwr.o sfwrite.o sfpurge.o sfraise.o sfgetm.o sfmutex.o sfputm.o sfresize.o _sfclrerr.o _sfeof.o _sferror.o _sffileno.o _sfopen.o _sfstacked.o _sfvalue.o _sfgetc.o _sfgetl.o _sfgetl2.o _sfgetu.o _sfgetu2.o _sfdlen.o _sfllen.o _sfslen.o _sfulen.o _sfputc.o _sfputd.o _sfputl.o _sfputm.o _sfputu.o clearerr.o fclose.o fdopen.o feof.o ferror.o fflush.o fgetc.o fgetpos.o fgets.o fileno.o fopen.o
+exec - ${AR} cr libast.a fprintf.o fpurge.o fputc.o fputs.o fread.o freopen.o fscanf.o fseek.o fseeko.o fsetpos.o ftell.o ftello.o fwrite.o getc.o getchar.o getw.o pclose.o popen.o printf.o putc.o putchar.o puts.o putw.o rewind.o scanf.o setbuf.o setbuffer.o setlinebuf.o setvbuf.o snprintf.o sprintf.o sscanf.o asprintf.o vasprintf.o tmpfile.o ungetc.o vfprintf.o vfscanf.o vprintf.o vscanf.o vsnprintf.o vsprintf.o vsscanf.o _doprnt.o _doscan.o _filbuf.o _flsbuf.o _stdfun.o _stdopen.o _stdprintf.o _stdscanf.o _stdsprnt.o _stdvbuf.o _stdvsnprnt.o _stdvsprnt.o _stdvsscn.o fgetwc.o fwprintf.o putwchar.o vfwscanf.o wprintf.o fgetws.o fwscanf.o swprintf.o vswprintf.o wscanf.o fputwc.o getwc.o swscanf.o vswscanf.o fputws.o getwchar.o ungetwc.o vwprintf.o fwide.o putwc.o vfwprintf.o vwscanf.o stdio_c99.o stdio_gnu.o frexp.o frexpl.o astcopy.o astconf.o astdynamic.o astlicense.o astquery.o astwinsize.o conftab.o aststatic.o getopt.o getoptl.o vmbest.o vmclear.o vmclose.o vmdcheap.o vmdebug.o vmdisc.o vmexit.o vmlast.o vmopen.o
+exec - ${AR} cr libast.a vmpool.o vmprivate.o vmprofile.o vmregion.o vmsegment.o vmset.o vmstat.o vmstrdup.o vmtrace.o vmwalk.o vmmopen.o malloc.o vmgetmem.o a64l.o acosh.o asinh.o atanh.o cbrt.o crypt.o erf.o err.o exp.o exp__E.o expm1.o gamma.o getpass.o lgamma.o log.o log1p.o log__L.o rand48.o random.o rcmd.o rint.o support.o sfstrtmp.o spawn.o
 exec - (ranlib libast.a) >/dev/null 2>&1 || true
 done libast.a generated
 done ast virtual
@@ -6118,6 +6158,14 @@
 exec - else	mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/ast_std.h
 exec - fi
 done ${INSTALLROOT}/include/ast/ast_std.h generated
+make ${INSTALLROOT}/include/ast/ast_namval.h
+prev ast_namval.h
+exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o since=1985,author=gsf+dgk+kpv'  ast_namval.h  > 1.${COTEMP}.x
+exec - if	cmp 2>/dev/null -s ${INSTALLROOT}/include/ast/ast_namval.h 1.${COTEMP}.x
+exec - then	rm -f 1.${COTEMP}.x
+exec - else	mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/ast_namval.h
+exec - fi
+done ${INSTALLROOT}/include/ast/ast_namval.h generated
 make ${INSTALLROOT}/include/ast/ast_version.h
 prev include/ast_version.h
 exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o since=1985,author=gsf+dgk+kpv'  include/ast_version.h  > 1.${COTEMP}.x
@@ -6150,6 +6198,14 @@
 exec - else	mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/cdt.h
 exec - fi
 done ${INSTALLROOT}/include/ast/cdt.h generated
+make ${INSTALLROOT}/include/ast/cmdarg.h
+prev include/cmdarg.h
+exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o since=1985,author=gsf+dgk+kpv'  include/cmdarg.h  > 1.${COTEMP}.x
+exec - if	cmp 2>/dev/null -s ${INSTALLROOT}/include/ast/cmdarg.h 1.${COTEMP}.x
+exec - then	rm -f 1.${COTEMP}.x
+exec - else	mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/cmdarg.h
+exec - fi
+done ${INSTALLROOT}/include/ast/cmdarg.h generated
 make ${INSTALLROOT}/include/ast/debug.h
 prev include/debug.h
 exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o since=1985,author=gsf+dgk+kpv'  include/debug.h  > 1.${COTEMP}.x
diff -r -N -u ksh93_2007_04_18/src/lib/libast/misc/cmdarg.c ksh93_2007_05_15/src/lib/libast/misc/cmdarg.c
--- ksh93_2007_04_18/src/lib/libast/misc/cmdarg.c	1970-01-01 01:00:00.000000000 +0100
+++ ksh93_2007_05_15/src/lib/libast/misc/cmdarg.c	2007-04-24 22:04:47.000000000 +0200
@@ -0,0 +1,350 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1985-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                            *
+*                                                                      *
+*                 Glenn Fowler <gsf at research.att.com>                  *
+*                  David Korn <dgk at research.att.com>                   *
+*                   Phong Vo <kpv at research.att.com>                    *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * xargs/tw command arg list support
+ */
+
+#include <ast.h>
+#include <ctype.h>
+#include <error.h>
+#include <proc.h>
+
+#include "cmdarg.h"
+
+#ifndef EXIT_QUIT
+#define EXIT_QUIT	255
+#endif
+
+static const char*	echo[] = { "echo", 0 };
+
+/*
+ * open a cmdarg stream
+ * initialize the command for execution
+ * argv[-1] is reserved for procrun(PROC_ARGMOD)
+ */
+
+Cmdarg_t*
+cmdopen(char** argv, int argmax, int size, const char* argpat, int flags)
+{
+	register Cmdarg_t*	cmd;
+	register int		n;
+	register char**		p;
+	register char*		s;
+	char*			sh;
+	int			c;
+	int			m;
+	int			argc;
+	long			x;
+
+	char**			post = 0;
+
+	n = sizeof(char**);
+	if (*argv)
+	{
+		for (p = argv + 1; *p; p++)
+		{
+			if ((flags & CMD_POST) && argpat && streq(*p, argpat))
+			{
+				*p = 0;
+				post = p + 1;
+				argpat