On 3/30/07, Glenn Fowler <gsf at research.att.com> wrote:
>
> the AT&T Software Technology ast 2007-03-28 source and binary release
> has been posted to the download site
>         http://www.research.att.com/sw/download/
> the notes and changes link has details on the release
>
> included is the ast-ksh package which contains the latest ksh93
> source for the ksh93 solaris integration project
>
> -- Glenn Fowler -- AT&T Research, Florham Park NJ --
patch diff from 20070111 to 20070328 attached
-- 
      _        Felix Schulte
    _|_|_     mailto:felix.schulte at gmail.com
    (0 0)
ooO--(_)--Ooo
-------------- next part --------------
diff -r -N -u ksh93_2007_01_11/lib/package/ast-ksh.html 
ksh93_2007_03_28/lib/package/ast-ksh.html
--- ksh93_2007_01_11/lib/package/ast-ksh.html   2007-01-12 10:54:36.000000000 
+0100
+++ ksh93_2007_03_28/lib/package/ast-ksh.html   2007-03-29 19:07:08.000000000 
+0200
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" 
"http://www.w3.org/TR/REC-html40/loose.dtd";>
 <HTML>
 <HEAD>
-<META name="generator" content="mm2html (AT&T Labs Research) 2006-10-31">
+<META name="generator" content="mm2html (AT&T Labs Research) 2007-02-09">
 <META name="description" content="ast-ksh package">
 <META name="keywords" content="software, package">
 <TITLE> ast-ksh package </TITLE>
@@ -22,7 +22,7 @@
 <TABLE align=center border=0 bordercolor=white cellpadding=0 cellspacing=0 
frame=void rules=none width=99% >
 <TBODY>
 <TR><TD align=left>
-<A href="#ksh93">ksh93</A>&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libast&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libcmd&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libdll</TD></TR>
+<A href="#ksh93">ksh93</A>&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libast&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libcmd&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libdll&nbsp;&nbsp;</TD><TD 
align=left>&nbsp;&nbsp;libsum</TD></TR>
 </TBODY></TABLE></TD></TR></TBODY></TABLE>
 <P>
 This package is a superset of the following package: ksh; you won't need this 
if you download ast-ksh.
@@ -179,6 +179,7 @@
 <TD align=left><A href="#ksh93 changes">ksh93</A></TD>
 <TD align=left><A href="#libast changes">libast</A></TD>
 <TD align=left><A href="#libcmd changes">libcmd</A></TD>
+<TD align=left><A href="#libsum changes">libsum</A></TD>
 <TD align=left><A href="#libdll changes">libdll</A></TD>
 </TR></TABLE>
 </FONT></B>
@@ -192,6 +193,33 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="ksh93 
changes">ksh93 changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+07-03-08  --- Release ksh93s+  ---
+07-03-08  A bug in which set +o output command line options has been fixed.
+07-03-08  A bug in which an error in read (for example, an invalid variable
+         name), could leave the terminal in raw mode has been fixed.
+07-03-06  A bug in which read could core dump when specified with an array
+         variable with a subscript that is an arithmetic expression has
+         been fixed.
+07-03-06  Several serious bugs with the restricted shell were reported and
+         fixed.
+07-03-02  If a job is stopped, and subsequently restarted with a CONT
+         signal and exits normally, ksh93 was incorrectly exiting with
+         the exit status of the stop signal number.
+07-02-26  M-^L added to emacs mode to clear the screen.
+07-02-26  A bug in which setting a variable readonly in a subshell would
+         cause an unset error when the subshell completed has been fixed. 
+07-02-19  The format with printf uses the new = flag to center the output.
+07-02-19  A bug in which ksh93 did not allow multibyte characters in
+         identifier names has been fixed.
+07-02-19  A bug introduced in ksh93 that causes global compound variable
+         definitions inside functions to exit with "no parent" has been fixed.
+07-02-19  A bug in which using compound commands in process redirection
+         arguments would give syntax errors &lt;(...) and &gt;(...) has been 
fixed.
+07-01-29  A bug which caused the shell to core dump which can occur when a
+         built-in exits without closing files that it opens has been fixed.
+07-01-26  A bug in which ~(E) in patterns containing &nbsp;that are not inside 
()
+         has been fixed.
+
 06-12-29  --- Release ksh93s  ---
 06-12-29  A bug in which the value of IFS could be changed after a command
          substitution has been fixed. 
@@ -1624,6 +1652,30 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libast 
changes">libast changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+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 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
+07-02-27 comp/conf.sh: handle native getconf invalid numeric values
+07-02-21 comp/conf.sh,comp/conf.tab: handle SSIZE_MAX vs _POSIX_SSIZE_MAX
+07-02-20 sfio/sfvprintf.c: handle SF_WCWIDTH justification
+07-02-14 features/common: cover &lt;stdint.h&gt;, move to int_(bits)_t
+07-02-14 include/int.h: drop
+07-02-14 include/sfio.h: add SF_WCWIDTH
+07-02-12 comp/conf.sh: fix CONF_LIMIT bug that missed ULONG_MAX etc.
+07-02-12 comp/conf.tab: *LONGLONG* =&gt; *LLONG* to match posix
+07-02-12 features/float: *LONGLONG* =&gt; *LLONG* to match posix
+07-02-12 port/astconf.c: handle CONF_LIMITS_DEF with no deferral
+07-02-12 stdio/vasprintf.c: add trailing '&nbsp;' -- doh
+07-02-04 string/fmtelapsed.c: fix naive multi month/year logic
+07-02-02 misc/optget.c: add --??posix for getopts(1)/getopt(3)
+07-01-26 string/chresc.c: use mbchar()
+07-01-26 misc/optget.c: handle "o:-:" usage for old-style long options
+07-01-22 sfio/sfdisc.c,sfpool.c: handle push on streams with pending peek
+07-01-22 include/sfio.h: mv Sfieee_t to sfio/sfhdr.h
+07-01-17 tm/tmxfmt.c: fix terminating nil logic which clobbered size-1
 07-01-11 misc/stk.c: a 2 day marathon bug fix (can we release now dr ek?)
 07-01-05 comp/spawnveg.c: posix_spawnattr_setflags(POSIX_SPAWN_SETPGROUP)
 07-01-05 misc/error.c: fix multibyte vs. printable logic
@@ -3022,6 +3074,18 @@
 <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-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)
+07-02-24 Makefile: tweak cmdext.h action for --mam bootstrap
+07-02-09 Makefile: { cmdext.h cmdlist.h } depend on *.c list!
+07-02-09 Makefile: +lsum to bring in static -lsum (no dynamic right now)
+07-02-07 cksum.c: move from src/cmd/std with ftwalk =&gt; fts
+07-02-07 getconf.c: handle /bin == /usr/bin in defer logic
+07-01-26 chmod.c: don't FTS_FOLLOW if !FTS_PHYSICAL
+07-01-23 cut.c: Cut_t variable dimension list&#0091;&#0093; must be last member
+07-01-22 uname.c: fix -h typo that clobbered astconf() state -- ouch
 07-01-02 fmt.c: fix buffer splice off by one bug -- what else
 06-11-23 cmd.h: because of proto cmdinit cannot be a function like macro
 06-11-21 cp.c: fix 06-10-31 const dot&#0091;&#0093; readonly assignment
@@ -3230,6 +3294,20 @@
 
 </PRE>
 <P>
+<P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libsum 
changes">libsum changes</A></H3></FONT></FONT></CENTER>
+<PRE>
+
+05-02-14 sumlib.c: split into sum-*.c
+        sum-sha2.c: add SHA { 256 384 512 }
+04-02-29 Makefile: compile with $(CC.PIC) for codexlib/sum $(CC.DLL)
+03-12-16 add { crc prng } generic methods and maps&#0091;&#0093; to these 
methods
+03-12-16 sum.h,sumlib.c: add sumdata()
+03-09-29 sumlib.c: fix FNV to use ^ instead of +
+03-04-28 sumlib.c: drop md5 `zeroize' for performance
+        sumlib.c: add FIPS 180-1 SHA-1
+
+</PRE>
+<P>
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libdll 
changes">libdll changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
@@ -3280,7 +3358,7 @@
 <TR>
 <TD align=left></TD>
 <TD align=center></TD>
-<TD align=right>January 12, 2007</TD>
+<TD align=right>March 29, 2007</TD>
 </TR>
 </TABLE>
 <P>
diff -r -N -u ksh93_2007_01_11/lib/package/ast-ksh.pkg 
ksh93_2007_03_28/lib/package/ast-ksh.pkg
--- ksh93_2007_01_11/lib/package/ast-ksh.pkg    2005-02-10 10:00:52.000000000 
+0100
+++ ksh93_2007_03_28/lib/package/ast-ksh.pkg    2007-02-23 19:05:30.000000000 
+0100
@@ -1,4 +1,4 @@
-ast-ksh :PACKAGE: ksh93 libast libcmd libdll
+ast-ksh :PACKAGE: ksh93 libast libcmd libsum libdll
 
 :COVERS: ksh
 
diff -r -N -u ksh93_2007_01_11/lib/package/ast-ksh.README 
ksh93_2007_03_28/lib/package/ast-ksh.README
--- ksh93_2007_01_11/lib/package/ast-ksh.README 2007-01-12 10:54:35.000000000 
+0100
+++ ksh93_2007_03_28/lib/package/ast-ksh.README 2007-03-29 19:07:08.000000000 
+0200
@@ -92,6 +92,33 @@
 
 :::::::: ksh93 ::::::::
 
+07-03-08  --- Release ksh93s+  ---
+07-03-08  A bug in which set +o output command line options has been fixed.
+07-03-08  A bug in which an error in read (for example, an invalid variable
+         name), could leave the terminal in raw mode has been fixed.
+07-03-06  A bug in which read could core dump when specified with an array
+         variable with a subscript that is an arithmetic expression has
+         been fixed.
+07-03-06  Several serious bugs with the restricted shell were reported and
+         fixed.
+07-03-02  If a job is stopped, and subsequently restarted with a CONT
+         signal and exits normally, ksh93 was incorrectly exiting with
+         the exit status of the stop signal number.
+07-02-26  M-^L added to emacs mode to clear the screen.
+07-02-26  A bug in which setting a variable readonly in a subshell would
+         cause an unset error when the subshell completed has been fixed. 
+07-02-19  The format with printf uses the new = flag to center the output.
+07-02-19  A bug in which ksh93 did not allow multibyte characters in
+         identifier names has been fixed.
+07-02-19  A bug introduced in ksh93 that causes global compound variable
+         definitions inside functions to exit with "no parent" has been fixed.
+07-02-19  A bug in which using compound commands in process redirection
+         arguments would give syntax errors <(...) and >(...) has been fixed.
+07-01-29  A bug which caused the shell to core dump which can occur when a
+         built-in exits without closing files that it opens has been fixed.
+07-01-26  A bug in which ~(E) in patterns containing \ that are not inside ()
+         has been fixed.
+
 06-12-29  --- Release ksh93s  ---
 06-12-29  A bug in which the value of IFS could be changed after a command
          substitution has been fixed. 
@@ -1521,6 +1548,30 @@
 
 :::::::: libast ::::::::
 
+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 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
+07-02-27 comp/conf.sh: handle native getconf invalid numeric values
+07-02-21 comp/conf.sh,comp/conf.tab: handle SSIZE_MAX vs _POSIX_SSIZE_MAX
+07-02-20 sfio/sfvprintf.c: handle SF_WCWIDTH justification
+07-02-14 features/common: cover <stdint.h>, move to int_(bits)_t
+07-02-14 include/int.h: drop
+07-02-14 include/sfio.h: add SF_WCWIDTH
+07-02-12 comp/conf.sh: fix CONF_LIMIT bug that missed ULONG_MAX etc.
+07-02-12 comp/conf.tab: *LONGLONG* => *LLONG* to match posix
+07-02-12 features/float: *LONGLONG* => *LLONG* to match posix
+07-02-12 port/astconf.c: handle CONF_LIMITS_DEF with no deferral
+07-02-12 stdio/vasprintf.c: add trailing '\0' -- doh
+07-02-04 string/fmtelapsed.c: fix naive multi month/year logic
+07-02-02 misc/optget.c: add --??posix for getopts(1)/getopt(3)
+07-01-26 string/chresc.c: use mbchar()
+07-01-26 misc/optget.c: handle "o:-:" usage for old-style long options
+07-01-22 sfio/sfdisc.c,sfpool.c: handle push on streams with pending peek
+07-01-22 include/sfio.h: mv Sfieee_t to sfio/sfhdr.h
+07-01-17 tm/tmxfmt.c: fix terminating nil logic which clobbered size-1
 07-01-11 misc/stk.c: a 2 day marathon bug fix (can we release now dr ek?)
 07-01-05 comp/spawnveg.c: posix_spawnattr_setflags(POSIX_SPAWN_SETPGROUP)
 07-01-05 misc/error.c: fix multibyte vs. printable logic
@@ -2916,6 +2967,18 @@
 
 :::::::: libcmd ::::::::
 
+07-03-28 date.c: add --unelepsed=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)
+07-02-24 Makefile: tweak cmdext.h action for --mam bootstrap
+07-02-09 Makefile: { cmdext.h cmdlist.h } depend on *.c list!
+07-02-09 Makefile: +lsum to bring in static -lsum (no dynamic right now)
+07-02-07 cksum.c: move from src/cmd/std with ftwalk => fts
+07-02-07 getconf.c: handle /bin == /usr/bin in defer logic
+07-01-26 chmod.c: don't FTS_FOLLOW if !FTS_PHYSICAL
+07-01-23 cut.c: Cut_t variable dimension list[] must be last member
+07-01-22 uname.c: fix -h typo that clobbered astconf() state -- ouch
 07-01-02 fmt.c: fix buffer splice off by one bug -- what else
 06-11-23 cmd.h: because of proto cmdinit cannot be a function like macro
 06-11-21 cp.c: fix 06-10-31 const dot[] readonly assignment
@@ -3122,6 +3185,17 @@
 95-02-14 fix mkdir -p symlink bug
         fix mkdir '/' skip bug that went one too far
 
+:::::::: libsum ::::::::
+
+05-02-14 sumlib.c: split into sum-*.c
+        sum-sha2.c: add SHA { 256 384 512 }
+04-02-29 Makefile: compile with $(CC.PIC) for codexlib/sum $(CC.DLL)
+03-12-16 add { crc prng } generic methods and maps[] to these methods
+03-12-16 sum.h,sumlib.c: add sumdata()
+03-09-29 sumlib.c: fix FNV to use ^ instead of +
+03-04-28 sumlib.c: drop md5 `zeroize' for performance
+        sumlib.c: add FIPS 180-1 SHA-1
+
 :::::::: libdll ::::::::
 
 06-10-11 dllscan.c: check sfstruse() return values -- doh
diff -r -N -u ksh93_2007_01_11/lib/package/ast-ksh.ver 
ksh93_2007_03_28/lib/package/ast-ksh.ver
--- ksh93_2007_01_11/lib/package/ast-ksh.ver    2007-01-12 10:54:34.000000000 
+0100
+++ ksh93_2007_03_28/lib/package/ast-ksh.ver    2007-03-28 18:39:59.000000000 
+0200
@@ -1 +1 @@
-ast-ksh 2007-01-11 2007-01-11 1
+ast-ksh 2007-03-28 2007-03-28 1
diff -r -N -u ksh93_2007_01_11/lib/package/ksh.ver 
ksh93_2007_03_28/lib/package/ksh.ver
--- ksh93_2007_01_11/lib/package/ksh.ver        2007-01-12 10:54:33.000000000 
+0100
+++ ksh93_2007_03_28/lib/package/ksh.ver        2007-03-29 19:07:07.000000000 
+0200
@@ -1 +1 @@
-ksh 2007-01-11 2007-01-11 1
+ksh 2007-03-28 2007-03-28 1
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/bltins/cd_pwd.c 
ksh93_2007_03_28/src/cmd/ksh93/bltins/cd_pwd.c
--- ksh93_2007_01_11/src/cmd/ksh93/bltins/cd_pwd.c      2003-04-17 
17:05:14.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/bltins/cd_pwd.c      2007-02-27 
08:16:23.000000000 +0100
@@ -102,8 +102,8 @@
 #if _WINIX
        if(*dir != '/' && (dir[1]!=':'))
 #else
-#endif /* _WINIX */
        if(*dir != '/')
+#endif /* _WINIX */
        {
 #ifdef PATH_BFPATH
                if(!(cdpath = (Pathcomp_t*)shp->cdpathlist) && 
(dp=(CDPNOD)->nvalue.cp))
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/bltins/getopts.c 
ksh93_2007_03_28/src/cmd/ksh93/bltins/getopts.c
--- ksh93_2007_01_11/src/cmd/ksh93/bltins/getopts.c     2006-08-11 
19:36:23.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/bltins/getopts.c     2007-02-14 
09:17:46.000000000 +0100
@@ -175,7 +175,7 @@
        {
                Sfdouble_t d;
                d = opt_info.number;
-               nv_putval(np, (char*)&d, 
NV_INTEGER|NV_DOUBLE|NV_LONG|NV_RDONLY);
+               nv_putval(np, (char*)&d, NV_LDOUBLE|NV_RDONLY);
        }
        nv_close(np);
        sh_popcontext(&buff);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/bltins/print.c 
ksh93_2007_03_28/src/cmd/ksh93/bltins/print.c
--- ksh93_2007_01_11/src/cmd/ksh93/bltins/print.c       2006-10-13 
22:16:05.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/bltins/print.c       2007-02-14 
08:54:57.000000000 +0100
@@ -523,8 +523,8 @@
        char*           lastchar = "";
        register int    neg = 0;
        Sfdouble_t      d;
-       Sfdouble_t      longmin = LDBL_LONGLONG_MIN;
-       Sfdouble_t      longmax = LDBL_LONGLONG_MAX;
+       Sfdouble_t      longmin = LDBL_LLONG_MIN;
+       Sfdouble_t      longmax = LDBL_LLONG_MAX;
        int             format = fe->fmt;
        int             n;
        int             fold = fe->base;
@@ -599,14 +599,14 @@
                        np = 
nv_open(argp,sh.var_tree,NV_VARNAME|NV_NOASSIGN|NV_NOARRAY);
                        nv_unset(np);
                        nv_onattr(np,NV_INTEGER);
-                       if (np->nvalue.lp = new_of(long,0))
+                       if (np->nvalue.lp = new_of(int32_t,0))
                                *np->nvalue.lp = 0;
                        nv_setsize(np,10);
-                       if(sizeof(int)==sizeof(long))
+                       if(sizeof(int)==sizeof(int32_t))
                                value->ip = (int*)np->nvalue.lp;
                        else
                        {
-                               long sl = 1;
+                               int32_t sl = 1;
                                value->ip = (int*)(((char*)np->nvalue.lp) + 
(*((char*)&sl) ? 0 : sizeof(int)));
                        }
                        nv_close(np);
@@ -645,7 +645,7 @@
                case 'X':
                case 'u':
                case 'U':
-                       longmax = LDBL_ULONGLONG_MAX;
+                       longmax = LDBL_ULLONG_MAX;
                case '.':
                        if(fe->size==2 && strchr("bcsqHPRQTZ",*fe->form))
                        {
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/bltins/read.c 
ksh93_2007_03_28/src/cmd/ksh93/bltins/read.c
--- ksh93_2007_01_11/src/cmd/ksh93/bltins/read.c        2006-12-19 
20:19:01.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/bltins/read.c        2007-03-08 
23:16:47.000000000 +0100
@@ -183,36 +183,11 @@
        struct  checkpt         buff;
        if(!(iop=shp->sftable[fd]) && !(iop=sh_iostream(fd)))
                return(1);
-       if(flags>>D_FLAG)       /* delimiter not new-line or fixed size read */
-       {
-               if(flags&(N_FLAG|NN_FLAG))
-                       size = ((unsigned)flags)>>D_FLAG;
-               else
-                       delim = ((unsigned)flags)>>D_FLAG;
-               if(shp->fdstatus[fd]&IOTTY)
-                       tty_raw(fd,1);
-       }
-       if(!(flags&(N_FLAG|NN_FLAG)))
-       {
-               /* set up state table based on IFS */
-               ifs = nv_getval(np=nv_scoped(IFSNOD));
-               if((flags&R_FLAG) && shp->ifstable['\\']==S_ESC)
-                       shp->ifstable['\\'] = 0;
-               else if(!(flags&R_FLAG) && shp->ifstable['\\']==0)
-                       shp->ifstable['\\'] = S_ESC;
-               shp->ifstable[delim] = S_NL;
-               if(delim!='\n')
-               {
-                       shp->ifstable['\n'] = 0;
-                       nv_putval(np, ifs, NV_RDONLY);
-               }
-               shp->ifstable[0] = S_EOF;
-       }
        if(names && (name = *names))
        {
                if(val= strchr(name,'?'))
                        *val = 0;
-               np = nv_open(name,shp->var_tree,NV_NOASSIGN|NV_VARNAME);
+               np = 
nv_open(name,shp->var_tree,NV_NOASSIGN|NV_VARNAME|NV_ARRAY);
                if((flags&V_FLAG) && shp->ed_context)
                        ((struct edit*)shp->ed_context)->e_default = np;
                if(flags&A_FLAG)
@@ -235,6 +210,32 @@
                else
                        np = REPLYNOD;
        }
+       if(flags>>D_FLAG)       /* delimiter not new-line or fixed size read */
+       {
+               if(flags&(N_FLAG|NN_FLAG))
+                       size = ((unsigned)flags)>>D_FLAG;
+               else
+                       delim = ((unsigned)flags)>>D_FLAG;
+               if(shp->fdstatus[fd]&IOTTY)
+                       tty_raw(fd,1);
+       }
+       if(!(flags&(N_FLAG|NN_FLAG)))
+       {
+               Namval_t *mp;
+               /* set up state table based on IFS */
+               ifs = nv_getval(mp=nv_scoped(IFSNOD));
+               if((flags&R_FLAG) && shp->ifstable['\\']==S_ESC)
+                       shp->ifstable['\\'] = 0;
+               else if(!(flags&R_FLAG) && shp->ifstable['\\']==0)
+                       shp->ifstable['\\'] = S_ESC;
+               shp->ifstable[delim] = S_NL;
+               if(delim!='\n')
+               {
+                       shp->ifstable['\n'] = 0;
+                       nv_putval(mp, ifs, NV_RDONLY);
+               }
+               shp->ifstable[0] = S_EOF;
+       }
        sfclrerr(iop);
        if(np->nvfun && np->nvfun->disc->readf)
                return((* np->nvfun->disc->readf)(np,iop,delim,np->nvfun));
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/bltins/shopen.c 
ksh93_2007_03_28/src/cmd/ksh93/bltins/shopen.c
--- ksh93_2007_01_11/src/cmd/ksh93/bltins/shopen.c      2006-10-13 
05:58:32.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/bltins/shopen.c      2007-03-20 
20:08:28.000000000 +0100
@@ -17,15 +17,17 @@
 *                  David Korn <dgk at research.att.com>                   *
 *                                                                      *
 ***********************************************************************/
+#pragma prototyped
 
 static const char id[] = "\n@(#)$Id: open (AT&T Research) 1998-07-07 $\0\n";
 
-#include       <sys/stat.h>
-#include       <fcntl.h>
 #include       <shell.h>
 #include       <option.h>
 #include       <stk.h>
 #include       <tm.h>
+#ifndef SH_DICT
+#   define SH_DICT     "libshell"
+#endif
 
 /*
  * time formatting related 
@@ -52,7 +54,7 @@
        char *last;
        if(val)
        {
-               time_t t;
+               int32_t t;
                if(flag&NV_INTEGER)
                {
                        if(flag&NV_LONG)
@@ -61,9 +63,11 @@
                                t = *(double*)val;
                }
                else
+               {
                        t = tmdate(val, &last, (time_t*)0);
-               if(*last)
-                       errormsg(SH_DICT,ERROR_exit(1),"%s: invalid date/time 
string",val);
+                       if(*last)
+                               errormsg(SH_DICT,ERROR_exit(1),"%s: invalid 
date/time string",val);
+               }
                nv_putv(np,(char*)&t,NV_INTEGER,nfp);
        }
        else
@@ -121,7 +125,7 @@
 {
        if(val)
        {
-               mode_t mode;
+               int32_t mode;
                char *last;
                if(flag&NV_INTEGER)
                {
@@ -131,9 +135,11 @@
                                mode = *(double*)val;
                }
                else
+               {
                        mode = strperm(val, &last,0);
-               if(*last)
-                       errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode 
string",val);
+                       if(*last)
+                               errormsg(SH_DICT,ERROR_exit(1),"%s: invalid 
mode string",val);
+               }
                nv_putv(np,(char*)&mode,NV_INTEGER,nfp);
        }
        else
@@ -238,6 +244,7 @@
        if(!(nq=nodes[n]))
        {
                nodes[n] = nq = sh_newnode(fp,np);
+               nfp->last = "";
        }
        if(name[len]==0)
                return(nq);
@@ -328,7 +335,7 @@
        if(!outfile)
                return((char*)0);
        sfputc(out,0);
-       return((char*)out->data);
+       return((char*)out->_data);
 }
 
 static char *get_classval(Namval_t* np, Namfun_t* nfp)
@@ -359,7 +366,7 @@
        fieldcreate
 };
 
-static mkclass(Namval_t *np, Shclass_t *sp)
+static int mkclass(Namval_t *np, Shclass_t *sp)
 {
        struct dcclass *tcp = newof(NULL,struct 
dcclass,1,sp->nelem*sizeof(Namval_t*)); 
        if(!tcp)
@@ -377,29 +384,29 @@
  */
 static struct stat *Sp;
 
+struct filedata
+{
+       struct stat     statb;
+       int             fd;
+       char            *name;
+};
+
 static Shfield_t filefield[] =
 {
        { "atime", NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_atime), 
sizeof(Sp->st_atime), make_time},
        { "ctime", NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_ctime), 
sizeof(Sp->st_ctime), make_time},
        { "dev",   NV_INTEGER|NV_RDONLY, offsetof(struct 
stat,st_dev),sizeof(Sp->st_dev)},
-       { "fd",    NV_INTEGER|NV_RDONLY, sizeof(struct stat),           
sizeof(int)},
+       { "fd",    NV_INTEGER|NV_RDONLY, offsetof(struct filedata,fd),          
sizeof(int)},
        { "gid",   NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_gid), 
sizeof(Sp->st_gid)},
        { "ino",   NV_LONG|NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_ino), 
sizeof(Sp->st_ino)},
-       { "name",   NV_RDONLY, sizeof(struct stat)+sizeof(int),         -1 },
-       { "nlink", NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_nlink), 
sizeof(Sp->st_nlink)},
        { "mode",  NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_mode), 
sizeof(Sp->st_mode), make_mode},
        { "mtime", NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_mtime), 
sizeof(Sp->st_mtime), make_time},
+       { "name",   NV_RDONLY, offsetof(struct filedata,name),  -1 },
+       { "nlink", NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_nlink), 
sizeof(Sp->st_nlink)},
        { "size",  NV_LONG|NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_size), 
sizeof(Sp->st_size)},
        { "uid",   NV_INTEGER|NV_RDONLY, offsetof(struct stat,st_uid), 
sizeof(Sp->st_uid)}
 };
 
-struct filedata
-{
-       struct stat     statb;
-       int             fd;
-       char            *name;
-};
-
 static Shclass_t Fileclass =
 {
        sizeof(filefield)/sizeof(*filefield),
@@ -410,7 +417,35 @@
 
 #define letterbit(bit) (1<<((bit)-'a'))
 
-static const char sh_optopen[] = "abceirwm:[mode] var file";
+static const char sh_optopen[] =
+"[-?\n@(#)$Id: open (AT&T Labs Research) 2007-03-11 $\n]"
+"[-author?David Korn <dgk at research.att.com>]"
+"[-license?http://www.opensource.org/licenses/cpl1.0.txt]";
+"[+NAME? open - create a shell variable correspnding to a file]"
+"[+DESCRIPTION?\bopen\b creates the compound variable \avar\a correspinding "
+       "to the file given by the pathname \afile\a.  The elements of \avar\a "
+       "are the names of elements in the \astat\a structure with the \bst_\b "
+       "prefix removed.]"
+"[+?If the \b-r\b and/or \b-w\b mode is specified, then \afile\a is opened and 
"
+       "the variable \avar\a\b.fd\b is the file descriptor.]"
+"[a:append?Open for append.]"
+"[b:binary?Open in binary mode.]"
+"[c:create?Open for create.]"
+"[i:inherit?Open without the close-on-exec bit set.]"
+"[r:read?Open with read access.]"
+"[w:write?Open with write access.]"
+"[m:mode]:[mode:=rwrwrw?Open with access mode \amode\a.]"
+"[x:exclusive?Open exclusive.]"
+"\n"
+"\nvar file\n"
+"\n"
+"[+EXIT STATUS?]{"
+        "[+0?Success.]"
+        "[+>0?An error occurred.]"
+"}"
+"[+SEE ALSO?\bstat\b(2)]"
+;
+
 
 extern int b_open(int argc, char *argv[], void *extra)
 {
@@ -439,7 +474,7 @@
                oflag |= O_TEXT;
 #endif
                break;
-           case 'e':
+           case 'x':
                oflag |= O_EXCL;
                break;
            case 'c':
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/bltins/typeset.c 
ksh93_2007_03_28/src/cmd/ksh93/bltins/typeset.c
--- ksh93_2007_01_11/src/cmd/ksh93/bltins/typeset.c     2007-01-12 
01:02:47.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/bltins/typeset.c     2007-03-22 
17:19:09.000000000 +0100
@@ -45,6 +45,7 @@
 struct tdata
 {
        Shell_t         *sh;
+       Namval_t        *tp;
        Sfio_t          *outfile;
        char            *prefix;
        int             aflag;
@@ -52,7 +53,6 @@
        int             scanmask;
        Dt_t            *scanroot;
        char            **argnam;
-       Namval_t        *tp;
 };
 
 
@@ -339,9 +339,11 @@
 {
        register char *name;
        char *last = 0;
-       int 
nvflags=(flag&(NV_ARRAY|NV_NOARRAY|NV_NOSCOPE|NV_VARNAME|NV_IDENT|NV_ASSIGN));
+       int nvflags=(flag&(NV_ARRAY|NV_NOARRAY|NV_VARNAME|NV_IDENT|NV_ASSIGN));
        int r=0, ref=0;
        Shell_t *shp =tp->sh;
+       if(!sh.prefix)
+               nvflags |= NV_NOSCOPE;
        flag &= ~(NV_NOARRAY|NV_NOSCOPE|NV_VARNAME|NV_IDENT);
        if(argv[1])
        {
@@ -490,7 +492,15 @@
                        if(ref)
                        {
                                if(tp->aflag=='-')
-                                       nv_setref(np);
+                               {
+                                       Dt_t *hp=0;
+                                       if(nv_isattr(np,NV_PARAM) && 
shp->st.prevst)
+                                       {
+                                               
if(!(hp=(Dt_t*)shp->st.prevst->save_tree))
+                                                       hp = 
dtvnext(shp->var_tree);
+                                       }
+                                       nv_setref(np,hp,NV_VARNAME);
+                               }
                                else
                                        nv_unref(np);
                        }
@@ -870,10 +880,10 @@
                sfputc(file,flag);
                if(flag != '\n')
                {
-                       if(nv_isref(np) && np->nvenv)
+                       if(nv_isref(np) && nv_refsub(np))
                        {
                                sfputr(file,sh_fmtq(cp),-1);
-                               sfprintf(file,"[%s]\n", sh_fmtq(np->nvenv));
+                               sfprintf(file,"[%s]\n", sh_fmtq(nv_refsub(np)));
                        }
                        else
                                sfputr(file,sh_fmtq(cp),'\n');
@@ -921,7 +931,7 @@
        tp->outfile = file;
        if(flag&NV_INTEGER)
                tp->scanmask |= (NV_DOUBLE|NV_EXPNOTE);
-       namec = nv_scan(root,nullscan,(void*)0,tp->scanmask,flag);
+       namec = nv_scan(root,nullscan,(void*)tp,tp->scanmask,flag);
        argv = tp->argnam  = (char**)stakalloc((namec+1)*sizeof(char*));
        namec = nv_scan(root, pushname, (void*)tp, tp->scanmask, flag);
        if(mbcoll())
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/data/builtins.c 
ksh93_2007_03_28/src/cmd/ksh93/data/builtins.c
--- ksh93_2007_01_11/src/cmd/ksh93/data/builtins.c      2006-12-19 
20:16:28.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/data/builtins.c      2007-03-27 
20:07:41.000000000 +0200
@@ -21,6 +21,7 @@
 
 #include       <shell.h>
 #include       <signal.h>
+#include       "defs.h"
 #include       "shtable.h"
 #include       "ulimit.h"
 #include       "name.h"
@@ -36,13 +37,17 @@
 #   define bltin(x)    0
 #endif
 
-#if SHOPT_CMDLIB_DIR
-#   undef  SHOPT_CMDLIB_BLTIN
-#   define SHOPT_CMDLIB_BLTIN  1
-#   define BDIR                SH_CMDLIB_DIR "/"
-#else
-#   define BDIR
+#ifndef SH_CMDLIB_DIR
+#      define SH_CMDLIB_DIR    "/opt/ast/bin"
+#endif
+#if defined(SHOPT_CMDLIB_DIR) && !defined(SHOPT_CMDLIB_HDR)
+#      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),
+
+#undef basename
+#undef dirname
 
 /*
  * The order up through "[" is significant
@@ -62,6 +67,7 @@
        "test",         NV_BLTIN|BLT_ENV|NV_NOFREE,     bltin(test),
        "[",            NV_BLTIN|BLT_ENV,               bltin(test),
        "let",          NV_BLTIN|BLT_ENV,               bltin(let),
+       "export",       NV_BLTIN|BLT_SPC|BLT_DCL,       bltin(readonly),
 #if SHOPT_BASH
        "local",        NV_BLTIN|BLT_ENV|BLT_SPC|BLT_DCL,bltin(typeset),
 #endif
@@ -72,7 +78,6 @@
        "alias",        NV_BLTIN|BLT_SPC|BLT_DCL,       bltin(alias),
        "hash",         NV_BLTIN|BLT_SPC|BLT_DCL,       bltin(alias),
        "exit",         NV_BLTIN|BLT_ENV|BLT_SPC,       bltin(return),
-       "export",       NV_BLTIN|BLT_SPC|BLT_DCL,       bltin(readonly),
        "eval",         NV_BLTIN|BLT_ENV|BLT_SPC|BLT_EXIT,bltin(eval),
        "fc",           NV_BLTIN|BLT_ENV|BLT_EXIT,      bltin(hist),
        "hist",         NV_BLTIN|BLT_ENV|BLT_EXIT,      bltin(hist),
@@ -100,7 +105,7 @@
        "jobs",         NV_BLTIN|BLT_ENV,               bltin(jobs),
 #endif /* JOBS */
        "false",        NV_BLTIN|BLT_ENV,               bltin(false),
-       "/bin/getconf", NV_BLTIN|BLT_ENV,               bltin(getconf),
+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),
@@ -120,25 +125,21 @@
        "wait",         NV_BLTIN|BLT_ENV|BLT_EXIT,      bltin(wait),
        "type",         NV_BLTIN|BLT_ENV,               bltin(whence),
        "whence",       NV_BLTIN|BLT_ENV,               bltin(whence),
-#if SHOPT_CMDLIB_BLTIN
-#define Q(f)           #f      /* libpp cpp workaround -- fixed 2005-04-11 */
-#define CMDLIST(f)     BDIR Q(f), NV_BLTIN|NV_NOFREE, bltin(f),
-#include <cmdlist.h>
-#undef CMDLIST
-#undef Q
+#ifdef SHOPT_CMDLIB_HDR
+#include SHOPT_CMDLIB_HDR
 #else
-       "/bin/basename",NV_BLTIN|NV_NOFREE,             bltin(basename),
-       "/bin/chmod",   NV_BLTIN|NV_NOFREE,             bltin(chmod),
-       "/bin/dirname", NV_BLTIN|NV_NOFREE,             bltin(dirname),
-       "/bin/head",    NV_BLTIN|NV_NOFREE,             bltin(head),
-       "/bin/mkdir",   NV_BLTIN|NV_NOFREE,             bltin(mkdir),
-       "/bin/logname", NV_BLTIN|NV_NOFREE,             bltin(logname),
-       "/bin/cat",     NV_BLTIN|NV_NOFREE,             bltin(cat),
-       "/bin/cmp",     NV_BLTIN|NV_NOFREE,             bltin(cmp),
-       "/bin/cut",     NV_BLTIN|NV_NOFREE,             bltin(cut),
-       "/bin/uname",   NV_BLTIN|NV_NOFREE,             bltin(uname),
-       "/bin/wc",      NV_BLTIN|NV_NOFREE,             bltin(wc),
-       "/bin/sync",    NV_BLTIN|NV_NOFREE,             bltin(sync),
+       CMDLIST(basename)
+       CMDLIST(chmod)
+       CMDLIST(dirname)
+       CMDLIST(head)
+       CMDLIST(mkdir)
+       CMDLIST(logname)
+       CMDLIST(cat)
+       CMDLIST(cmp)
+       CMDLIST(cut)
+       CMDLIST(uname)
+       CMDLIST(wc)
+       CMDLIST(sync)
 #endif
        "",             0, 0 
 };
@@ -1170,6 +1171,9 @@
                "the collating element \aname\a.]"
        "[+-?The escape sequence \b\\x{\b\ahex\a\b}\b expands to the "
                "character corresponding to the hexidecimal value \ahex\a.]"
+       "[+-?The format modifier flag \b=\b can be used to center a field to "
+               "a specified width.  When the output is a terminal, the "
+               "character width is used rather than the number of bytes.]"
        "[+-?Each of the integral format specifiers can have a third "
                "modifier after width and precision that specifies the "
                "base of the conversion from 2 to 64.  In this case the "
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/edit/emacs.c 
ksh93_2007_03_28/src/cmd/ksh93/edit/emacs.c
--- ksh93_2007_01_11/src/cmd/ksh93/edit/emacs.c 2006-11-29 23:12:00.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/edit/emacs.c 2007-02-27 02:53:00.000000000 
+0100
@@ -63,6 +63,7 @@
 
 #include       <ast.h>
 #include       <ctype.h>
+#include       "FEATURE/cmds"
 #if KSHELL
 #   include    "defs.h"
 #endif /* KSHELL */
@@ -989,6 +990,12 @@
                        draw(ep,UPDATE);
                        return(-1);
 
+#ifdef _cmd_tput
+               case cntl('L'): /* clear screen */
+                       sh_trap("tput clear", 0);
+                       draw(ep,REFRESH);
+                       return(-1);
+#endif
                case '[':       /* feature not in book */
                        switch(i=ed_getchar(ep->ed,1))
                        {
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/features/math.sh 
ksh93_2007_03_28/src/cmd/ksh93/features/math.sh
--- ksh93_2007_01_11/src/cmd/ksh93/features/math.sh     2007-01-04 
23:03:11.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/features/math.sh     2007-02-06 
20:17:30.000000000 +0100
@@ -20,7 +20,7 @@
 : generate the ksh math builtin table
 : include math.tab
 
-# @(#)math.sh (AT&T Research) 2007-01-04
+# @(#)math.sh (AT&T Research) 2007-02-02
 
 command=$0
 iffeflags="-n -v -F ast_standards.h"
@@ -51,23 +51,19 @@
 
 eval `iffe $iffeflags -c "$cc" - typ long.double : lib $tests $iffehdrs 
$iffelibs 2>&$stderr`
 lib=
-mac=
 for name in $names
 do     eval x='$'_lib_${name}l y='$'_lib_${name}
        case $x in
        1)      lib="$lib,${name}l" ;;
-       '')     mac="$mac,${name}l" ;;
        esac
        case $y in
        1)      case $x in
                '')     lib="$lib,${name}" ;;
                esac
                ;;
-       '')     mac="$mac,${name}" ;;
        esac
 done
-eval `iffe $iffeflags -c "$cc" - dat,npt $lib $iffehdrs $iffelibs 2>&$stderr`
-eval `iffe $iffeflags -c "$cc" - mac $mac $iffehdrs 2>&$stderr`
+eval `iffe $iffeflags -c "$cc" - dat,npt,mac $lib $iffehdrs $iffelibs 
2>&$stderr`
 
 cat <<!
 #pragma prototyped
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/features/poll 
ksh93_2007_03_28/src/cmd/ksh93/features/poll
--- ksh93_2007_01_11/src/cmd/ksh93/features/poll        2006-12-10 
10:27:00.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/features/poll        2007-03-20 
22:33:33.000000000 +0100
@@ -60,6 +60,7 @@
 }end
 tst    socketpair_devfd note{ /dev/fd/N handles socketpair() }end execute{
        #include <ast.h>
+       #include <fs3d.h>
        #include <sys/types.h>
        #include <sys/socket.h>
        int main()
@@ -67,6 +68,7 @@
                int             devfd;
                int             n;
                int             sfd[2];
+               fs3d(FS3D_OFF);
                close(0);
                open("/dev/null", O_RDONLY);
                if ((n = open("/dev/fd/0", O_RDONLY)) < 0)
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/builtins.h 
ksh93_2007_03_28/src/cmd/ksh93/include/builtins.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/builtins.h   2004-01-14 
21:33:18.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/builtins.h   2007-03-27 
20:09:44.000000000 +0200
@@ -38,8 +38,9 @@
 #define SYSTEST                (sh.bltin_cmds+10)
 #define SYSBRACKET     (sh.bltin_cmds+11)
 #define SYSLET         (sh.bltin_cmds+12)
+#define SYSEXPORT      (sh.bltin_cmds+13)
 #if SHOPT_BASH
-#   define SYSLOCAL    (sh.bltin_cmds+13)
+#   define SYSLOCAL    (sh.bltin_cmds+14)
 #else
 #   define SYSLOCAL    0
 #endif
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/defs.h 
ksh93_2007_03_28/src/cmd/ksh93/include/defs.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/defs.h       2007-01-12 
00:43:17.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/defs.h       2007-03-27 
20:14:45.000000000 +0200
@@ -69,9 +69,9 @@
        int             execbrk;
        int             loopcnt;
        int             firstline;
-       long            optindex;
-       long            optnum;
-       long            tmout;          /* value for TMOUT */ 
+       int32_t         optindex;
+       int32_t         optnum;
+       int32_t         tmout;          /* value for TMOUT */ 
        short           optchar;
        short           opterror;
        int             ioset;
@@ -133,7 +133,7 @@
        pid_t           pid;            /* process id of shell */ \
        pid_t           bckpid;         /* background process id */ \
        pid_t           cpid; \
-       long            ppid;           /* parent process id of shell */ \
+       int32_t         ppid;           /* parent process id of shell */ \
        int             topfd; \
        int             sigmax;         /* maximum number of signals */ \
        int             savesig; \
@@ -192,6 +192,7 @@
        void            *jmpbuffer; \
        void            *mktype; \
        Sfio_t          *strbuf; \
+       Dt_t            *last_root; \
        char            ifstable[256]; \
        Shopt_t         offoptions;
 
@@ -209,6 +210,10 @@
 #define SH_DICT                (void*)e_dict
 #endif
 
+#ifndef SH_CMDLIB_DIR
+#define SH_CMDLIB_DIR  "/opt/ast/bin"
+#endif
+
 /* states */
 /* low numbered states are same as options */
 #define SH_NOFORK      0       /* set when fork not necessary, not a state */
@@ -356,11 +361,11 @@
 #define        sh_onstate(x)   (sh.st.states |= sh_state(x))
 #define        sh_offstate(x)  (sh.st.states &= ~sh_state(x))
 #define        sh_getstate()   (sh.st.states)
-#define        sh_setstate(x)  (sh.st.states = x)
+#define        sh_setstate(x)  (sh.st.states = (x))
 
 #define sh_sigcheck() do{if(sh.trapnote&SH_SIGSET)sh_exit(SH_EXITSIG);} 
while(0)
 
-extern time_t          sh_mailchk;
+extern int32_t         sh_mailchk;
 extern const char      e_dict[];
 
 /* sh_printopts() mode flags -- set --[no]option by default */
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/edit.h 
ksh93_2007_03_28/src/cmd/ksh93/include/edit.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/edit.h       2006-12-19 
15:41:39.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/edit.h       2007-02-14 
08:56:39.000000000 +0100
@@ -129,7 +129,7 @@
        char    e_inmacro;      /* processing macro expansion */
 #if KSHELL
        char    e_vi_insert[2]; /* for sh_keytrap */
-       long    e_col;          /* for sh_keytrap */
+       int32_t e_col;          /* for sh_keytrap */
 #else
        char    e_prbuff[PRSIZE]; /* prompt buffer */
 #endif /* KSHELL */
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/fault.h 
ksh93_2007_03_28/src/cmd/ksh93/include/fault.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/fault.h      2003-12-19 
17:05:05.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/fault.h      2007-03-22 
20:54:19.000000000 +0100
@@ -94,7 +94,7 @@
        int             mode;
        struct openlist *olist;
 #if (ERROR_VERSION >= 20030214L)
-       struct Error_context_s err;
+       Error_context_t err;
 #else
        struct errorcontext err;
 #endif
@@ -103,7 +103,7 @@
 #define sh_pushcontext(bp,n)   ( (bp)->mode=(n) , (bp)->olist=0,  \
                                  (bp)->topfd=sh.topfd, (bp)->prev=sh.jmplist, \
                                  (bp)->err = *ERROR_CONTEXT_BASE, \
-                                       sh.jmplist = (sigjmp_buf*)(bp) \
+                                       sh.jmplist = (sigjmp_buf*)(&(bp)->buff) 
\
                                )
 #define sh_popcontext(bp)      (sh.jmplist=(bp)->prev, errorpop(&((bp)->err)))
 
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/fcin.h 
ksh93_2007_03_28/src/cmd/ksh93/include/fcin.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/fcin.h       2003-02-26 
04:29:14.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/fcin.h       2007-03-23 
09:14:01.000000000 +0100
@@ -37,6 +37,7 @@
        unsigned char   *fcptr;         /* pointer to next input char */
        unsigned char   fcchar;         /* saved character */
        void (*fcfun)(Sfio_t*,const char*,int); /* advance function */
+       int             fcleft;         /* for multibyte boundary */
        Sfoff_t         fcoff;          /* offset for last read */
 } Fcin_t;
 
@@ -54,6 +55,7 @@
 extern int             fcfopen(Sfio_t*);
 extern int             fcclose(void);
 void                   fcnotify(void(*)(Sfio_t*,const char*,int));
+extern int             fcmbstate(const char*,int*,int*);
 
 extern Fcin_t          _Fcin;          /* used by macros */
 
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/history.h 
ksh93_2007_03_28/src/cmd/ksh93/include/history.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/history.h    2003-03-21 
18:35:49.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/history.h    2007-02-15 
11:00:45.000000000 +0100
@@ -26,7 +26,6 @@
  */
 
 #include       <ast.h>
-#include       <sfio.h>
 
 #define HIST_CHAR      '!'
 #define HIST_VERSION   1               /* history file format version no. */
@@ -36,7 +35,7 @@
        Sfdisc_t        histdisc;       /* discipline for history */
        Sfio_t          *histfp;        /* history file stream pointer */
        char            *histname;      /* name of history file */
-       long            histind;        /* current command number index */
+       int32_t         histind;        /* current command number index */
        int             histsize;       /* number of accessible history lines */
 #ifdef _HIST_PRIVATE
        _HIST_PRIVATE
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/io.h 
ksh93_2007_03_28/src/cmd/ksh93/include/io.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/io.h 2005-11-23 16:53:38.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/io.h 2007-03-05 15:26:03.000000000 
+0100
@@ -75,7 +75,6 @@
    __EXPORT__
 #endif
 extern Sfio_t  *sh_iostream(int);
-struct ionod;
 extern int     sh_redirect(struct ionod*,int);
 extern void    sh_iosave(int,int);
 extern void    sh_iounsave(void);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/lexstates.h 
ksh93_2007_03_28/src/cmd/ksh93/include/lexstates.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/lexstates.h  2007-01-05 
23:23:56.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/lexstates.h  2007-03-14 
17:01:46.000000000 +0100
@@ -79,6 +79,8 @@
 #define ST_QNEST       10
 #define ST_NONE                11
 
+#include "FEATURE/locale"
+
 #if _hdr_wchar
 #   include <wchar.h>
 #   if _hdr_wctype
@@ -102,13 +104,19 @@
 #   define isblank(x)      ((x)==' '||(x)=='\t')
 #endif
 
+#undef LEN
 #if SHOPT_MULTIBYTE
+    static int NXT, LEN;
 #   define isaname(c)  ((c)>0xff?isalpha(c): sh_lexstates[ST_NAME][(c)]==0)
 #   define isaletter(c)        ((c)>0xff?isalpha(c): 
sh_lexstates[ST_DOL][(c)]==S_ALP && (c)!='.')
 #else
+#   undef mbwide
+#   define mbwide()    (0)
+#   define LEN         1
 #   define isaname(c)  (sh_lexstates[ST_NAME][c]==0)
 #   define isaletter(c)        (sh_lexstates[ST_DOL][c]==S_ALP && (c)!='.')
 #endif
+#define STATE(s,c)     (mbwide()?(c=fcmbstate(s,&NXT,&LEN),NXT):s[c=fcget()])
 #define isadigit(c)    (sh_lexstates[ST_DOL][c]==S_DIG)
 #define isastchar(c)   ((c)=='@' || (c)=='*')
 #define isexp(c)       (sh_lexstates[ST_MACRO][c]==S_PAT||(c)=='$'||(c)=='`')
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/name.h 
ksh93_2007_03_28/src/cmd/ksh93/include/name.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/name.h       2006-11-13 
22:07:05.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/name.h       2007-03-05 
14:52:11.000000000 +0100
@@ -35,22 +35,23 @@
 /* Nodes can have all kinds of values */
 union Value
 {
-       const char      *cp;
-       int             *ip;
-       char            c;
-       int             i;
-       unsigned        u;
-       long            *lp;
-       Sflong_t        *llp;   /* for long long arithmetic */
-       short           s;
-       double          *dp;    /* for floating point arithmetic */
-       Sfdouble_t      *ldp;   /* for long floating point arithmetic */
-       struct Namarray *array; /* for array node */
-       struct Namval   *np;    /* for Namval_t node */
-       union Value     *up;    /* for indirect node */
-       struct Ufunction *rp;   /* shell user defined functions */
-       struct Namfun   *funp;  /* discipline pointer */
-       int (*bfp)(int,char*[],void*);/* builtin entry point function pointer */
+       const char              *cp;
+       int                     *ip;
+       char                    c;
+       int                     i;
+       unsigned int            u;
+       int32_t                 *lp;
+       Sflong_t                *llp;   /* for long long arithmetic */
+       int16_t                 s;
+       double                  *dp;    /* for floating point arithmetic */
+       Sfdouble_t              *ldp;   /* for long floating point arithmetic */
+       struct Namarray         *array; /* for array node */
+       struct Namval           *np;    /* for Namval_t node */
+       union Value             *up;    /* for indirect node */
+       struct Ufunction        *rp;    /* shell user defined functions */
+       struct Namfun           *funp;  /* discipline pointer */
+       struct Namref           *nrp;   /* name reference */
+       int                     (*bfp)(int,char*[],void*);/* builtin entry 
point function pointer */
 };
 
 #include       "nval.h"
@@ -74,6 +75,14 @@
 #define ARRAY_DELETE   2
 
 
+struct Namref
+{
+       Namval_t        *np;
+       Namval_t        *table;
+       Dt_t            *root;
+       char            *sub;
+};
+
 /* This describes a user shell function node */
 struct Ufunction
 {
@@ -84,6 +93,10 @@
        char    *fname;                 /* file name where function defined */
 };
 
+#ifndef ARG_RAW
+    struct argnod;
+#endif /* !ARG_RAW */
+
 /* attributes of Namval_t items */
 
 /* The following attributes are for internal use */
@@ -120,8 +133,11 @@
 
 #define nv_setattr(n,f)        ((n)->nvflag = (f))
 #define nv_context(n)  ((void*)(n)->nvfun)             /* for builtins */
-#define nv_table(n)    ((Namval_t*)((n)->nvfun))       /* for references */
-#define nv_refnode(n)  ((Namval_t*)((n)->nvalue.np))   /* for references */
+/* The following are for name references */
+#define nv_refnode(n)  ((n)->nvalue.nrp->np)
+#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 */
@@ -141,7 +157,6 @@
 extern int             array_maxindex(Namval_t*);
 extern char            *nv_endsubscript(Namval_t*, char*, int);
 extern Namfun_t        *nv_cover(Namval_t*);
-struct argnod;         /* struct not declared yet */
 extern Namarr_t        *nv_arrayptr(Namval_t*);
 extern int             nv_setnotify(Namval_t*,char **);
 extern int             nv_unsetnotify(Namval_t*,char **);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/nval.h 
ksh93_2007_03_28/src/cmd/ksh93/include/nval.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/nval.h       2006-09-08 
05:18:52.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/include/nval.h       2007-03-21 
16:37:54.000000000 +0100
@@ -46,6 +46,7 @@
 typedef struct Namarray Namarr_t;
 typedef struct Nambltin Nambltin_t;
 typedef struct Namtype Namtype_t;
+
 /*
  * This defines the template for nodes that have their own assignment
  * and or lookup functions
@@ -188,6 +189,16 @@
 
 #define NV_PUBLIC      (~(NV_NOSCOPE|NV_ASSIGN|NV_IDENT|NV_VARNAME|NV_NOADD))
 
+/* numeric types */
+#define NV_INT16       (NV_SHORT|NV_INTEGER)
+#define NV_UINT16      (NV_UNSIGN|NV_SHORT|NV_INTEGER)
+#define NV_INT32       (NV_INTEGER)
+#define NV_UNT32       (NV_UNSIGN|NV_INTEGER)
+#define NV_INT64       (NV_LONG|NV_INTEGER)
+#define NV_UINT64      (NV_UNSIGN|NV_LONG|NV_INTEGER)
+#define NV_FLOAT       (NV_SHORT|NV_DOUBLE|NV_INTEGER)
+#define NV_LDOUBLE     (NV_LONG|NV_DOUBLE|NV_INTEGER)
+
 /* name-value pair macros */
 #define nv_isattr(np,f)                ((np)->nvflag & (f))
 #define nv_onattr(n,f)         ((n)->nvflag |= (f))
@@ -243,8 +254,8 @@
 extern void            *nv_context(Namval_t*);
 extern Namval_t                *nv_create(const char*, Dt_t*, int,Namfun_t*);
 extern Dt_t            *nv_dict(Namval_t*);
-extern Sfdouble_t      nv_getn(Namval_t*, Namfun_t*);
-extern Sfdouble_t      nv_getnum(Namval_t*);
+extern Sfdouble_t      nv_getn(Namval_t*, Namfun_t*);
+extern Sfdouble_t      nv_getnum(Namval_t*);
 extern char            *nv_getv(Namval_t*, Namfun_t*);
 extern char            *nv_getval(Namval_t*);
 extern Namfun_t                *nv_hasdisc(Namval_t*, const Namdisc_t*);
@@ -257,7 +268,7 @@
 extern int             nv_scan(Dt_t*,void(*)(Namval_t*,void*),void*,int,int);
 extern Namval_t                *nv_scoped(Namval_t*);
 extern char            *nv_setdisc(Namval_t*,const char*,Namval_t*,Namfun_t*);
-extern void            nv_setref(Namval_t*);
+extern void            nv_setref(Namval_t*, Dt_t*,int);
 extern int             nv_settype(Namval_t*, Namval_t*, int);
 extern void            nv_setvec(Namval_t*,int,int,char*[]);
 extern void            nv_setvtree(Namval_t*);
@@ -267,6 +278,7 @@
 extern Namval_t                *nv_search(const char *, Dt_t*, int);
 extern void            nv_unscope(void);
 extern char            *nv_name(Namval_t*);
+extern Namval_t                *nv_type(Namval_t*);
 extern const Namdisc_t *nv_discfun(int);
 
 #ifdef _DLL
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/streval.h 
ksh93_2007_03_28/src/cmd/ksh93/include/streval.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/streval.h    2006-10-13 
17:44:24.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/include/streval.h    2007-02-12 
17:55:26.000000000 +0100
@@ -33,34 +33,34 @@
 #endif
 
 #if _ast_fltmax_double
-#define LDBL_LONGLONG_MAX      DBL_LONGLONG_MAX
-#define LDBL_ULONGLONG_MAX     DBL_ULONGLONG_MAX
-#define LDBL_LONGLONG_MIN      DBL_LONGLONG_MIN
+#define LDBL_LLONG_MAX         DBL_LLONG_MAX
+#define LDBL_ULLONG_MAX                DBL_ULLONG_MAX
+#define LDBL_LLONG_MIN         DBL_LLONG_MIN
 #endif
 
-#ifndef LDBL_LONGLONG_MAX
+#ifndef LDBL_LLONG_MAX
 #   ifdef LLONG_MAX
-#      define LDBL_LONGLONG_MAX        ((Sfdouble_t)LLONG_MAX)
+#      define LDBL_LLONG_MAX   ((Sfdouble_t)LLONG_MAX)
 #   else
-#      ifdef LONGLONG_MAX
-#         define LDBL_LONGLONG_MAX     ((Sfdouble_t)LONGLONG_MAX)
+#      ifdef LLONG_MAX
+#         define LDBL_LLONG_MAX        ((Sfdouble_t)LLONG_MAX)
 #      else
-#         define LDBL_LONGLONG_MAX     ((Sfdouble_t)((((Sflong_t)1) << 
(8*sizeof(Sflong_t)-1)) -1 ))
+#         define LDBL_LLONG_MAX        ((Sfdouble_t)((((Sflong_t)1) << 
(8*sizeof(Sflong_t)-1)) -1 ))
 #      endif
 #   endif
 #endif
-#ifndef LDBL_ULONGLONG_MAX
+#ifndef LDBL_ULLONG_MAX
 #   ifdef ULLONG_MAX
-#      define LDBL_ULONGLONG_MAX       ((Sfdouble_t)ULLONG_MAX)
+#      define LDBL_ULLONG_MAX          ((Sfdouble_t)ULLONG_MAX)
 #   else
-#      define LDBL_ULONGLONG_MAX       (2.*((Sfdouble_t)LDBL_LONGLONG_MAX))
+#      define LDBL_ULLONG_MAX          (2.*((Sfdouble_t)LDBL_LLONG_MAX))
 #   endif
 #endif
-#ifndef LDBL_LONGLONG_MIN
+#ifndef LDBL_LLONG_MIN
 #   ifdef LLONG_MIN
-#      define LDBL_LONGLONG_MIN        ((Sfdouble_t)LLONG_MIN)
+#      define LDBL_LLONG_MIN           ((Sfdouble_t)LLONG_MIN)
 #   else
-#      define LDBL_LONGLONG_MIN        (-LDBL_LONGLONG_MAX)
+#      define LDBL_LLONG_MIN           (-LDBL_LLONG_MAX)
 #   endif
 #endif
 #ifndef LDBL_DIG
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/include/version.h 
ksh93_2007_03_28/src/cmd/ksh93/include/version.h
--- ksh93_2007_01_11/src/cmd/ksh93/include/version.h    2006-11-17 
19:46:51.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/include/version.h    2007-03-06 
18:35:34.000000000 +0100
@@ -17,4 +17,4 @@
 *                  David Korn <dgk at research.att.com>                   *
 *                                                                      *
 ***********************************************************************/
-#define SH_RELEASE     "1993-12-28 s"
+#define SH_RELEASE     "1993-12-28 s+"
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/Makefile 
ksh93_2007_03_28/src/cmd/ksh93/Makefile
--- ksh93_2007_01_11/src/cmd/ksh93/Makefile     2006-10-18 20:20:32.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/Makefile     2007-03-25 05:47:28.000000000 
+0200
@@ -6,6 +6,7 @@
 VERSION = 1.1
 LICENSE = since=1982,author=dgk
 CATALOG = libshell
+ERROR_CONTEXT_T == Error_context_t /* workaround until switch from 
errorpush()/errorpop() => errorctx() */
 
 /*
  * set these variables to 1 to enable, 0 to disable, null to probe
@@ -16,8 +17,8 @@
 SHOPT_ACCTFILE ==              /* per user accounting info */
 SHOPT_BASH ==                  /* bash compatibility code */
 SHOPT_BRACEPAT == 1            /* C-shell {...,...} expansions (, required) */
-SHOPT_CMDLIB_BLTIN == 0                /* all -lcmd commands builtin */
-SHOPT_CMDLIB_DIR ==            /* SHOPT_CMDLIB_BLTIN prefix SH_CMDLIB_DIR */
+SHOPT_CMDLIB_HDR ==            /* -lcmd builtin list: <cmdlist.h> */
+SHOPT_CMDLIB_DIR ==            /* SHOPT_CMDLIB_HDR prefix SH_CMDLIB_DIR + 
<cmdlist.h> */
 SHOPT_CRNL ==                  /* accept <cr><nl> for <nl> */
 SHOPT_DYNAMIC == 1             /* dynamic loading for builtins */
 SHOPT_ECHOPRINT ==             /* make echo equivalent to print */
@@ -76,7 +77,7 @@
 
 KSHELL == 1                    /* this is ksh */
 
-SH_CMDLIB_DIR == "/opt/ast/bin"        /* SHOPT_CMDLIB_DIR dir prefix */
+SH_CMDLIB_DIR ==               /* SHOPT_CMDLIB_DIR dir prefix */
 SH_DICT ==                     /* message catalog */
 DEBUG ==                       /* debugging purposes only */
 
@@ -96,18 +97,18 @@
        LDFLAGS  += $(CC.LD.LAZY) $(CC.LD.NORECORD)
 end
 
-if ! "$(-mam:N=static*)"
-       if CC.HOSTTYPE == "sol([789]|[1-9][0-9]).*"
-               LIBS_opt += +lsocket -lnsl
-       elif CC.HOSTTYPE != "sgi.mips*"
-               LIBS_opt += +lsocket +lnsl
-       end
+if "$(-mam:N=static*)"
+       LIBS_opt += -lsocket -lnsl
+elif CC.HOSTTYPE == "sol?([789]|[1-9][0-9]).*"
+       LIBS_opt += +lsocket -lnsl
+elif CC.HOSTTYPE != "sgi.mips*"
+       LIBS_opt += +lsocket +lnsl
 end
 if CC.HOSTTYPE == "linux.sparc"
        /* the linux.sparc linker still has some problems */
        LIBS_opt += -ldll
 end
-LIBS_opt += -lsecdb +lintl -ldl
+LIBS_opt += -lsecdb -ldl
 if CC.HOSTTYPE == "sol.*"
        LIBS_opt += +lw
 end
@@ -184,8 +185,9 @@
        echo ";" >> $(<)
 end
 
-:: math.tab syscall.s mamexec mamstate.c deparse.c shopen.c $(DOCFILES) \
-       bash.c bash_pre_rc.sh hexpand.c mkservice.c
+:: math.tab syscall.s mamexec mamstate.c deparse.c $(DOCFILES) \
+       bash.c bash_pre_rc.sh hexpand.c mkservice.c \
+       shopen.mk shopen.c
 
 :: shtests \
        alias.sh append.sh arith.sh arrays.sh attributes.sh basic.sh \
@@ -222,8 +224,9 @@
        mkdir $tmp
        for i in *.sh
        do      tst=$tmp/shcomp-${i%.sh}.ksh
-               shcomp $i > $tst
-               SHELL=$(*:O=1:P=A) $(*:O=1:P=A) $(*:O=3:B) $tst
+               if      $(*:O=4) $i > $tst
+               then    SHELL=$(*:O=1:P=A) $(*:O=1:P=A) $(*:O=3:B) $tst
+               fi
                rm -f $tst
        done
        rm -rf $tmp
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/Mamfile 
ksh93_2007_03_28/src/cmd/ksh93/Mamfile
--- ksh93_2007_01_11/src/cmd/ksh93/Mamfile      2007-01-12 10:54:39.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/Mamfile      2007-03-29 19:07:09.000000000 
+0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-01-11
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
@@ -140,7 +140,7 @@
 done sh/pmain.c
 meta pmain.o %.c>%.o sh/pmain.c pmain
 prev sh/pmain.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_DYNAMIC -D_BLD_shell -D_PACKAGE_ast -c sh/pmain.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_DYNAMIC -D_BLD_shell -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t 
-c sh/pmain.c
 done pmain.o generated
 make libshell.a archive
 make shell.req
@@ -152,7 +152,7 @@
 exec - case "" in
 exec - *?)     echo " " ;;
 exec - esac
-exec - for i in shell dll cmd ast m jobs i secdb intl dl
+exec - for i in shell dll cmd ast m jobs i socket nsl secdb dl
 exec - do      case $i in
 exec -         "shell"|shell)
 exec -                 ;;
@@ -187,11 +187,12 @@
 done +ljobs dontcare virtual
 make +li
 done +li dontcare virtual
+make ${mam_libsocket}
+done ${mam_libsocket} dontcare virtual
+bind -lnsl dontcare
 make ${mam_libsecdb}
 done ${mam_libsecdb} dontcare virtual
-make +lintl
-done +lintl dontcare virtual
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/time
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/time
 make ${PACKAGE_ast_INCLUDE}/times.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_time.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_time.h dontcare
@@ -208,9 +209,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/dynamic
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/dynamic
 make ${PACKAGE_ast_INCLUDE}/fs3d.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_fs.h implicit
 prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
@@ -223,9 +224,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/options
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/options
 done FEATURE/options dontcare generated
 prev ${PACKAGE_ast_INCLUDE}/option.h implicit
 done include/builtins.h
@@ -246,9 +247,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/sigfeatures
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/sigfeatures
 done FEATURE/sigfeatures dontcare generated
 make FEATURE/setjmp implicit
 meta FEATURE/setjmp features/%>FEATURE/% features/setjmp setjmp
@@ -257,9 +258,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/setjmp
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/setjmp
 done FEATURE/setjmp dontcare generated
 prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit
 prev ${PACKAGE_ast_INCLUDE}/error.h implicit
@@ -267,7 +268,6 @@
 done ${PACKAGE_ast_INCLUDE}/sig.h dontcare
 done include/fault.h
 make include/history.h implicit
-prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done include/history.h
 prev ${PACKAGE_ast_INCLUDE}/cdt.h implicit
@@ -279,7 +279,7 @@
 done bltins/alarm.c
 meta alarm.o %.c>%.o bltins/alarm.c alarm
 prev bltins/alarm.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/alarm.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c bltins/alarm.c
 done alarm.o generated
 make cd_pwd.o
 make bltins/cd_pwd.c
@@ -299,9 +299,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : def acct
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : def acct
 done FEATURE/acct dontcare generated
 prev include/nval.h implicit
 prev FEATURE/options implicit
@@ -317,7 +317,7 @@
 done bltins/cd_pwd.c
 meta cd_pwd.o %.c>%.o bltins/cd_pwd.c cd_pwd
 prev bltins/cd_pwd.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c 
bltins/cd_pwd.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/cd_pwd.c
 done cd_pwd.o generated
 make cflow.o
 make bltins/cflow.c
@@ -332,7 +332,7 @@
 done bltins/cflow.c
 meta cflow.o %.c>%.o bltins/cflow.c cflow
 prev bltins/cflow.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/cflow.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c bltins/cflow.c
 done cflow.o generated
 make deparse.o
 make sh/deparse.c
@@ -345,7 +345,7 @@
 done sh/deparse.c
 meta deparse.o %.c>%.o sh/deparse.c deparse
 prev sh/deparse.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA -D_BLD_shell 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/deparse.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA -D_BLD_shell 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t 
-DSHOPT_ESH -c sh/deparse.c
 done deparse.o generated
 make getopts.o
 make bltins/getopts.c
@@ -357,7 +357,7 @@
 done bltins/getopts.c
 meta getopts.o %.c>%.o bltins/getopts.c getopts
 prev bltins/getopts.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/getopts.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c bltins/getopts.c
 done getopts.o generated
 make hist.o
 make bltins/hist.c
@@ -372,9 +372,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/ttys
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/ttys
 done FEATURE/ttys dontcare generated
 done include/terminal.h dontcare
 prev FEATURE/setjmp implicit
@@ -386,9 +386,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/locale
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/locale
 done FEATURE/locale dontcare generated
 prev FEATURE/options implicit
 done include/edit.h dontcare
@@ -407,7 +407,7 @@
 done bltins/hist.c
 meta hist.o %.c>%.o bltins/hist.c hist
 prev bltins/hist.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC -c bltins/hist.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DERROR_CONTEXT_T=Error_context_t 
-DSHOPT_DYNAMIC -c bltins/hist.c
 done hist.o generated
 make misc.o
 make bltins/misc.c
@@ -428,7 +428,7 @@
 done bltins/misc.c
 meta misc.o %.c>%.o bltins/misc.c misc
 prev bltins/misc.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_ESH -DKSHELL 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_KIA -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -c bltins/misc.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_ESH -DKSHELL 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_KIA -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -c bltins/misc.c
 done misc.o generated
 make print.o
 make bltins/print.c
@@ -466,7 +466,7 @@
 done bltins/print.c
 meta print.o %.c>%.o bltins/print.c print
 prev bltins/print.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell -DSHOPT_PFSH -DSHOPT_ESH -DKSHELL 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -c bltins/print.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell -DSHOPT_PFSH -DSHOPT_ESH -DKSHELL 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -c 
bltins/print.c
 done print.o generated
 make read.o
 make bltins/read.c
@@ -490,6 +490,7 @@
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_wchar.h dontcare
 done ${PACKAGE_ast_INCLUDE}/wchar.h dontcare
+prev FEATURE/locale implicit
 done include/lexstates.h
 prev include/variables.h implicit
 prev include/defs.h implicit
@@ -498,7 +499,7 @@
 done bltins/read.c
 meta read.o %.c>%.o bltins/read.c read
 prev bltins/read.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC -c bltins/read.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c bltins/read.c
 done read.o generated
 make sleep.o
 make bltins/sleep.c
@@ -509,9 +510,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/poll
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/poll
 done FEATURE/poll generated
 prev FEATURE/time implicit
 prev include/builtins.h implicit
@@ -520,7 +521,7 @@
 done bltins/sleep.c
 meta sleep.o %.c>%.o bltins/sleep.c sleep
 prev bltins/sleep.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/sleep.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c bltins/sleep.c
 done sleep.o generated
 make trap.o
 make bltins/trap.c
@@ -530,7 +531,7 @@
 done bltins/trap.c
 meta trap.o %.c>%.o bltins/trap.c trap
 prev bltins/trap.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/trap.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c bltins/trap.c
 done trap.o generated
 make test.o
 make bltins/test.c
@@ -543,9 +544,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/externs
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/externs
 done FEATURE/externs generated
 prev include/builtins.h implicit
 prev include/test.h implicit
@@ -557,7 +558,7 @@
 done bltins/test.c
 meta test.o %.c>%.o bltins/test.c test
 prev bltins/test.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/test.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c bltins/test.c
 done test.o generated
 make typeset.o
 make bltins/typeset.c
@@ -572,7 +573,7 @@
 done bltins/typeset.c
 meta typeset.o %.c>%.o bltins/typeset.c typeset
 prev bltins/typeset.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_DYNAMIC -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell 
-DSHOPT_ESH -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -c 
bltins/typeset.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_DYNAMIC -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell 
-DSHOPT_ESH -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND -c bltins/typeset.c
 done typeset.o generated
 make ulimit.o
 make bltins/ulimit.c
@@ -584,9 +585,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/rlimits
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/rlimits
 done FEATURE/rlimits dontcare generated
 prev FEATURE/time implicit
 done include/ulimit.h
@@ -599,7 +600,7 @@
 done bltins/ulimit.c
 meta ulimit.o %.c>%.o bltins/ulimit.c ulimit
 prev bltins/ulimit.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_DYNAMIC -c 
bltins/ulimit.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c bltins/ulimit.c
 done ulimit.o generated
 make umask.o
 make bltins/umask.c
@@ -612,7 +613,7 @@
 done bltins/umask.c
 meta umask.o %.c>%.o bltins/umask.c umask
 prev bltins/umask.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_DYNAMIC -c 
bltins/umask.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c bltins/umask.c
 done umask.o generated
 make whence.o
 make bltins/whence.c
@@ -632,7 +633,7 @@
 done bltins/whence.c
 meta whence.o %.c>%.o bltins/whence.c whence
 prev bltins/whence.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c bltins/whence.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DERROR_CONTEXT_T=Error_context_t 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c bltins/whence.c
 done whence.o generated
 make main.o
 make sh/main.c
@@ -650,18 +651,18 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : def execargs
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : def execargs
 done FEATURE/execargs generated
 make FEATURE/pstat implicit
 meta FEATURE/pstat >FEATURE/%  pstat
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : def pstat
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : def pstat
 done FEATURE/pstat generated
 prev FEATURE/time implicit
 make include/timeout.h implicit
@@ -683,7 +684,7 @@
 done sh/main.c
 meta main.o %.c>%.o sh/main.c main
 prev sh/main.c
-exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} 
-D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_BRACEPAT -D_PACKAGE_ast -DSHOPT_ESH -DSHOPT_KIA -D_BLD_shell 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL -DSHOPT_SUID_EXEC -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -c sh/main.c
+exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} 
-D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_BRACEPAT -D_PACKAGE_ast -DSHOPT_ESH -DSHOPT_KIA -D_BLD_shell 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL -DSHOPT_SUID_EXEC -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -c sh/main.c
 done main.o generated
 make nvdisc.o
 make sh/nvdisc.c
@@ -694,11 +695,10 @@
 done sh/nvdisc.c
 meta nvdisc.o %.c>%.o sh/nvdisc.c nvdisc
 prev sh/nvdisc.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_NAMESPACE -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -D_BLD_shell 
-D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/nvdisc.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_NAMESPACE -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -D_BLD_shell 
-D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/nvdisc.c
 done nvdisc.o generated
 make arith.o
 make sh/arith.c
-prev FEATURE/locale implicit
 prev include/variables.h implicit
 prev include/streval.h implicit
 prev include/name.h implicit
@@ -707,7 +707,7 @@
 done sh/arith.c
 meta arith.o %.c>%.o sh/arith.c arith
 prev sh/arith.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH -D_BLD_shell -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/arith.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/arith.c
 done arith.o generated
 make args.o
 make sh/args.c
@@ -722,7 +722,7 @@
 done sh/args.c
 meta args.o %.c>%.o sh/args.c args
 prev sh/args.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_OPTIMIZE -DSHOPT_RAWONLY -DSHOPT_HISTEXPAND -DSHOPT_PFSH -D_BLD_shell 
-DKSHELL -D_PACKAGE_ast -DSHOPT_KIA -DSHOPT_MULTIBYTE -DSHOPT_ESH -DSHOPT_VSH 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_DYNAMIC -c sh/args.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_OPTIMIZE -DSHOPT_RAWONLY -DSHOPT_HISTEXPAND -DSHOPT_PFSH -D_BLD_shell 
-DKSHELL -D_PACKAGE_ast -DSHOPT_KIA -DSHOPT_MULTIBYTE -DSHOPT_ESH -DSHOPT_VSH 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c sh/args.c
 done args.o generated
 make array.o
 make sh/array.c
@@ -732,7 +732,7 @@
 done sh/array.c
 meta array.o %.c>%.o sh/array.c array
 prev sh/array.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -c sh/array.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -DSHOPT_MULTIBYTE -DSHOPT_PFSH -c 
sh/array.c
 done array.o generated
 make completion.o
 make edit/completion.c
@@ -746,7 +746,7 @@
 done edit/completion.c
 meta completion.o %.c>%.o edit/completion.c completion
 prev edit/completion.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_ESH -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DKSHELL 
-DSHOPT_VSH -DSHOPT_PFSH -D_BLD_shell -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_DYNAMIC -c edit/completion.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_ESH -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DKSHELL 
-DSHOPT_VSH -DSHOPT_PFSH -D_BLD_shell -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -c edit/completion.c
 done completion.o generated
 make defs.o
 make sh/defs.c
@@ -758,7 +758,7 @@
 done sh/defs.c
 meta defs.o %.c>%.o sh/defs.c defs
 prev sh/defs.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA -D_BLD_shell -DSHOPT_DYNAMIC -c 
sh/defs.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA -D_BLD_shell -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c sh/defs.c
 done defs.o generated
 make edit.o
 make edit/edit.c
@@ -776,9 +776,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/cmds
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/cmds
 done FEATURE/cmds generated
 prev FEATURE/time implicit
 prev FEATURE/options implicit
@@ -787,7 +787,7 @@
 done edit/edit.c
 meta edit.o %.c>%.o edit/edit.c edit
 prev edit/edit.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_RAWONLY -DSHOPT_ESH -DSHOPT_VSH -DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND 
-DKSHELL -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC -c edit/edit.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_RAWONLY -DSHOPT_ESH -DSHOPT_VSH -DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND 
-DKSHELL -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c edit/edit.c
 done edit.o generated
 make expand.o
 make sh/expand.c
@@ -816,7 +816,7 @@
 done sh/expand.c
 meta expand.o %.c>%.o sh/expand.c expand
 prev sh/expand.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_BRACEPAT -DSHOPT_SUID_EXEC -D_BLD_shell -D_PACKAGE_ast 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c sh/expand.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_BRACEPAT -DSHOPT_SUID_EXEC -D_BLD_shell -D_PACKAGE_ast 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/expand.c
 done expand.o generated
 make fault.o
 make sh/fault.c
@@ -832,7 +832,7 @@
 done sh/fault.c
 meta fault.o %.c>%.o sh/fault.c fault
 prev sh/fault.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_KIA -DSHOPT_ESH -DSHOPT_VSH -D_PACKAGE_ast -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -c sh/fault.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_KIA -DSHOPT_ESH -DSHOPT_VSH -D_PACKAGE_ast -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -D_BLD_shell -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DKSHELL 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -c 
sh/fault.c
 done fault.o generated
 make fcin.o
 make sh/fcin.c
@@ -843,7 +843,7 @@
 done sh/fcin.c
 meta fcin.o %.c>%.o sh/fcin.c fcin
 prev sh/fcin.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -c sh/fcin.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -c sh/fcin.c
 done fcin.o generated
 make history.o
 make edit/history.c
@@ -862,13 +862,12 @@
 done edit/history.c
 meta history.o %.c>%.o edit/history.c history
 prev edit/history.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_VSH -DSHOPT_ESH -DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell -DKSHELL 
-DSHOPT_PFSH -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -c edit/history.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_VSH -DSHOPT_ESH -DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell -DKSHELL 
-DSHOPT_PFSH -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -c edit/history.c
 done history.o generated
 make init.o
 make sh/init.c
 make include/version.h implicit
 done include/version.h
-prev FEATURE/locale implicit
 prev include/lexstates.h implicit
 prev FEATURE/dynamic implicit
 prev FEATURE/time implicit
@@ -887,7 +886,7 @@
 done sh/init.c
 meta init.o %.c>%.o sh/init.c init
 prev sh/init.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_PFSH -DSHOPT_NAMESPACE -DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell 
-DSHOPT_KIA -DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_ESH -DSHOPT_VSH 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_DYNAMIC -c sh/init.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_PFSH -DSHOPT_NAMESPACE -DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell 
-DSHOPT_KIA -DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_ESH -DSHOPT_VSH 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_DYNAMIC -c sh/init.c
 done init.o generated
 make io.o
 make sh/io.c
@@ -910,7 +909,7 @@
 done sh/io.c
 meta io.o %.c>%.o sh/io.c io
 prev sh/io.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_RAWONLY -DSHOPT_VSH -DSHOPT_ESH -DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE 
-DKSHELL -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA -D_BLD_shell -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -DSHOPT_DYNAMIC -c sh/io.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_RAWONLY -DSHOPT_VSH -DSHOPT_ESH -DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE 
-DKSHELL -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA -D_BLD_shell -DSHOPT_SUID_EXEC 
-DSHOPT_BRACEPAT -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -c sh/io.c
 done io.o generated
 make jobs.o
 make sh/jobs.c
@@ -927,7 +926,7 @@
 done sh/jobs.c
 meta jobs.o %.c>%.o sh/jobs.c jobs
 prev sh/jobs.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_VSH -DSHOPT_ESH -D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH 
-D_BLD_shell -DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -c sh/jobs.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_VSH -DSHOPT_ESH -D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH 
-D_BLD_shell -DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c sh/jobs.c
 done jobs.o generated
 make lex.o
 make sh/lex.c
@@ -946,7 +945,7 @@
 done sh/lex.c
 meta lex.o %.c>%.o sh/lex.c lex
 prev sh/lex.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_KIA -D_BLD_shell -D_PACKAGE_ast -DSHOPT_PFSH -DKSHELL 
-DSHOPT_DYNAMIC -DSHOPT_HISTEXPAND -DSHOPT_ESH -c sh/lex.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_KIA -D_PACKAGE_ast -D_BLD_shell -DSHOPT_PFSH -DKSHELL 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_HISTEXPAND 
-DSHOPT_ESH -c sh/lex.c
 done lex.o generated
 make macro.o
 make sh/macro.c
@@ -963,7 +962,7 @@
 done sh/macro.c
 meta macro.o %.c>%.o sh/macro.c macro
 prev sh/macro.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_BRACEPAT -DKSHELL -DSHOPT_OPTIMIZE -DSHOPT_FILESCAN -DSHOPT_MULTIBYTE 
-D_PACKAGE_ast -DSHOPT_SUID_EXEC -D_BLD_shell -DSHOPT_PFSH -DSHOPT_KIA 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/macro.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_BRACEPAT -DKSHELL -DSHOPT_OPTIMIZE -DSHOPT_FILESCAN -DSHOPT_MULTIBYTE 
-D_PACKAGE_ast -DSHOPT_SUID_EXEC -D_BLD_shell -DSHOPT_PFSH -DSHOPT_KIA 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t 
-DSHOPT_ESH -c sh/macro.c
 done macro.o generated
 make name.o
 make sh/name.c
@@ -971,7 +970,6 @@
 prev include/shnodes.h implicit
 prev include/streval.h implicit
 prev FEATURE/externs implicit
-prev FEATURE/locale implicit
 prev include/timeout.h implicit
 prev include/lexstates.h implicit
 prev include/path.h implicit
@@ -980,7 +978,7 @@
 done sh/name.c
 meta name.o %.c>%.o sh/name.c name
 prev sh/name.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_OPTIMIZE -DSHOPT_MULTIBYTE -D_BLD_shell -D_PACKAGE_ast -DSHOPT_PFSH 
-DSHOPT_KIA -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/name.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_OPTIMIZE -D_BLD_shell -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH 
-DSHOPT_KIA -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/name.c
 done name.o generated
 make nvtree.o
 make sh/nvtree.c
@@ -990,7 +988,7 @@
 done sh/nvtree.c
 meta nvtree.o %.c>%.o sh/nvtree.c nvtree
 prev sh/nvtree.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -c sh/nvtree.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_shell -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -DSHOPT_MULTIBYTE -DSHOPT_PFSH -c 
sh/nvtree.c
 done nvtree.o generated
 make parse.o
 make sh/parse.c
@@ -1006,7 +1004,7 @@
 done sh/parse.c
 meta parse.o %.c>%.o sh/parse.c parse
 prev sh/parse.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_NAMESPACE -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -D_BLD_shell 
-D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DSHOPT_ESH 
-DSHOPT_DYNAMIC -DSHOPT_HISTEXPAND -DKSHELL -c sh/parse.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_NAMESPACE -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -D_BLD_shell 
-D_PACKAGE_ast -DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DSHOPT_ESH 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_DYNAMIC -DSHOPT_HISTEXPAND -DKSHELL 
-c sh/parse.c
 done parse.o generated
 make path.o
 make sh/path.c
@@ -1028,7 +1026,7 @@
 done sh/path.c
 meta path.o %.c>%.o sh/path.c path
 prev sh/path.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSH_CMDLIB_DIR=\""/opt/ast/bin"\" -D_PACKAGE_ast -DSHOPT_SUID_EXEC 
-DSHOPT_PFSH -DSHOPT_MULTIBYTE -DSHOPT_ESH -D_BLD_shell -DKSHELL 
-DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -c sh/path.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_PFSH -DSHOPT_MULTIBYTE -DSHOPT_ESH 
-D_BLD_shell -DKSHELL -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c sh/path.c
 done path.o generated
 make string.o
 make sh/string.c
@@ -1043,7 +1041,7 @@
 done sh/string.c
 meta string.o %.c>%.o sh/string.c string
 prev sh/string.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-D_BLD_shell -DSHOPT_ESH -DSHOPT_PFSH -c sh/string.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-D_BLD_shell -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -DSHOPT_PFSH -c 
sh/string.c
 done string.o generated
 make streval.o
 make sh/streval.c
@@ -1054,7 +1052,7 @@
 done sh/streval.c
 meta streval.o %.c>%.o sh/streval.c streval
 prev sh/streval.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -D_PACKAGE_ast -c sh/streval.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -c sh/streval.c
 done streval.o generated
 make subshell.o
 make sh/subshell.c
@@ -1070,7 +1068,7 @@
 done sh/subshell.c
 meta subshell.o %.c>%.o sh/subshell.c subshell
 prev sh/subshell.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -D_BLD_shell -D_PACKAGE_ast 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DKSHELL -DSHOPT_HISTEXPAND 
-DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/subshell.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT -D_BLD_shell -D_PACKAGE_ast 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DERROR_CONTEXT_T=Error_context_t 
-DKSHELL -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -DSHOPT_ESH -c sh/subshell.c
 done subshell.o generated
 make tdump.o
 make sh/tdump.c
@@ -1082,7 +1080,7 @@
 done sh/tdump.c
 meta tdump.o %.c>%.o sh/tdump.c tdump
 prev sh/tdump.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DKSHELL -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c sh/tdump.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DKSHELL -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/tdump.c
 done tdump.o generated
 make timers.o
 make sh/timers.c
@@ -1096,7 +1094,7 @@
 done sh/timers.c
 meta timers.o %.c>%.o sh/timers.c timers
 prev sh/timers.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -D_BLD_shell -DSHOPT_ESH 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -c sh/timers.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -D_BLD_shell 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -DSHOPT_MULTIBYTE -DSHOPT_PFSH -c 
sh/timers.c
 done timers.o generated
 make trestore.o
 make sh/trestore.c
@@ -1108,7 +1106,7 @@
 done sh/trestore.c
 meta trestore.o %.c>%.o sh/trestore.c trestore
 prev sh/trestore.c
-exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} 
-D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DKSHELL -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DSHOPT_ESH -c sh/trestore.c
+exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} 
-D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_BLD_shell -DKSHELL -D_PACKAGE_ast -DSHOPT_SUID_EXEC -DSHOPT_BRACEPAT 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -DSHOPT_KIA -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -c sh/trestore.c
 done trestore.o generated
 make waitevent.o
 make sh/waitevent.c
@@ -1116,7 +1114,7 @@
 done sh/waitevent.c
 meta waitevent.o %.c>%.o sh/waitevent.c waitevent
 prev sh/waitevent.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -D_BLD_shell -D_PACKAGE_ast -DSHOPT_ESH 
-DSHOPT_MULTIBYTE -DSHOPT_PFSH -c sh/waitevent.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -D_BLD_shell -D_PACKAGE_ast 
-DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -DSHOPT_MULTIBYTE -DSHOPT_PFSH -c 
sh/waitevent.c
 done waitevent.o generated
 make xec.o
 make sh/xec.c
@@ -1142,7 +1140,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 -DSHOPT_ESH -c 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
 done xec.o generated
 make env.o
 make sh/env.c
@@ -1178,7 +1176,7 @@
 done data/msg.c
 meta msg.o %.c>%.o data/msg.c msg
 prev data/msg.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_SUID_EXEC -DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH 
-DSHOPT_VSH -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_KIA 
-DSHOPT_BRACEPAT -DSHOPT_DYNAMIC  -c data/msg.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_SUID_EXEC -DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH 
-DSHOPT_VSH -D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_KIA 
-DSHOPT_BRACEPAT -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t  -c 
data/msg.c
 done msg.o generated
 make strdata.o
 make data/strdata.c
@@ -1191,9 +1189,9 @@
 prev shell.req
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl}  : run features/math.sh data/math.tab
+exec - iffe -v -c '${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS} '  ref 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib} -I${PACKAGE_ast_INCLUDE} 
-I${INSTALLROOT}/include ${mam_libdll} ${mam_libcmd} ${mam_libast} ${mam_libm} 
${mam_libdl} ${mam_libnsl}  : run features/math.sh data/math.tab
 make ${PACKAGE_ast_INCLUDE}/ast_standards.h implicit
 done ${PACKAGE_ast_INCLUDE}/ast_standards.h dontcare
 done FEATURE/math generated
@@ -1224,7 +1222,7 @@
 done data/keywords.c
 meta keywords.o %.c>%.o data/keywords.c keywords
 prev data/keywords.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_NAMESPACE -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA 
-D_BLD_shell -DSHOPT_DYNAMIC  -c data/keywords.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_NAMESPACE -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_KIA 
-D_BLD_shell -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t  -c 
data/keywords.c
 done keywords.o generated
 make options.o
 make data/options.c
@@ -1235,7 +1233,7 @@
 done data/options.c
 meta options.o %.c>%.o data/options.c options
 prev data/options.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_PACKAGE_ast -DSHOPT_MULTIBYTE 
-DSHOPT_DYNAMIC -DSHOPT_ESH  -c data/options.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_PFSH -DSHOPT_HISTEXPAND -D_BLD_shell -D_PACKAGE_ast -DSHOPT_MULTIBYTE 
-DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH  -c data/options.c
 done options.o generated
 make signals.o
 make data/signals.c
@@ -1245,7 +1243,7 @@
 done data/signals.c
 meta signals.o %.c>%.o data/signals.c signals
 prev data/signals.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast  -c data/signals.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t  -c data/signals.c
 done signals.o generated
 make aliases.o
 make data/aliases.c
@@ -1261,9 +1259,6 @@
 done aliases.o generated
 make builtins.o
 make data/builtins.c
-make ${PACKAGE_ast_INCLUDE}/cmdlist.h implicit
-prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
-done ${PACKAGE_ast_INCLUDE}/cmdlist.h dontcare
 prev FEATURE/cmds implicit
 prev include/jobs.h implicit
 prev include/builtins.h implicit
@@ -1271,11 +1266,12 @@
 prev include/name.h implicit
 prev include/ulimit.h implicit
 prev include/shtable.h implicit
+prev include/defs.h implicit
 prev include/shell.h implicit
 done data/builtins.c
 meta builtins.o %.c>%.o data/builtins.c builtins
 prev data/builtins.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_KIA -DSHOPT_PFSH -DUSAGE_LICENSE=\""[-author?David Korn <dgk at 
research.att.com>][-copyright?Copyright (c) 1982-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libshell]"\";
 -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSH_CMDLIB_DIR=\""/opt/ast/bin"\" 
-DSHOPT_CMDLIB_BLTIN=0 -DSHOPT_MULTIBYTE -D_PACKAGE_ast -D_BLD_shell -DKSHELL 
-DSHOPT_DYNAMIC  -c data/builtins.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_KIA -DSHOPT_PFSH -DUSAGE_LICENSE=\""[-author?David Korn <dgk at 
research.att.com>][-copyright?Copyright (c) 1982-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libshell]"\";
 -DSHOPT_BRACEPAT -DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -D_PACKAGE_ast 
-D_BLD_shell -DKSHELL -DSHOPT_DYNAMIC -DERROR_CONTEXT_T=Error_context_t 
-DSHOPT_ESH  -c data/builtins.c
 done builtins.o generated
 make variables.o
 make data/variables.c
@@ -1289,7 +1285,7 @@
 done data/variables.c
 meta variables.o %.c>%.o data/variables.c variables
 prev data/variables.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -D_BLD_shell 
-D_PACKAGE_ast -DSHOPT_ESH -DSHOPT_PFSH  -c data/variables.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND -DSHOPT_DYNAMIC -D_BLD_shell 
-D_PACKAGE_ast -DERROR_CONTEXT_T=Error_context_t -DSHOPT_ESH -DSHOPT_PFSH  -c 
data/variables.c
 done variables.o generated
 make lexstates.o
 make data/lexstates.c
@@ -1308,11 +1304,12 @@
 prev include/history.h implicit
 prev include/io.h implicit
 prev include/defs.h implicit
+prev FEATURE/cmds implicit
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done edit/emacs.c
 meta emacs.o %.c>%.o edit/emacs.c emacs
 prev edit/emacs.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC -c edit/emacs.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_MULTIBYTE -DSHOPT_HISTEXPAND -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c edit/emacs.c
 done emacs.o generated
 make vi.o
 make edit/vi.c
@@ -1328,7 +1325,7 @@
 done edit/vi.c
 meta vi.o %.c>%.o edit/vi.c vi
 prev edit/vi.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_RAWONLY -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DKSHELL 
-DSHOPT_ESH -DSHOPT_VSH -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC -c edit/vi.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_RAWONLY -DSHOPT_MULTIBYTE -D_PACKAGE_ast -DSHOPT_HISTEXPAND -DKSHELL 
-DSHOPT_ESH -DSHOPT_VSH -DSHOPT_PFSH -D_BLD_shell -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -c edit/vi.c
 done vi.o generated
 make hexpand.o
 make edit/hexpand.c
@@ -1337,7 +1334,7 @@
 done edit/hexpand.c
 meta hexpand.o %.c>%.o edit/hexpand.c hexpand
 prev edit/hexpand.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_DYNAMIC -D_BLD_shell -c edit/hexpand.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSHOPT_HISTEXPAND -DSHOPT_MULTIBYTE -DKSHELL -DSHOPT_ESH -DSHOPT_VSH 
-D_PACKAGE_ast -DSHOPT_PFSH -DSHOPT_DYNAMIC -D_BLD_shell 
-DERROR_CONTEXT_T=Error_context_t -c edit/hexpand.c
 done hexpand.o generated
 exec - ${AR} cr libshell.a alarm.o cd_pwd.o cflow.o deparse.o getopts.o hist.o 
misc.o print.o read.o sleep.o trap.o test.o typeset.o ulimit.o umask.o whence.o 
main.o nvdisc.o arith.o args.o array.o completion.o defs.o edit.o expand.o 
fault.o fcin.o history.o init.o io.o
 exec - ${AR} cr libshell.a jobs.o lex.o macro.o name.o nvtree.o parse.o path.o 
string.o streval.o subshell.o tdump.o timers.o trestore.o waitevent.o xec.o 
env.o limits.o msg.o strdata.o testops.o keywords.o options.o signals.o 
aliases.o builtins.o variables.o lexstates.o emacs.o vi.o hexpand.o
@@ -1346,9 +1343,9 @@
 bind -lshell
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
-exec - ${CC} ${CCLDFLAGS} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS} 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib}  -o ksh pmain.o 
${mam_libshell} ${mam_libdl} ${mam_libast}
+exec - ${CC} ${CCLDFLAGS} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS} 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib}  -o ksh pmain.o 
${mam_libshell} ${mam_libnsl} ${mam_libdl} ${mam_libast}
 done ksh generated
 make shcomp
 make shcomp.o
@@ -1362,16 +1359,16 @@
 setv SH_DICT -DSH_DICT="\"libshell\""
 setv _BLD_shell -U_BLD_shell
 setv _BLD_DLL -U_BLD_DLL
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSH_DICT=\""libshell"\" -DSHOPT_KIA -D_PACKAGE_ast -DSHOPT_DYNAMIC 
-DUSAGE_LICENSE=\""[-author?David Korn <dgk at 
research.att.com>][-copyright?Copyright (c) 1982-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libshell]"\";
 -c sh/shcomp.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DSH_DICT=\""libshell"\" -DSHOPT_KIA -D_PACKAGE_ast -DSHOPT_DYNAMIC 
-DERROR_CONTEXT_T=Error_context_t -DUSAGE_LICENSE=\""[-author?David Korn <dgk 
at research.att.com>][-copyright?Copyright (c) 1982-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libshell]"\";
 -c sh/shcomp.c
 done shcomp.o generated
 prev libshell.a archive
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
 setv CC.DLL -UCC.DLL
 setv SH_DICT -DSH_DICT="\"libshell\""
-exec - ${CC} ${CCLDFLAGS} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS} 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib}  -o shcomp shcomp.o 
${mam_libshell} ${mam_libdl} ${mam_libast}
+exec - ${CC} ${CCLDFLAGS} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS} 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib}  -o shcomp shcomp.o 
${mam_libshell} ${mam_libnsl} ${mam_libdl} ${mam_libast}
 done shcomp generated
 make suid_exec
 make suid_exec.o
@@ -1387,14 +1384,14 @@
 prev sh/suid_exec.c
 setv CC.DLL -UCC.DLL
 setv _BLD_shell -U_BLD_shell
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -c sh/suid_exec.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Iinclude -I${PACKAGE_ast_INCLUDE} 
-DERROR_CONTEXT_T=Error_context_t -D_PACKAGE_ast -c sh/suid_exec.c
 done suid_exec.o generated
 prev +ljobs
 prev +li
+prev ${mam_libsocket}
 prev ${mam_libsecdb}
-prev +lintl
 setv CC.DLL -UCC.DLL
-exec - ${CC} ${CCLDFLAGS} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS} 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib}  -o suid_exec suid_exec.o 
${mam_libast} ${mam_libdl} ${mam_libast}
+exec - ${CC} ${CCLDFLAGS} ${mam_cc_FLAGS} ${CCFLAGS} ${LDFLAGS} 
${mam_cc_L+-L.} ${mam_cc_L+-L${INSTALLROOT}/lib}  -o suid_exec suid_exec.o 
${mam_libast} ${mam_libnsl} ${mam_libdl} ${mam_libast}
 done suid_exec generated
 make shell
 prev libshell.a archive
@@ -1544,8 +1541,9 @@
 exec - mkdir $tmp
 exec - for i in *.sh
 exec - do      tst=$tmp/shcomp-${i%.sh}.ksh
-exec -         shcomp $i > $tst
-exec -         SHELL=${INSTALLROOT}/bin/ksh ${INSTALLROOT}/bin/ksh shtests $tst
+exec -         if      shcomp $i > $tst
+exec -         then    SHELL=${INSTALLROOT}/bin/ksh ${INSTALLROOT}/bin/ksh 
shtests $tst
+exec -         fi
 exec -         rm -f $tst
 exec - done
 exec - rm -rf $tmp
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/nval.3 
ksh93_2007_03_28/src/cmd/ksh93/nval.3
--- ksh93_2007_01_11/src/cmd/ksh93/nval.3       2005-06-14 17:25:39.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/nval.3       2007-03-20 14:51:26.000000000 
+0100
@@ -87,7 +87,7 @@
 int    nv_scan(Dt_t *\fIdict\fP, void(*\fIfn\fP)(Namval_t*,void*), void 
*\fIdata\fP, int \fImask\fP, int \fIflags\fP);
 Dt_t   nv_dict(Namval_t *\fInp\fP);
 void   nv_setvtree(Namval_t *\fInp\fP);
-void   nv_setref(Namval_t *\fInp\fP);
+void   nv_setref(Namval_t *\fInp\fP, Dt_t *\fIdp\fP, int \fIflags\fP);
 Namval_t       *nv_lastdict(void);
 .ft R
 .fi
@@ -601,7 +601,10 @@
 .PP
 The \f5nv_setref()\fP function makes the name-value pair \f5np\fP
 into a reference to the variable whose name is given by
-the value of \f5np\fP.
+the value of \f5np\fP.  The \f5nv_open()\fP open function is
+called with this name, the dictionary given by \f5dp\fP,
+and the \f5flags\fP argument.
+A \f5NULL\fP value causes the shell global variable dictionary to be searched.
 .PP
 The \f5nv_setvtree()\fP function makes the name-value pair \f5np\fP
 into a tree structured variable so that \f5nv_getval()\fP
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/README 
ksh93_2007_03_28/src/cmd/ksh93/README
--- ksh93_2007_01_11/src/cmd/ksh93/README       2003-03-14 04:39:10.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/README       2007-03-25 04:06:09.000000000 
+0200
@@ -36,7 +36,7 @@
                      SH_CMDLIB_DIR nmake state variable can be used to
                     specify a directory. 
     CMDLIB_DIR   off Sets CMDLIB_BLTIN=1 and provides a default value
-                     of "/opt/ast/bin/" for SH_CMDLIB_DIR.
+                     of "/opt/ast/bin" for SH_CMDLIB_DIR.
     COMPOUND_ARRAY
                  on  Allows all components of compound variables except the
                      first to be any string by enclosing in [...].  It also
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/RELEASE 
ksh93_2007_03_28/src/cmd/ksh93/RELEASE
--- ksh93_2007_01_11/src/cmd/ksh93/RELEASE      2006-12-29 16:53:04.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/RELEASE      2007-03-27 20:54:06.000000000 
+0200
@@ -1,3 +1,30 @@
+07-03-08  --- Release ksh93s+  ---
+07-03-08  A bug in which set +o output command line options has been fixed.
+07-03-08  A bug in which an error in read (for example, an invalid variable
+         name), could leave the terminal in raw mode has been fixed.
+07-03-06  A bug in which read could core dump when specified with an array
+         variable with a subscript that is an arithmetic expression has
+         been fixed.
+07-03-06  Several serious bugs with the restricted shell were reported and
+         fixed.
+07-03-02  If a job is stopped, and subsequently restarted with a CONT
+         signal and exits normally, ksh93 was incorrectly exiting with
+         the exit status of the stop signal number.
+07-02-26  M-^L added to emacs mode to clear the screen.
+07-02-26  A bug in which setting a variable readonly in a subshell would
+         cause an unset error when the subshell completed has been fixed. 
+07-02-19  The format with printf uses the new = flag to center the output.
+07-02-19  A bug in which ksh93 did not allow multibyte characters in
+         identifier names has been fixed.
+07-02-19  A bug introduced in ksh93 that causes global compound variable
+         definitions inside functions to exit with "no parent" has been fixed.
+07-02-19  A bug in which using compound commands in process redirection
+         arguments would give syntax errors <(...) and >(...) has been fixed.
+07-01-29  A bug which caused the shell to core dump which can occur when a
+         built-in exits without closing files that it opens has been fixed.
+07-01-26  A bug in which ~(E) in patterns containing \ that are not inside ()
+         has been fixed.
+
 06-12-29  --- Release ksh93s  ---
 06-12-29  A bug in which the value of IFS could be changed after a command
          substitution has been fixed. 
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/args.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/args.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/args.c    2006-10-06 03:13:26.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/args.c    2007-03-27 20:52:51.000000000 
+0200
@@ -638,7 +638,6 @@
                else if (value&(SH_BASHEXTRA|SH_BASHOPT))
                        continue;
                on = !!is_option(&oflags,value);
-               value &= 0xff;
                name = tp->sh_name;
                if(name[0] == 'n' && name[1] == 'o' && name[2] != 't')
                {
@@ -662,7 +661,7 @@
                                        on?'-':'+',
                                        name);
                }
-               else if(value!=SH_INTERACTIVE && value!=SH_RESTRICTED && 
value!=SH_PFSH && is_option(&oflags,value))
+               else if(!(value&SH_COMMANDLINE) && 
is_option(&oflags,value&0xff))
                        sfprintf(sfstdout," 
%s%s%s",(mode&PRINT_SHOPT)?"":"--",on?"":"no",name);
        }
        if(!(mode&(PRINT_VERBOSE|PRINT_ALL)))
@@ -757,7 +756,7 @@
 #if _pipe_socketpair && !_socketpair_devfd
 #   define sh_pipe     arg_pipe
 /*
- * create a real pipe (not a socked) and print message on failure
+ * create a real pipe (not a socket) and print message on failure
  */
 static int     arg_pipe(register int pv[])
 {
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/arith.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/arith.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/arith.c   2006-10-11 22:26:21.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/arith.c   2007-03-14 17:02:22.000000000 
+0100
@@ -30,10 +30,9 @@
 #include       "name.h"
 #include       "streval.h"
 #include       "variables.h"
-#include       "FEATURE/locale"
 
-#ifndef LONGLONG_MAX
-#define LONGLONG_MAX   LONG_MAX
+#ifndef LLONG_MAX
+#define LLONG_MAX      LONG_MAX
 #endif
 
 static Sfdouble_t      Zero, NaN, Inf;
@@ -41,14 +40,14 @@
 {
        { 0 },
        "Inf",
-       NV_NOFREE|NV_INTEGER|NV_DOUBLE|NV_LONG,NV_RDONLY
+       NV_NOFREE|NV_LDOUBLE,NV_RDONLY
 };
 
 static Namval_t NaNnod =
 {
        { 0 },
        "NaN",
-       NV_NOFREE|NV_INTEGER|NV_DOUBLE|NV_LONG,NV_RDONLY
+       NV_NOFREE|NV_LDOUBLE,NV_RDONLY
 };
 
 static Namval_t *scope(register Namval_t *np,register struct lval *lvalue,int 
assign)
@@ -76,7 +75,7 @@
                {
                        while(nv_isref(mp))
                        {
-                               sub = mp->nvenv;
+                               sub = nv_refsub(mp);
                                mp = nv_refnode(mp);
                        }
                        np = mp;
@@ -104,16 +103,18 @@
            {
                register Namval_t *np = (Namval_t*)(lvalue->value);
                np = scope(np,lvalue,1);
-               nv_putval(np, (char*)&n, NV_INTEGER|NV_DOUBLE|NV_LONG);
+               nv_putval(np, (char*)&n, NV_LDOUBLE);
                r=nv_getnum(np);
                break;
            }
            case LOOKUP:
            {
                register int c = *str;
+               register char *xp=str;
                lvalue->value = (char*)0;
                if(c=='.')
-                       c = str[1];
+                       str++;
+               c = mbchar(str);
                if(isaletter(c))
                {
                        register Namval_t *np;
@@ -121,7 +122,8 @@
                        char *cp;
                        while(1)
                        {
-                               while(c= *++str, isaname(c));
+                               while(xp=str, c=mbchar(str), isaname(c));
+                               str = xp;
                                if(c!='.')
                                        break;
                                dot=1;
@@ -181,7 +183,11 @@
                                                }
                                        }
                                        else
-                                               while(c= *++str, isaname(c));
+                                       {
+                                               str++;
+                                               while(xp=str, c=mbchar(str), 
isaname(c));
+                                               str = xp;
+                                       }
                                }
                                *str = 0;
                                if(strcmp(*ptr,"Inf")==0)
@@ -232,7 +238,7 @@
                }
                else
                {
-                       char    lastbase=0, *val = str, oerrno = errno;
+                       char    lastbase=0, *val = xp, oerrno = errno;
                        errno = 0;
                        r = strtonll(val,&str, &lastbase,-1);
                        if(*str=='8' || *str=='9')
@@ -250,7 +256,7 @@
                                if(*val==0 || *val=='.' || *val=='x' || 
*val=='X')
                                        val--;
                        }
-                       if(r==LONGLONG_MAX && errno)
+                       if(r==LLONG_MAX && errno)
                                c='e';
                        else
                                c = *str;
@@ -323,7 +329,11 @@
        register Sfdouble_t d;
        char base=0, *last;
        if(*str==0)
+       {
+               if(ptr)
+                       *ptr = (char*)str;
                return(0);
+       }
        errno = 0;
        d = strtonll(str,&last,&base,-1);
        if(*last || errno)
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/array.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/array.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/array.c   2006-11-16 21:48:47.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/array.c   2007-03-15 21:58:02.000000000 
+0100
@@ -33,9 +33,9 @@
 
 #define NUMSIZE        (4+(ARRAY_MAX>999)+(ARRAY_MAX>9999)+(ARRAY_MAX>99999))
 #define is_associative(ap)     array_assoc((Namarr_t*)(ap))
-#define array_setbit(cp, n)    (cp[(n)/CHAR_BIT] |= 2<<(((n)&(CHAR_BIT-1))))
-#define array_clrbit(cp, n)    (cp[(n)/CHAR_BIT] &= ~(2<<(((n)&(CHAR_BIT-1)))))
-#define array_isbit(cp, n)     (cp[(n)/CHAR_BIT] & 2<<(((n)&(CHAR_BIT-1))))
+#define array_setbit(cp, n)    (cp[(n)/CHAR_BIT] |= 1<<(((n)&(CHAR_BIT-1))))
+#define array_clrbit(cp, n)    (cp[(n)/CHAR_BIT] &= ~(1<<(((n)&(CHAR_BIT-1)))))
+#define array_isbit(cp, n)     (cp[(n)/CHAR_BIT] & 1<<(((n)&(CHAR_BIT-1))))
 #define NV_CHILD               NV_EXPORT
 
 static char Empty[] = "";
@@ -238,7 +238,7 @@
                else if(nv_isattr(np,NV_INTEGER))
                {
                        Sfdouble_t d= nv_getnum(np);
-                       nv_putval(mp,(char*)&d,NV_LONG|NV_DOUBLE|NV_INTEGER);
+                       nv_putval(mp,(char*)&d,NV_LDOUBLE);
                }
                else
                        nv_putval(mp,nv_getval(np),NV_RDONLY);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/defs.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/defs.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/defs.c    2006-06-12 17:42:16.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/defs.c    2007-02-14 08:59:16.000000000 
+0100
@@ -43,5 +43,5 @@
 char *sh_lexstates[ST_NONE] = {0};
 
 struct jobs    job = {0};
-time_t         sh_mailchk = 600;
+int32_t                sh_mailchk = 600;
 
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/fault.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/fault.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/fault.c   2006-08-05 05:31:04.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/fault.c   2007-02-14 08:59:55.000000000 
+0100
@@ -71,12 +71,12 @@
        if(sig==SIGWINCH)
        {
                int rows=0, cols=0;
-               long v;
+               int32_t v;
                astwinsize(2,&rows,&cols);
                if(v = cols)
-                       nv_putval(COLUMNS, (char*)&v, NV_INTEGER);
+                       nv_putval(COLUMNS, (char*)&v, NV_INT32);
                if(v = rows)
-                       nv_putval(LINES, (char*)&v, NV_INTEGER);
+                       nv_putval(LINES, (char*)&v, NV_INT32);
        }
 #endif  /* SIGWINCH */
        if(sh.savesig)
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/fcin.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/fcin.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/fcin.c    2006-02-09 06:19:29.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/fcin.c    2007-03-01 07:58:58.000000000 
+0100
@@ -121,6 +121,7 @@
        if(_Fcin.fcchar)
                *_Fcin.fclast = _Fcin.fcchar;
        _Fcin.fclast = 0;
+       _Fcin.fcleft = 0;
        return(fcfill());
 }
 
@@ -148,3 +149,63 @@
        _Fcin = *fp;
 }
 
+struct Extra
+{
+       unsigned char   buff[2*MB_LEN_MAX];
+       unsigned char   *next;
+};
+
+int fcmbstate(const char *state, int *s, int *len)
+{
+       static struct Extra     extra;
+       register int            i, c, n;
+       if(_Fcin.fcleft)
+       {
+               if((c = mbsize(extra.next)) < 0)
+                       c = 1;
+               if((_Fcin.fcleft -= c) <=0)
+               {
+                       _Fcin.fcptr = (unsigned char*)fcfirst() - _Fcin.fcleft; 
+                       _Fcin.fcleft = 0;
+               }
+               *len = c;
+               if(c==1)
+                       *s = state[*extra.next++];
+               else if(c==0)
+                       _Fcin.fcleft = 0;
+               else
+               {
+                       c = mbchar(extra.next);
+                       *s = state['a'];
+               }
+               return(c);
+       }
+       switch(*len = mbsize(_Fcin.fcptr))
+       {
+           case -1:
+               if(_Fcin._fcfile && (n=(_Fcin.fclast-_Fcin.fcptr)) < MB_LEN_MAX)
+               {
+                       memcmp(extra.buff, _Fcin.fcptr, n);
+                       _Fcin.fcptr = _Fcin.fclast;
+                       for(i=n; i < MB_LEN_MAX+n; i++)
+                       {
+                               if((extra.buff[i] = fcgetc(c))==0)
+                                       break;
+                       }
+                       _Fcin.fcleft = n;
+                       extra.next = extra.buff;
+                       return(fcmbstate(state,s,len));
+               }
+               *len = 1;
+               /* fall through */
+           case 0:
+           case 1:
+               *s = state[c=fcget()];
+               break;
+           default:
+               c = mbchar(_Fcin.fcptr);
+               *s = state['a'];
+       }
+       return(c);
+} 
+
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/init.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/init.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/init.c    2007-01-12 08:35:51.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/init.c    2007-03-14 17:02:29.000000000 
+0100
@@ -44,7 +44,6 @@
 #include       "FEATURE/time"
 #include       "FEATURE/dynamic"
 #include       "lexstates.h"
-#include       "FEATURE/locale"
 #include       "version.h"
 
 #if SHOPT_MULTIBYTE
@@ -79,7 +78,7 @@
 {
        Namfun_t        hdr;
        Shell_t         *sh;
-       long            rand_last;
+       int32_t         rand_last;
 };
 
 struct ifs
@@ -1269,7 +1268,7 @@
 #endif /* _hdr_locale */
        (PPIDNOD)->nvalue.lp = (&shp->ppid);
        (TMOUTNOD)->nvalue.lp = (&shp->st.tmout);
-       (MCHKNOD)->nvalue.lp = (long*)(&sh_mailchk);
+       (MCHKNOD)->nvalue.lp = (&sh_mailchk);
        (OPTINDNOD)->nvalue.lp = (&shp->st.optindex);
        /* set up the seconds clock */
        shp->alias_tree = inittree(shp,shtab_aliases);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/io.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/io.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/io.c      2006-12-11 20:27:10.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/io.c      2007-03-20 21:22:35.000000000 
+0100
@@ -656,7 +656,7 @@
                }
 #endif
        }
-       if (fd > 0)
+       if (fd >= 0)
        {
                if((mode=sh_iocheckfd(fd))==IOCLOSE)
                        return(-1);
@@ -975,6 +975,8 @@
                        }
                        else if(iof&IORDW)
                        {
+                               if(sh_isoption(SH_RESTRICTED))
+                                       
errormsg(SH_DICT,ERROR_exit(1),e_restricted,fname);
                                io_op[2] = '>';
                                o_mode = O_RDWR|O_CREAT;
                                goto openit;
@@ -1145,7 +1147,7 @@
                        {
                                if(np)
                                {
-                                       long v;
+                                       int32_t v;
                                        fn = fd;
                                        if(fd<10)
                                        {
@@ -1156,9 +1158,9 @@
                                                fd = fn;
                                        }
                                        nv_unset(np);
-                                       nv_onattr(np,NV_INTEGER);
+                                       nv_onattr(np,NV_INT32);
                                        v = fn;
-                                       nv_putval(np,(void*)&v, NV_INTEGER);
+                                       nv_putval(np,(char*)&v, NV_INT32);
                                        sh_iocheckfd(fd);
                                }
                                else
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/jobs.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/jobs.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/jobs.c    2006-10-25 02:55:22.000000000 
+0200
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/jobs.c    2007-03-03 02:42:46.000000000 
+0100
@@ -271,7 +271,10 @@
                        continue;
                }
                else if (WIFCONTINUED(wstat) && wcontinued)
+               {
                        pw->p_flag &= ~(P_NOTIFY|P_SIGNALLED|P_STOPPED);
+                       pw->p_exit = 0;
+               }
                else
 #endif /* SIGTSTP */
                {
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/lex.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/lex.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/lex.c     2007-01-05 23:24:09.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/lex.c     2007-03-21 19:24:38.000000000 
+0100
@@ -302,38 +302,6 @@
 #define sh_lex lextoken
 #endif
 
-#if SHOPT_MULTIBYTE
-static int mb_stateskip(const char *state, int *c, int *len)
-{
-       int curChar, lexState;
-       lexState = 0;
-       do
-       {
-               switch(*len = mbsize(_Fcin.fcptr))
-               {
-                   case -1: /* bogus multiByte char - parse as bytes? */
-                   case 0: /* NULL byte */
-                   case 1:
-                                lexState = state[curChar=fcget()];
-                                break;
-                   default:
-                        /*
-                        * None of the state tables contain entries
-                        * for multibyte characters.  However, they
-                        * should be treated the same as any other
-                        * alpha character, so we'll use the state
-                        * which would normally be assigned to the
-                        * 'a' character.
-                        */
-                       curChar = mbchar(_Fcin.fcptr);
-                       lexState = state['a'];
-               }
-       }
-       while(lexState == 0);
-       *c = curChar;
-       return(lexState);
-}
-#endif /* SHOPT_MULTIBYTE */
 /*
  * Get the next word and put it on the top of the stak
  * A pointer to the current word is stored in shlex.arg
@@ -346,12 +314,10 @@
        register int    n, c, mode=ST_BEGIN, wordflags=0;
        register Lex_t *lp = (Lex_t*)shp->lex_context;
        int             inlevel=lexd.level, assignment=0, ingrave=0;
+       Sfio_t *sp;
 #if SHOPT_MULTIBYTE
-       int LEN;
-#else
-#      define LEN      1
+       LEN=1;
 #endif /* SHOPT_MULTIBYTE */
-       Sfio_t *sp;
        if(lexd.paren)
        {
                lexd.paren = 0;
@@ -398,17 +364,7 @@
        {
                /* skip over characters in the current state */
                state = sh_lexstates[mode];
-#if SHOPT_MULTIBYTE
-               LEN=1;
-               if(mbwide())
-               {
-                       int curchar;
-                       n = mb_stateskip(state, &curchar, &LEN);
-                       c = curchar;
-               }
-               else
-#endif /* SHOPT_MULTIBYTE */
-               while((n = state[c=fcget()])==0);
+               while((n=STATE(state,c))==0);
                switch(n)
                {
                        case S_BREAK:
@@ -602,7 +558,11 @@
                                        else if(c!='<' && c!='>')
                                                n = 0;
                                        else if(n==LPAREN)
+                                       {
                                                c  |= SYMLPAR;
+                                               lex.reservok = 1;
+                                               lex.skipword = 0;
+                                       }
                                        else if(n=='|')
                                                c  |= SYMPIPE;
                                        else if(c=='<' && n=='>')
@@ -1656,30 +1616,8 @@
        {
                if(n!=S_NL)
                {
-#if SHOPT_MULTIBYTE
-                       if(mbwide())
-                       {
-                               do
-                               {
-                                       switch(mbsize(_Fcin.fcptr))
-                                       {
-                                           case -1:    /* bogus multiByte char 
- parse as bytes? */
-                                           case 0:     /* NULL byte */
-                                           case 1:
-                                               n = state[fcget()];
-                                               break;
-                                           default:
-                                               /* treat as alpha */
-                                               mbchar(_Fcin.fcptr);
-                                               n = state['a'];
-                                       }
-                               }
-                               while(n == 0);
-                       }
-                       else
-#endif /* SHOPT_MULTIBYTE */
                        /* skip over regular characters */
-                       while((n=state[fcget()])==0);
+                       while((n=STATE(state,c))==0);
                }
                if(n==S_EOF || !(c=fcget()))
                {
@@ -2065,7 +2003,7 @@
                                        }
                                        *--dp = 0;
 #if ERROR_VERSION >= 20000317L
-                                       msg = 
ERROR_translate(0,0,error_info.id,ep);
+                                       msg = 
ERROR_translate(0,error_info.id,0,ep);
 #else
 #   if ERROR_VERSION >= 20000101L
                                        msg = ERROR_translate(error_info.id,ep);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/macro.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/macro.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/macro.c   2006-12-18 17:45:48.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/macro.c   2007-02-20 17:21:07.000000000 
+0100
@@ -48,6 +48,10 @@
 #   define STR_GROUP   0
 #endif
 
+#if !SHOPT_MULTIBYTE
+#define mbchar(p)       (*(unsigned char*)p++)
+#endif
+
 static int     _c_;
 typedef struct  _mac_
 {
@@ -407,6 +411,7 @@
        int             oldquote = mp->quote;
        int             ansi_c = 0;
        int             paren = 0;
+       int             ere = 0;
        int             brace = 0;
        Sfio_t          *sp = mp->sp;
        mp->sp = NIL(Sfio_t*);
@@ -502,7 +507,7 @@
                        {
                                /* preserve \digit for pattern matching */
                                /* also \alpha for extended patterns */
-                               if(!mp->lit && !mp->quote && (n==S_DIG || 
(paren && sh_lexstates[ST_DOL][*(unsigned char*)cp]==S_ALP)))
+                               if(!mp->lit && !mp->quote && (n==S_DIG || 
((paren+ere) && sh_lexstates[ST_DOL][*(unsigned char*)cp]==S_ALP)))
                                        break;
                                /* followed by file expansion */
                                if(!mp->lit && (n==S_ESC || (!mp->quote && 
@@ -637,7 +642,15 @@
                        {
                                mp->patfound = mp->pattern;
                                if((n=cp[-1])==LPAREN)
+                               {
                                        paren++;
+                                       if((cp-first)>1 && cp[-2]=='~')
+                                       {
+                                               char *p = cp;
+                                               while((c=mbchar(p)) && 
c!=RPAREN && c!='E');
+                                               ere = c=='E';
+                                       }
+                               }
                                else if(n==RPAREN)
                                        --paren;
                        }
@@ -919,7 +932,8 @@
        mp->zeros = 0;
        idbuff[0] = 0;
        idbuff[1] = 0;
-       switch(sh_lexstates[ST_DOL][c=fcget()])
+       c = fcget();
+       switch(c>0x7f?S_ALP:sh_lexstates[ST_DOL][c])
        {
            case S_RBRA:
                if(type<M_SIZE)
@@ -1020,7 +1034,7 @@
                        np = 0;
                        do
                                stakputc(c);
-                       while(((c=fcget()),isaname(c))||type && c=='.');
+                       while(((c=fcget()),(c>0x7f||isaname(c)))||type && 
c=='.');
                        while(c==LBRACT && type)
                        {
                                sh.argaddr=0;
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/main.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/main.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/main.c    2007-01-12 01:01:02.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/main.c    2007-03-05 23:51:41.000000000 
+0100
@@ -135,10 +135,9 @@
        register char   *name;
        register int    fdin;
        register Sfio_t  *iop;
-       register int    rshflag;        /* set for restricted shell */
        register Shell_t *shp;
        struct stat     statb;
-       int i;
+       int i, rshflag;         /* set for restricted shell */
        char *command;
 #ifdef _lib_sigvec
        /* This is to clear mask that my be left on by rlogin */
@@ -161,6 +160,8 @@
        {
                /* begin script execution here */
                sh_reinit((char**)0);
+               if(rshflag)
+                       sh_onoption(SH_RESTRICTED);
        }
        shp->fn_depth = shp->dot_depth = 0;
        command = error_info.id;
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/name.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/name.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/name.c    2007-01-04 05:08:27.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/name.c    2007-03-28 07:19:13.000000000 
+0200
@@ -31,7 +31,6 @@
 #include       "path.h"
 #include       "lexstates.h"
 #include       "timeout.h"
-#include       "FEATURE/locale"
 #include       "FEATURE/externs"
 #include       "streval.h"
 
@@ -75,6 +74,10 @@
 #   define _data        data
 #endif
 
+#if !SHOPT_MULTIBYTE
+#   define mbchar(p)       (*(unsigned char*)p++)
+#endif /* SHOPT_MULTIBYTE */
+
 /* ========    name value pair routines        ======== */
 
 #include       "shnodes.h"
@@ -414,7 +417,7 @@
 
 Namval_t *nv_create(const char *name, Dt_t *root, int flags, Namfun_t *dp)
 {
-       register char           *cp=(char*)name, *sp;
+       char                    *cp=(char*)name, *sp, *xp;
        register int            c;
        register Namval_t       *np=0, *nq=0;
        Namfun_t                *fp=0;
@@ -505,11 +508,13 @@
                                }
                                while(nv_isref(np))
                                {
-                                       sub = np->nvenv;
-                                       sh.last_table = nv_table(np);
+                                       root = nv_reftree(np);
+                                       sh.last_table = nv_reftable(np);
+                                       sub = nv_refsub(np);
                                        np = nv_refnode(np);
                                        if(sub && c!='.')
                                                nv_putsub(np,sub,0L);
+                                       flags |= NV_NOSCOPE;
                                }
                                if(sub && c==0)
                                        return(np);
@@ -529,6 +534,7 @@
                                }
                                flags |= NV_NOREF;
                        }
+                       sh.last_root = root;
                        do
                        {
                                if(!np)
@@ -654,9 +660,10 @@
                        break;
                    default:
                        dp->last = cp;
-                       if(!isaletter(c))
+                       if((c = mbchar(cp)) && !isaletter(c))
                                return(np);
-                       while(c= *(unsigned char*)(++cp),isaname(c));
+                       while(xp=cp, c=mbchar(cp), isaname(c));
+                       cp = xp;
                }
        }
        return(np);
@@ -691,6 +698,7 @@
        sh.last_table = sh.namespace;
        if(!root)
                root = sh.var_tree;
+       sh.last_root = root;
        if(root==sh_subfuntree(1))
        {
                flags |= NV_NOREF;
@@ -716,7 +724,7 @@
                {
                        while(nv_isref(np))
                        {
-                               sh.last_table = nv_table(np);
+                               sh.last_table = nv_reftable(np);
                                np = nv_refnode(np);
                        }
                }
@@ -915,7 +923,7 @@
                }
                else
                {
-                       if(nv_isattr(np, NV_LONG) && 
sizeof(long)<sizeof(Sflong_t))
+                       if(nv_isattr(np, NV_LONG) && 
sizeof(int32_t)<sizeof(Sflong_t))
                        {
                                Sflong_t ll=0,oll=0;
                                if(flags&NV_INTEGER)
@@ -934,18 +942,18 @@
                                                if(flags&NV_LONG)
                                                        ll = *((Sfulong_t*)sp);
                                                else if(flags&NV_SHORT)
-                                                       ll = *((unsigned 
short*)sp);
+                                                       ll = *((uint16_t*)sp);
                                                else
-                                                       ll = *((unsigned 
long*)sp);
+                                                       ll = *((uint32_t*)sp);
                                        }
                                        else
                                        {
                                                if(flags&NV_LONG)
                                                        ll = *((Sflong_t*)sp);
                                                else if(flags&NV_SHORT)
-                                                       ll = *((short*)sp);
+                                                       ll = *((uint16_t*)sp);
                                                else
-                                                       ll = *((long*)sp);
+                                                       ll = *((uint32_t*)sp);
                                        }
                                }
                                else if(sp)
@@ -958,7 +966,7 @@
                        }
                        else
                        {
-                               long l=0,ol=0;
+                               int32_t l=0,ol=0;
                                if(flags&NV_INTEGER)
                                {
                                        if(flags&NV_DOUBLE)
@@ -970,49 +978,49 @@
                                                        ll = *((float*)sp);
                                                else
                                                        ll = *((double*)sp);
-                                               l = (long)ll;
+                                               l = (int32_t)ll;
                                        }
                                        else if(nv_isattr(np,NV_UNSIGN))
                                        {
                                                if(flags&NV_LONG)
                                                        l = *((Sfulong_t*)sp);
                                                else if(flags&NV_SHORT)
-                                                       l = *((unsigned 
short*)sp);
+                                                       l = *((uint16_t*)sp);
                                                else
-                                                       l = *(unsigned long*)sp;
+                                                       l = *(uint32_t*)sp;
                                        }
                                        else
                                        {
                                                if(flags&NV_LONG)
                                                        l = *((Sflong_t*)sp);
                                                else if(flags&NV_SHORT)
-                                                       l = *((short*)sp);
+                                                       l = *((int16_t*)sp);
                                                else
-                                                       l = *(long*)sp;
+                                                       l = *(int32_t*)sp;
                                        }
                                }
                                else if(sp)
                                {
                                        Sfdouble_t ld = sh_arith(sp);
                                        if(ld<0)
-                                               l = (long)ld;
+                                               l = (int32_t)ld;
                                        else
-                                               l = (unsigned long)ld;
+                                               l = (uint32_t)ld;
                                }
                                if(nv_size(np) <= 1)
                                        nv_setsize(np,10);
                                if(nv_isattr (np, NV_SHORT))
                                {
-                                       short s=0;
+                                       int16_t s=0;
                                        if(flags&NV_APPEND)
                                                s = up->s;
-                                       up->s = s+(short)l;
+                                       up->s = s+(int16_t)l;
                                        nv_onattr(np,NV_NOFREE);
                                }
                                else
                                {
                                        if(!up->lp)
-                                               up->lp = new_of(long,0);
+                                               up->lp = new_of(int32_t,0);
                                        else if(flags&NV_APPEND)        
                                                ol =  *(up->lp);
                                        *(up->lp) = l+ol;
@@ -1039,7 +1047,7 @@
                        else if(flags&NV_LONG)
                                sfprintf(sh.strbuf,"%lld\0",*((Sflong_t*)sp));
                        else
-                               sfprintf(sh.strbuf,"%ld\0",*((long*)sp));
+                               sfprintf(sh.strbuf,"%ld\0",*((int32_t*)sp));
                        sp = sfstruse(sh.strbuf);
                }
                if(nv_isattr(np, NV_HOST)==NV_HOST && sp)
@@ -1496,8 +1504,8 @@
                if(nv_isref(np))
                {
                        nv_offattr(np,NV_NOFREE|NV_REF);
+                       free((void*)np->nvalue.nrp);
                        np->nvalue.cp = 0;
-                       np->nvfun = 0;
                }
                if(!cp)
                        return;
@@ -1598,11 +1606,7 @@
        if(!nv_isarray(np) || !nv_arrayptr(np))
        {
                if(nv_isref(np))
-               {
-                       if(np->nvenv)
-                               free((void*)np->nvenv);
-                       np->nvfun = 0;
-               }
+                       free((void*)np->nvalue.nrp);
                nv_setsize(np,0);
                if(!nv_isattr(np,NV_MINIMAL) || nv_isattr(np,NV_EXPORT))
                {
@@ -1781,8 +1785,8 @@
                goto done;
        if(nv_isref(np))
        {
-               sh.last_table = nv_table(np);
-               return(nv_name(up->np));
+               sh.last_table = nv_reftable(np);
+               return(nv_name(nv_refnode(np)));
        }
        if(np->nvfun)
        {
@@ -1829,9 +1833,9 @@
                        if(nv_isattr (np,NV_LONG))
                                ll = *(Sfulong_t*)up->llp;
                        else if(nv_isattr (np,NV_SHORT))
-                               ll = (unsigned short)up->s;
+                               ll = (uint16_t)up->s;
                        else
-                               ll = *(unsigned long*)(up->lp);
+                               ll = *(uint32_t*)(up->lp);
                }
                else if(nv_isattr (np,NV_LONG))
                        ll = *up->llp;
@@ -1911,9 +1915,9 @@
                        if(nv_isattr(np, NV_LONG))
                                r = (Sflong_t)*((Sfulong_t*)up->llp);
                        else if(nv_isattr(np, NV_SHORT))
-                               r = (Sflong_t)((unsigned short)up->s);
+                               r = (Sflong_t)((uint16_t)up->s);
                        else
-                               r = *((unsigned long*)up->lp);
+                               r = *((uint32_t*)up->lp);
                }
                else
                {
@@ -1950,7 +1954,7 @@
        int oldsize,oldatts;
 
        /* check for restrictions */
-       if(sh_isoption(SH_RESTRICTED) && ((sp=nv_name(np))==nv_name(PATHNOD) || 
sp==nv_name(SHELLNOD) || sp==nv_name(ENVNOD) ))
+       if(sh_isoption(SH_RESTRICTED) && ((sp=nv_name(np))==nv_name(PATHNOD) || 
sp==nv_name(SHELLNOD) || sp==nv_name(ENVNOD) || sp==nv_name(FPATHNOD)))
                errormsg(SH_DICT,ERROR_exit(1),e_restricted,nv_name(np));
        /* handle attributes that do not change data separately */
        n = np->nvflag;
@@ -2044,7 +2048,7 @@
 }
 
 /*
- * This version of getenv the hash storage to access environment values
+ * This version of getenv uses the hash storage to access environment values
  */
 char *getenv(const char *name)
 /*@
@@ -2056,6 +2060,8 @@
                return(oldgetenv(name));
        if((np = nv_search(name,sh.var_tree,0)) && nv_isattr(np,NV_EXPORT))
                return(nv_getval(np));
+       if(name[0] == 'P' && name[1] == 'A' && name[2] == 'T' && name[3] == 'H' 
&& name[4] == 0)
+               return(oldgetenv(name));
        return(0);
 }
 #endif /* _NEXT_SOURCE */
@@ -2146,13 +2152,12 @@
 }
 
 /*
- * Create a reference node from <np>
+ * Create a reference node from <np> to $np in dictionary <hp> 
  */
-void nv_setref(register Namval_t *np)
+void nv_setref(register Namval_t *np, Dt_t *hp, int flags)
 {
        register Namval_t *nq, *nr;
        register char *ep,*cp;
-       Dt_t *hp=sh.var_tree;
        if(nv_isref(np))
                return;
        if(nv_isarray(np))
@@ -2161,18 +2166,13 @@
                errormsg(SH_DICT,ERROR_exit(1),e_noref,nv_name(np));
        if((ep = lastdot(cp)) && nv_isattr(np,NV_MINIMAL))
                errormsg(SH_DICT,ERROR_exit(1),e_badref,nv_name(np));
-       if(nv_isattr(np,NV_PARAM))
-       {
-               if(sh.st.prevst && !(hp=(Dt_t*)sh.st.prevst->save_tree))
-               {
-                       if(!(hp=dtvnext(sh.var_tree)))
-                               hp = sh.var_tree;
-               }
-       }
-       nr= nq = nv_open(cp, hp, NV_VARNAME|NV_NOREF);
+       if(!hp)
+               hp = sh.var_tree;
+       nr= nq = nv_open(cp, hp, flags|NV_NOREF);
        while(nv_isref(nr))
        {
-               sh.last_table = nv_table(nr);
+               sh.last_table = nv_reftable(nr);
+               hp = nv_reftree(nr);
                nr = nv_refnode(nr);
        }
        if(nr==np) 
@@ -2192,10 +2192,12 @@
                ep = nv_getsub(nq);
        }
        nv_unset(np);
-       np->nvalue.np = nq;
+       np->nvalue.nrp = newof(0,struct Namref,1,0);
+       np->nvalue.nrp->np = nq;
+       np->nvalue.nrp->root = hp;
        if(ep)
-               np->nvenv = strdup(ep);
-       np->nvfun = (Namfun_t*)sh.last_table;
+               np->nvalue.nrp->sub = strdup(ep);
+       np->nvalue.nrp->table = sh.last_table;
        nv_onattr(np,NV_REF|NV_NOFREE);
 }
 
@@ -2256,12 +2258,13 @@
  */
 void nv_unref(register Namval_t *np)
 {
-       Namval_t *nq = nv_refnode(np);
+       Namval_t *nq;
        if(!nv_isref(np))
                return;
+       nq = nv_refnode(np);
        nv_offattr(np,NV_NOFREE|NV_REF);
-       np->nvalue.cp = strdup(nv_name(nq=nv_refnode(np)));
-       np->nvfun = 0;
+       free((void*)np->nvalue.nrp);
+       np->nvalue.cp = strdup(nv_name(nq));
 #if SHOPT_OPTIMIZE
        {
                Namfun_t *fp;
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/nvdisc.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/nvdisc.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/nvdisc.c  2006-12-04 21:53:11.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/nvdisc.c  2007-02-14 09:07:50.000000000 
+0100
@@ -75,7 +75,7 @@
 Sfdouble_t nv_getn(Namval_t *np, register Namfun_t *nfp)
 {
        register Namfun_t       *fp;
-       register Sfdouble_t d=0;
+       register Sfdouble_t     d=0;
        char *str;
        if((fp = nfp) != NIL(Namfun_t*) && !nv_local)
                fp = nfp = nfp->next;
@@ -768,9 +768,9 @@
                if(nv_isattr(np,NV_LONG))
                        size = sizeof(Sflong_t);
                else if(nv_isattr(np,NV_SHORT))
-                       size = sizeof(short);
+                       size = sizeof(int16_t);
                else
-                       size = sizeof(long);
+                       size = sizeof(int32_t);
        }
        if(!(nval = malloc(size)))
                return(0);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/nvtree.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/nvtree.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/nvtree.c  2006-12-14 03:46:11.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/nvtree.c  2007-02-19 21:48:09.000000000 
+0100
@@ -374,18 +374,26 @@
        }
 }
 
-static void outval(char *name, const char *vname, Sfio_t *outfile, int indent, 
int noscope)
+struct Walk
+{
+       Sfio_t  *out;
+       Dt_t    *root;
+       int     noscope;
+       int     indent;
+};
+
+static void outval(char *name, const char *vname, struct Walk *wp)
 {
        register Namval_t *np, *nq;
         register Namfun_t *fp;
        int isarray=0, associative=0, special=0;
-       
if(!(np=nv_open(vname,sh.var_tree,NV_ARRAY|NV_VARNAME|NV_NOADD|NV_NOASSIGN|noscope)))
+       
if(!(np=nv_open(vname,wp->root,NV_ARRAY|NV_VARNAME|NV_NOADD|NV_NOASSIGN|wp->noscope)))
                return;
        if(nv_isarray(np) && *name=='.')
                special = 1;
        if(!special && (fp=nv_hasdisc(np,&treedisc)))
        {
-               if(!outfile)
+               if(!wp->out)
                {
                        fp = nv_stack(np,fp);
                        if(fp = nv_stack(np,NIL(Namfun_t*)))
@@ -403,9 +411,9 @@
                if(array_elem(nv_arrayptr(np))==0)
                        isarray=2;
                else
-                       nq = 
nv_putsub(np,NIL(char*),ARRAY_SCAN|(outfile?ARRAY_NOCHILD:0));
+                       nq = 
nv_putsub(np,NIL(char*),ARRAY_SCAN|(wp->out?ARRAY_NOCHILD:0));
        }
-       if(!outfile)
+       if(!wp->out)
        {
                _nv_unset(np,NV_RDONLY);
                nv_close(np);
@@ -416,20 +424,20 @@
        if(special)
        {
                associative = 1;
-               sfnputc(outfile,'\t',indent);
+               sfnputc(wp->out,'\t',wp->indent);
        }
        else
        {
-               sfnputc(outfile,'\t',indent);
-               nv_attribute(np,outfile,"typeset",'=');
-               nv_outname(outfile,name,-1);
-               sfputc(outfile,(isarray==2?'\n':'='));
+               sfnputc(wp->out,'\t',wp->indent);
+               nv_attribute(np,wp->out,"typeset",'=');
+               nv_outname(wp->out,name,-1);
+               sfputc(wp->out,(isarray==2?'\n':'='));
                if(isarray)
                {
                        if(isarray==2)
                                return;
-                       sfwrite(outfile,"(\n",2);
-                       sfnputc(outfile,'\t',++indent);
+                       sfwrite(wp->out,"(\n",2);
+                       sfnputc(wp->out,'\t',++wp->indent);
                }
        }
        while(1)
@@ -439,8 +447,8 @@
                {
                        if(!(fmtq = nv_getsub(np)))
                                break;
-                       sfprintf(outfile,"[%s]",sh_fmtq(fmtq));
-                       sfputc(outfile,'=');
+                       sfprintf(wp->out,"[%s]",sh_fmtq(fmtq));
+                       sfputc(wp->out,'=');
                }
                if(!(fmtq = sh_fmtq(nv_getval(np))))
                        fmtq = "";
@@ -449,33 +457,34 @@
                        char *qp = strchr(fmtq,'\'');
                        if(!qp || qp>ep)
                        {
-                               sfwrite(outfile,fmtq,ep-fmtq);
-                               sfputc(outfile,'\\');
+                               sfwrite(wp->out,fmtq,ep-fmtq);
+                               sfputc(wp->out,'\\');
                                fmtq = ep;
                        }
                }
                if(*name=='[' && !isarray)
-                       sfprintf(outfile,"(%s)\n",fmtq);
+                       sfprintf(wp->out,"(%s)\n",fmtq);
                else
-                       sfputr(outfile,fmtq,'\n');
+                       sfputr(wp->out,fmtq,'\n');
                if(!nv_nextsub(np))
                        break;
-               sfnputc(outfile,'\t',indent);
+               sfnputc(wp->out,'\t',wp->indent);
        }
        if(isarray && !special)
        {
-               sfnputc(outfile,'\t',--indent);
-               sfwrite(outfile,")\n",2);
+               sfnputc(wp->out,'\t',--wp->indent);
+               sfwrite(wp->out,")\n",2);
        }
 }
 
 /*
  * format initialization list given a list of assignments <argp>
  */
-static char **genvalue(char **argv, register Sfio_t *outfile, const char 
*prefix, int n, int indent, int noscope)
+static char **genvalue(char **argv, const char *prefix, int n, struct Walk *wp)
 {
        register char *cp,*nextcp,*arg;
        register int m,r;
+       register Sfio_t *outfile = wp->out;
        if(n==0)
                m = strlen(prefix);
        else if(cp=nextdot(prefix))
@@ -486,7 +495,7 @@
        if(outfile)
        {
                sfwrite(outfile,"(\n",2);
-               indent++;
+               wp->indent++;
        }
        for(; arg= *argv; argv++)
        {
@@ -505,11 +514,11 @@
                        {
                                if(outfile)
                                {
-                                       sfnputc(outfile,'\t',indent);
+                                       sfnputc(outfile,'\t',wp->indent);
                                        nv_outname(outfile,cp,nextcp-cp);
                                        sfputc(outfile,'=');
                                }
-                               argv = genvalue(argv,outfile,cp,n+m+r 
,indent,noscope);
+                               argv = genvalue(argv,cp,n+m+r,wp);
                                if(outfile)
                                        sfputc(outfile,'\n');
                                if(*argv)
@@ -518,25 +527,25 @@
                        }
                        else if(outfile && argv[1] && 
memcmp(arg,argv[1],r=strlen(arg))==0 && argv[1][r]=='[')
                        {
-                               Namval_t *np = 
nv_open(arg,sh.var_tree,NV_VARNAME|NV_NOADD|NV_NOASSIGN|noscope);
+                               Namval_t *np = 
nv_open(arg,wp->root,NV_VARNAME|NV_NOADD|NV_NOASSIGN|wp->noscope);
                                if(!np)
                                        continue;
-                               sfnputc(outfile,'\t',indent);
+                               sfnputc(outfile,'\t',wp->indent);
                                nv_attribute(np,outfile,"typeset",1);
                                nv_close(np);
                                sfputr(outfile,arg+m+(n?n+1:0),'=');
-                               argv = genvalue(++argv,outfile,cp,cp-arg 
,indent,noscope);
+                               argv = genvalue(++argv,cp,cp-arg ,wp);
                                sfputc(outfile,'\n');
                        }
                        else if(outfile && *cp=='[')
                        {
-                               sfnputc(outfile,'\t',indent);
+                               sfnputc(outfile,'\t',wp->indent);
                                sfputr(outfile,cp,'=');
-                               argv = genvalue(++argv,outfile,cp,cp-arg 
,indent,noscope);
+                               argv = genvalue(++argv,cp,cp-arg ,wp);
                                sfputc(outfile,'\n');
                        }
                        else
-                               outval(cp,arg,outfile,indent,noscope);
+                               outval(cp,arg,wp);
                }
                else
                        break;
@@ -547,10 +556,10 @@
                cp = (char*)prefix;
                if(c=='.')
                        cp[m-1] = 0;
-               outval(".",prefix-n,outfile,indent,noscope);
+               outval(".",prefix-n,wp);
                if(c=='.')
                        cp[m-1] = c;
-               sfnputc(outfile,'\t',indent-1);
+               sfnputc(outfile,'\t',wp->indent-1);
                sfputc(outfile,')');
        }
        return(--argv);
@@ -562,6 +571,7 @@
 static char *walk_tree(register Namval_t *np, int dlete)
 {
        static Sfio_t *out;
+       struct Walk walk;
        Sfio_t *outfile;
        int savtop = staktell();
        char *savptr = stakfreeze(0);
@@ -605,7 +615,11 @@
                outfile = out =  
sfnew((Sfio_t*)0,(char*)0,-1,-1,SF_WRITE|SF_STRING);
        else
                sfseek(outfile,0L,SEEK_SET);
-       genvalue(argv,outfile,name,0,0,noscope);
+       walk.out = outfile;
+       walk.root = sh.last_root;
+       walk.indent = 0;
+       walk.noscope = noscope;
+       genvalue(argv,name,0,&walk);
        stakset(savptr,savtop);
        if(!outfile)
                return((char*)0);
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/path.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/path.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/path.c    2007-01-12 01:02:27.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/path.c    2007-03-06 18:25:51.000000000 
+0100
@@ -663,7 +663,7 @@
                        pp = path_nextcomp(pp,name,0);
                if(endpath)
                        return(endpath);
-               if(!isfun)
+               if(!isfun && !sh_isoption(SH_RESTRICTED))
                {
                        if(nv_search(stakptr(PATH_OFFSET),sh.bltin_tree,0))
                                return(oldpp);
@@ -986,6 +986,24 @@
                path = sp;
        }
 #endif /* SHELLMAGIC */
+       if(sh_isoption(SH_RESTRICTED))
+       {
+               int fd;
+               if((fd = sh_open(opath,O_RDONLY,0)) >= 0)
+               {
+                       char buff[PATH_MAX];
+                       n = read(fd,buff,sizeof(buff));
+                       close(fd);
+                       if(n>2 && buff[0]=='#' && buff[1]=='!')
+                       {
+                               for(s=buff; n>0 && *s!='\n'; n--,s++)
+                               {
+                                       if(*s=='/')
+                                               
errormsg(SH_DICT,ERROR_exit(1),e_restricted,opath);
+                               }
+                       }
+               }
+       }
        if(spawn && !sh_isoption(SH_PFSH))
                pid = _spawnveg(opath, &argv[0],envp, spawn>>1);
        else
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/streval.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/streval.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/streval.c 2006-12-20 20:34:34.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/streval.c 2007-02-12 17:53:30.000000000 
+0100
@@ -230,15 +230,15 @@
                                arith_error(node.value,ptr,ep->emode);
                        *++sp = num;
                        type = node.isfloat;
-                       if(num > LDBL_ULONGLONG_MAX || num < LDBL_LONGLONG_MIN)
+                       if(num > LDBL_ULLONG_MAX || num < LDBL_LLONG_MIN)
                                type = 1;
                        else
                        {
                                Sfdouble_t d=num;
-                               if(num > LDBL_LONGLONG_MAX && num <= 
LDBL_ULONGLONG_MAX)
+                               if(num > LDBL_LLONG_MAX && num <= 
LDBL_ULLONG_MAX)
                                {
                                        type = 2;
-                                       d -= LDBL_LONGLONG_MAX;
+                                       d -= LDBL_LLONG_MAX;
                                }
                                if((Sflong_t)d!=d)
                                        type = 1;
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/subshell.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/subshell.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/subshell.c        2006-10-24 
16:19:13.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/subshell.c        2007-02-26 
22:27:37.000000000 +0100
@@ -167,7 +167,7 @@
        }
        else
        {
-               short subshell;
+               int16_t subshell;
                /* this is the child part of the fork */
                /* setting subpid to 1 causes subshell to exit when reached */
                sh_onstate(SH_FORKED);
@@ -175,7 +175,7 @@
                sh_offstate(SH_MONITOR);
                subshell_data = 0;
                subshell = sh.subshell = 0;
-               nv_putval(SH_SUBSHELLNOD, (char*)&subshell, 
NV_INTEGER|NV_SHORT);
+               nv_putval(SH_SUBSHELLNOD, (char*)&subshell, NV_INT16);
                sp->subpid=0;
        }
 }
@@ -230,7 +230,7 @@
                lq = lp->next;
                if(nv_isarray(mp))
                         nv_putsub(mp,NIL(char*),ARRAY_SCAN);
-               nv_unset(mp);
+               _nv_unset(mp,NV_RDONLY);
                nv_setsize(mp,nv_size(np));
                if(!nv_isattr(np,NV_MINIMAL) || nv_isattr(np,NV_EXPORT))
                        mp->nvenv = np->nvenv;
@@ -296,7 +296,7 @@
        register Namval_t *np,*nq;
        for(np=(Namval_t*)dtfirst(root);np;np=nq)
        {
-               _nv_unset(np,1);
+               _nv_unset(np,NV_RDONLY);
                nq = (Namval_t*)dtnext(root,np);
                dtdelete(root,np);
                free((void*)np);
@@ -329,7 +329,7 @@
        register struct subshell *sp = &sub_data;
        int jmpval,nsig;
        int savecurenv = shp->curenv;
-       short subshell;
+       int16_t subshell;
        char *savsig;
        Sfio_t *iop=0;
        struct checkpt buff;
@@ -347,7 +347,7 @@
        savst = shp->st;
        sh_pushcontext(&buff,SH_JMPSUB);
        subshell = shp->subshell+1;
-       nv_putval(SH_SUBSHELLNOD, (char*)&subshell, NV_INTEGER|NV_SHORT);
+       nv_putval(SH_SUBSHELLNOD, (char*)&subshell, NV_INT16);
        shp->subshell = subshell;
        sp->prev = subshell_data;
        subshell_data = sp;
@@ -482,7 +482,7 @@
        if(shp->subshell)
                shp->subshell--;
        subshell = shp->subshell;
-       nv_putval(SH_SUBSHELLNOD, (char*)&subshell, NV_INTEGER|NV_SHORT);
+       nv_putval(SH_SUBSHELLNOD, (char*)&subshell, NV_INT16);
 #ifdef PATH_BFPATH
        path_delete((Pathcomp_t*)shp->pathlist);
        shp->pathlist = (void*)sp->pathlist;
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh/xec.c 
ksh93_2007_03_28/src/cmd/ksh93/sh/xec.c
--- ksh93_2007_01_11/src/cmd/ksh93/sh/xec.c     2007-01-12 01:01:32.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh/xec.c     2007-03-27 20:10:43.000000000 
+0200
@@ -338,7 +338,7 @@
 {
        Shscope_t       *sp;
        struct Level *lp = (struct Level*)fp;
-       short level, oldlevel = (short)nv_getnum(np);
+       int16_t level, oldlevel = (int16_t)nv_getnum(np);
        nv_putv(np,val,flags,fp);
        level = nv_getnum(np);
        if(level<0 || level > lp->maxlevel)
@@ -364,15 +364,15 @@
  */
 int sh_debug(const char *trap, const char *name, const char *subscript, char 
*const argv[], int flags)
 {
-       struct sh_scoped savst;
-       Shscope_t       *sp, *topmost;
-       Namval_t        *np = SH_COMMANDNOD;
-       struct Level    lev;
-       char            *sav = stakptr(0);
-       int             n=4, offset=staktell();
-       const char      *cp = "+=( ";
-       Sfio_t          *iop = stkstd;
-       short           level;
+       struct sh_scoped        savst;
+       Shscope_t               *sp, *topmost;
+       Namval_t                *np = SH_COMMANDNOD;
+       struct Level            lev;
+       char                    *sav = stakptr(0);
+       int                     n=4, offset=staktell();
+       const char              *cp = "+=( ";
+       Sfio_t                  *iop = stkstd;
+       int16_t                 level;
        if(name)
        {
                sfputr(iop,name,-1);
@@ -411,14 +411,14 @@
        lev.hdr.disc = &level_disc;
        lev.maxlevel = --level;
        nv_unset(SH_LEVELNOD);
-       nv_onattr(SH_LEVELNOD,NV_INTEGER|NV_SHORT|NV_NOFREE);
-       nv_putval(SH_LEVELNOD,(char*)&level,NV_INTEGER|NV_SHORT);
+       nv_onattr(SH_LEVELNOD,NV_INT16|NV_NOFREE);
+       nv_putval(SH_LEVELNOD,(char*)&level,NV_INT16);
        nv_disc(SH_LEVELNOD,&lev.hdr,NV_FIRST);
        savst = sh.st;
        sh.st.trap[SH_DEBUGTRAP] = 0;
        n = sh_trap(trap,0);
        np->nvalue.cp = 0;
-       nv_putval(SH_LEVELNOD,(char*)&level,NV_INTEGER|NV_SHORT);
+       nv_putval(SH_LEVELNOD,(char*)&level,NV_INT16);
        nv_disc(SH_LEVELNOD,&lev.hdr,NV_POP);
        nv_unset(SH_LEVELNOD);
        nv_putval(SH_PATHNAMENOD, sh.st.filename ,NV_NOFREE);
@@ -669,13 +669,23 @@
                                        {
                                                if(checkopt(com,'n'))
                                                        flgs |= NV_NOREF;
+#if SHOPT_TYPEDEF
+                                               else if(checkopt(com,'T'))
+                                               {
+                                                       sh.prefix = NV_CLASS;
+                                                       flgs |= NV_TYPE;
+                       
+                                               }
+#endif /* SHOPT_TYPEDEF */
                                                if(checkopt(com,'A'))
                                                        flgs |= NV_ARRAY;
                                                else if(checkopt(com,'a'))
                                                        flgs |= NV_IARRAY;
-                                               if(sh.fn_depth || np==SYSLOCAL)
+                                               if((sh.fn_depth && !sh.prefix) 
|| np==SYSLOCAL)
                                                        flgs |= NV_NOSCOPE;
                                        }
+                                       else if(np==SYSEXPORT)
+                                               flgs |= NV_EXPORT;
                                        else if(np)
                                                flgs = NV_IDENT|NV_ASSIGN;
 #if 0
@@ -839,7 +849,7 @@
                                                        if(item->strm)
                                                        {
                                                                
sfclrlock(item->strm);
-                                                               if(item->strm 
== sh.hist_ptr->histfp)
+                                                               if(sh.hist_ptr 
&& item->strm == sh.hist_ptr->histfp)
                                                                        
hist_close(sh.hist_ptr);
                                                                else
                                                                        
sfclose(item->strm);
@@ -928,10 +938,13 @@
                                        staklink(slp->slptr);
                                        if(nq)
                                        {
+                                               struct Namref   nr;
                                                sh.last_table = last_table;
+                                               memset(&nr,0,sizeof(nr));
+                                               nr.np = nq;
                                                nv_putval(SH_NAMENOD, 
nv_name(nq), NV_NOFREE);
                                                
memcpy(&node,L_ARGNOD,sizeof(node));
-                                               L_ARGNOD->nvalue.np = nq;
+                                               L_ARGNOD->nvalue.nrp = &nr;
                                                L_ARGNOD->nvenv = 0;
                                                L_ARGNOD->nvfun = 
(Namfun_t*)sh.last_table;
                                                L_ARGNOD->nvflag = 
NV_REF|NV_NOFREE;
@@ -1395,7 +1408,7 @@
                                        nv_putsub(np,NIL(char*),0L);
                                nv_putval(np,cp,0);
                                if(nameref)
-                                       nv_setref(np);
+                                       nv_setref(np,(Dt_t*)0,NV_VARNAME);
                                if(trap=sh.st.trap[SH_DEBUGTRAP])
                                {
                                        av[0] = 
(t->tre.tretyp&COMSCAN)?"select":"for";
@@ -1767,7 +1780,8 @@
                        np = 
nv_open(fname,sh_subfuntree(1),NV_NOASSIGN|NV_NOARRAY|NV_VARNAME|NV_NOSCOPE);
                        if(npv)
                        {
-                               cp = nv_setdisc(npv,cp+1,np,(Namfun_t*)npv);
+                               if(!sh.mktype)
+                                       cp = 
nv_setdisc(npv,cp+1,np,(Namfun_t*)npv);
                                nv_close(npv);
                                if(!cp)
                                        
errormsg(SH_DICT,ERROR_exit(1),e_baddisc,fname);
@@ -2382,9 +2396,12 @@
                 * set ${.sh.name} and ${.sh.subscript}
                 * set _ to reference for ${.sh.name}[$.sh.subscript]
                 */
+               struct Namref   nr;
+               memset(&nr,0,sizeof(nr));
+               nr.np = nq;
                nv_putval(SH_NAMENOD, nv_name(nq), NV_NOFREE);
                memcpy(&node,L_ARGNOD,sizeof(node));
-               L_ARGNOD->nvalue.np = nq;
+               L_ARGNOD->nvalue.nrp = &nr;
                L_ARGNOD->nvenv = 0;
                L_ARGNOD->nvfun = (Namfun_t*)sh.last_table;
                L_ARGNOD->nvflag = NV_REF|NV_NOFREE;
@@ -2796,6 +2813,8 @@
                        path = shp->lastpath;
 #endif
                }
+               else if(sh_isoption(SH_RESTRICTED))
+                       errormsg(SH_DICT,ERROR_exit(1),e_restricted,path);
                if(!path)
                {
                        spawnpid = -1;
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/sh.1 
ksh93_2007_03_28/src/cmd/ksh93/sh.1
--- ksh93_2007_01_11/src/cmd/ksh93/sh.1 2007-01-02 03:31:39.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/sh.1 2007-03-06 20:57:14.000000000 +0100
@@ -4337,6 +4337,10 @@
 Line feed and print current line.
 .PP
 .TP 10
+.BI M-^L
+Clear the screen.
+.PP
+.TP 10
 .BI ^@
 (Null character) Set mark.
 .PP
@@ -5202,6 +5206,19 @@
 The entry point function name is determined by prepending
 .B b_
 to the built-in name.
+The ISO C/C++ prototype is
+\f3b_\fP\f2mycommand\fP\f3(int\fP \f2argc\fP, \f3char *\fP\f2argv\fP\f3[]\fP, 
\f3void *\fP\f2context\fP\f3)\fP
+for the builtin command
+.I mycommand\^
+where
+.I argv\^
+is array an of
+.I argc\^
+elements and context is an optional pointer to a
+.B Shell_t
+structure as described in
+.BR <ast/shell.h> .
+.sp .5
 Special built-ins cannot be bound to a pathname or deleted.
 The
 .B \-d
@@ -6011,6 +6028,10 @@
 specifier causes the output to be displayed in 1024 with one of the suffixes
 .B "Ki Mi Gi Ti Pi Ei"
 to indicate the unit.
+.LI
+The
+.B =
+flag has been added to center the output within the specified field width.
 .LE
 .TP
 \f3pwd\fP \*(OK \f3\-LP\fP \*(CK
@@ -6393,7 +6414,7 @@
 .B xtrace
 Same as
 .BR \-x .
-.TP 8
+.PP
 If no option name is supplied, then the current option settings are printed.
 .RE
 .TP 8
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/shopen.mk 
ksh93_2007_03_28/src/cmd/ksh93/shopen.mk
--- ksh93_2007_01_11/src/cmd/ksh93/shopen.mk    1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/cmd/ksh93/shopen.mk    2007-03-20 20:05:22.000000000 
+0100
@@ -0,0 +1,5 @@
+:PACKAGE: --shared ast
+
+.SOURCE : bltins
+
+shopen 1.0 plugin=ksh :LIBRARY: shopen.c
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/attributes.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/attributes.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/attributes.sh  2006-06-28 
19:34:11.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/attributes.sh  2007-03-27 
20:22:54.000000000 +0200
@@ -202,4 +202,14 @@
 fi
 [[ $($SHELL -c 'unset foo;typeset -Z2 foo; print ${foo:-3}' 2> /dev/null) == 3 
]]  || err_exit  '${foo:-3} not 3 when typeset -Z2 field undefined'
 [[ $($SHELL -c 'unset foo;typeset -Z2 foo; print ${foo:=3}' 2> /dev/null) == 
03 ]]  || err_exit  '${foo:=-3} not 3 when typeset -Z2 foo undefined'
+unset foo bar
+unset -f fun
+function fun
+{
+       export foo=hello 
+       typeset -x  bar=world
+} 
+fun
+[[ $(export | grep foo) == 'foo=hello' ]] || err_exit 'export not working in 
functions'
+[[ $(export | grep bar) ]] && err_exit 'typeset -x not local'
 exit   $((Errors))
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/basic.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/basic.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/basic.sh       2006-12-04 
17:38:27.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/basic.sh       2007-03-20 
19:30:26.000000000 +0100
@@ -288,7 +288,8 @@
 [[ $( (trap 'print alarm' ALRM; sleep 4) & sleep 2; kill -ALRM $!) == alarm ]] 
|| err_exit 'ALRM signal not working'
 [[ $($SHELL -c 'trap "" HUP; $SHELL -c "(sleep 2;kill -HUP $$)& sleep 4;print 
done"') != done ]] && err_exit 'ignored traps not being ignored'
 [[ $($SHELL -c 'o=foobar; for x in foo bar; do (o=save);print $o;done' 2> 
/dev/null ) == $'foobar\nfoobar' ]] || err_exit 'for loop optimization subshell 
bug'
-if     [[ -d /dev/fd && -w /dev/fd/3 ]]
+command exec 3<> /dev/null
+if     cat /dev/fd/3 >/dev/null 2>&1
 then   [[ $($SHELL -c 'cat <(print foo)' 2> /dev/null) == foo ]] || err_exit 
'process substitution not working'
        [[ $($SHELL -c 'print $(cat <(print foo) )' 2> /dev/null) == foo ]] || 
err_exit 'process substitution in subshell not working'
        [[ $($SHELL -c  $'tee >(grep \'1$\' > /tmp/ksh'$$'x) > /dev/null <<-  
\!!!
@@ -309,6 +310,8 @@
        done
        wait
        cat /tmp/ksh'$$x 2>> /dev/null) == line1 ]] || err_exit '>() process 
substitution fails in for loop'
+       [[ $({ $SHELL -c 'cat <(for i in x y z; do print $i; done)';} 2> 
/dev/null) == $'x\ny\nz' ]] ||
+               err_exit 'process substitution of compound commands not working'
 fi
 [[ $($SHELL -r 'command -p :' 2>&1) == *restricted* ]]  || err_exit 'command 
-p not restricted'
 print cat >  /tmp/ksh$$x
@@ -318,7 +321,7 @@
 [[ $($SHELL -c 'print -r -- ${X:=$(expr "a(0)" : '"'a*(\([^)]\))')}'" 2> 
/dev/null) == 0 ]] || err_exit '${x:=$(..."...")} failure'
 if     [[ -d /dev/fd  && -w /dev/fd/3 ]]
 then   [[ $(cat <(print hello) ) == hello ]] || err_exit "process substitution 
not working outside for or while loop"
-       [[ $(for i in 1;do cat <(print hello);done ) == hello ]] || err_exit 
"process substitution not working in for or while loop"
+       $SHELL -c '[[ $(for i in 1;do cat <(print hello);done ) == hello ]]' 2> 
/dev/null|| err_exit "process substitution not working in for or while loop"
 fi
 exec 3> /dev/null
 print 'print foo "$@"' > /tmp/ksh$$x
@@ -329,4 +332,5 @@
 [[ $(/tmp/ksh$$x) == /tmp/ksh$$x ]] || err_exit  "\$0 is $0 instead of 
/tmp/ksh$$x"
 rm -f /tmp/ksh$$x
 exec 3<&-
+( typeset -r foo=bar) 2> /dev/null || err_exit 'readonly variables set in a 
subshell cannot unset'
 exit $((Errors))
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/bracket.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/bracket.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/bracket.sh     2006-08-11 
21:12:34.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/bracket.sh     2007-01-26 
20:52:49.000000000 +0100
@@ -227,4 +227,7 @@
 $SHELL -c '[[ att_ == ~(E)(att|cus)_.* ]]' 2> /dev/null || err_exit ' 
~(E)(att|cus)_* pattern not working'
 $SHELL -c '[[ att_ =~ (att|cus)_.* ]]' 2> /dev/null || err_exit ' =~ ere not 
working'
 $SHELL -c '[[ abc =~ a(b)c ]]' 2> /dev/null || err_exit '[[ abc =~ a(b)c ]] 
fails'
+$SHELL -xc '[[ abc =~  \babc\b ]]' 2> /dev/null || err_exit '[[ abc =~ \babc\b 
]] fails'
+[[ abc == ~(E)\babc\b ]] || err_exit '\b not preserved for ere when not in ()'
+[[ abc == ~(iEi)\babc\b ]] || err_exit '\b not preserved for ~(iEi) when not 
in ()'
 exit $((Errors))
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/builtins.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/builtins.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/builtins.sh    2006-12-20 
19:33:39.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/builtins.sh    2007-03-23 
16:49:52.000000000 +0100
@@ -28,6 +28,7 @@
 # test shell builtin commands
 Command=${0##*/}
 integer Errors=0
+builtin getconf
 : ${foo=bar} || err_exit ": failed"
 [[ $foo = bar ]] || err_exit ": side effects failed"
 set -- - foobar
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/coprocess.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/coprocess.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/coprocess.sh   2006-09-15 
22:41:21.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/coprocess.sh   2007-03-21 
08:04:14.000000000 +0100
@@ -119,7 +119,7 @@
 if     (( SECONDS > 8 ))
 then   err_exit 'read -p hanging'
 fi
-( sleep 3 |& sleep 1 && kill $!; sleep 3 |& sleep 1 && kill $! ) || 
+( sleep 3 |& sleep 1 && kill $!; sleep 1; sleep 3 |& sleep 1 && kill $! ) || 
        err_exit "coprocess cleanup not working correctly"
 unset line
 (
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/exit.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/exit.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/exit.sh        2006-11-23 
07:36:57.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/exit.sh        2007-03-23 
16:50:44.000000000 +0100
@@ -36,6 +36,7 @@
 #test for proper exit of shell
 Command=${0##*/}
 integer Errors=0
+builtin getconf
 ABSHELL=$(abspath)
 mkdir /tmp/ksh$$ || err_exit "mkdir /tmp/ksh$$ failed"
 cd /tmp/ksh$$ || err_exit "cd /tmp/ksh$$ failed"
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/glob.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/glob.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/glob.sh        2006-09-15 
23:28:06.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/glob.sh        2007-03-02 
21:51:45.000000000 +0100
@@ -25,7 +25,7 @@
 }
 alias err_exit='err_exit $LINENO'
 
-integer contrary=0 ignorant=0
+integer aware=0 contrary=0 ignorant=0
 
 function test_glob
 {
@@ -53,7 +53,7 @@
        do      got="$got$sep<$arg>"
                sep=" "
        done
-       if      (( ignorant ))
+       if      (( ignorant && aware ))
        then    if      [[ $del ]]
                then    got="<$del> $got"
                fi
@@ -99,6 +99,10 @@
 'b B') contrary=1 ;;
 b|B)   ignorant=1 ;;
 esac
+set -- $(/bin/sh -c 'echo [a-c]')
+case $* in
+B)     aware=1 ;;
+esac
 rm -rf *
 
 touch a b c d abc abd abe bb bcd ca cb dd de Beware
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/nameref.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/nameref.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/nameref.sh     2006-06-28 
19:35:10.000000000 +0200
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/nameref.sh     2007-02-22 
17:23:34.000000000 +0100
@@ -204,6 +204,19 @@
 }
 [[ $(subref ps) == 1 ]] ||  err_exit 'local nameref cannot reference global 
variable child'
 
+function local
+{
+       typeset ps=(typeset -i a=3 b=4)
+       [[ $(subref ps) == 3 ]] ||  err_exit 'local nameref cannot reference 
caller compound variable'
+}
+local
+unset -f local
+function local
+{
+       qs=(integer  a=3; integer b=4)
+}
+local 2> /dev/null || err_exit 'function local has non-zero exit status'
+[[ ${qs.a} == 3 ]] || err_exit 'function cannot set compound global variable' 
 unset fun i
 foo=(x=hi)
 function fun
diff -r -N -u ksh93_2007_01_11/src/cmd/ksh93/tests/substring.sh 
ksh93_2007_03_28/src/cmd/ksh93/tests/substring.sh
--- ksh93_2007_01_11/src/cmd/ksh93/tests/substring.sh   2007-01-05 
00:12:04.000000000 +0100
+++ ksh93_2007_03_28/src/cmd/ksh93/tests/substring.sh   2007-03-20 
19:43:39.000000000 +0100
@@ -496,7 +496,9 @@
 string='foo(d:\nt\box\something)bar'
 expected='d:\nt\box\something'
 [[ ${string/*\(+([!\)])\)*/\1} == "$expected" ]] || err_exit "substring 
expansion failed '${string/*\(+([!\)])\)*/\1}' returned -- '$expected' expected"
-if     $SHELL -c LC_ALL=en_US.UTF-8 2>/dev/null
-then   LC_ALL=en_US.UTF-8 $SHELL -c 'b1="????????????w????????????"; [[ 
${b1:4:1} == w ]]' || err_exit 'Multibyte ${var:offset:len} not working 
correctly'
+if     [[ $($SHELL -c $'export LC_ALL=en_US.UTF-8; print -r 
"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254"
 | wc -m' 2>/dev/null) == 10 ]]
+then   LC_ALL=en_US.UTF-8 $SHELL -c 
b1=$'"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254";
 [[ ${b1:4:1} == w ]]' || err_exit 'Multibyte ${var:offset:len} not working 
correctly'
 fi
+{ $SHELL -c 'unset x;[[ ${SHELL:$x} == $SHELL ]]';} 2> /dev/null || err_exit 
'${var:$x} fails when x is not set' 
+{ $SHELL -c 'x=;[[ ${SHELL:$x} == $SHELL ]]';} 2> /dev/null || err_exit 
'${var:$x} fails when x is null' 
 exit $((Errors))
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/basename.c 
ksh93_2007_03_28/src/lib/libast/comp/basename.c
--- ksh93_2007_01_11/src/lib/libast/comp/basename.c     2006-10-27 
22:52:51.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/basename.c     2007-03-02 
14:57:19.000000000 +0100
@@ -24,7 +24,7 @@
  * basename(3) implementation
  */
 
-#include <ast_common.h>
+#include <ast_std.h>
 
 #if defined(__EXPORT__)
 #define extern __EXPORT__
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/conf.sh 
ksh93_2007_03_28/src/lib/libast/comp/conf.sh
--- ksh93_2007_01_11/src/lib/libast/comp/conf.sh        2007-01-08 
10:32:13.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/comp/conf.sh        2007-03-06 
21:22:41.000000000 +0100
@@ -21,7 +21,7 @@
 ########################################################################
 : generate getconf and limits info
 #
-# @(#)conf.sh (AT&T Research) 2007-01-01
+# @(#)conf.sh (AT&T Research) 2007-03-06
 #
 # this script generates these files from the table file in the first arg
 # the remaining args are the C compiler name and flags
@@ -112,7 +112,7 @@
 '')    trap "code=\$?; rm -f $tmp.*; exit \$code" 0 1 2 ;;
 esac
 
-# determine the _ast_intmax_t printf format
+# determine the intmax_t printf format
 
 cat > $tmp.c <<!
 ${head}
@@ -127,8 +127,8 @@
 }
 !
 if     $cc -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe
-then   FMT='%lld'
-else   FMT='%ld'
+then   LL='ll'
+else   LL='l'
 fi
 
 # set up the names and keys
@@ -472,7 +472,7 @@
                args=
                headers=
                case $name in
-               V[1-9]_*|V[1-9][0-9]_*) underscore=VW ;;
+               V[123456789]_*|V[123456789][0123456789]_*)      underscore=VW ;;
                esac
                case $call in
                CS|SI)  key=CS ;;
@@ -896,7 +896,10 @@
                XX)     case $standard in
                        C)      standard=POSIX ;;
                        esac
-                       flags=FU
+                       case $flags in
+                       *L*)    flags=lFU ;;
+                       *)      flags=FU ;;
+                       esac
                        ;;
                esac
                ;;
@@ -987,14 +990,24 @@
        esac
        conf_limit=0
        case $flags in
-       *L*)    d=
-               eval x='$'CONF_const_${conf_name}
+       *[Ll]*) d=
+               case ${conf_name} in
+               LONG_MAX|SSIZE_MAX)
+                       x=
+                       ;;
+               *)      eval x='$'CONF_const_${conf_name}
+                       ;;
+               esac
                case $x in
                '')     for s in ${values}
                        do      case $s in
                                $sym)   eval x='$'CONF_const_${s}
                                        case $x in
-                                       1)      x=$s
+                                       1)      eval 
a='$'CONF_const_${standard}_${s}
+                                               case $a in
+                                               $x)     x= ;;
+                                               *)      x=$s ;;
+                                               esac
                                                break
                                                ;;
                                        esac
@@ -1005,8 +1018,8 @@
                                        ;;
                                esac
                        done
-                       case ${x:+1}:$flags:$conf_op:${script:+1} in
-                       :*:-1:1|:*X*:*:*)
+                       case ${x:+1}:$flags:$conf_op in
+                       :*:-1|:*X*:*)
                                case $verbose in
                                1)      echo "$command: probe for ${conf_name} 
<limits.h> value" >&2 ;;
                                esac
@@ -1020,12 +1033,35 @@
                                        fi
                                        ;;
                                esac
-                               case ${x:+1}:${script:+1} in
-                               :1)     case $script in
+                               case ${x:+1} in
+                               '')     case $script in
                                        '#'*)   echo "$script" > $tmp.sh
                                                chmod +x $tmp.sh
                                                x=`./$tmp.sh 2>/dev/null`
                                                ;;
+                                       '')     case $conf_name in
+                                               U*LLONG*)       f="%${LL}u" ;;
+                                               *LLONG*)        f="%${LL}d" ;;
+                                               U*LONG*)        f="%lu" ;;
+                                               *LONG*)         f="%ld" ;;
+                                               U*)             f="%u" ;;
+                                               *)              f="%d" ;;
+                                               esac
+                                               cat > $tmp.c <<!
+${head}
+#include <stdio.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <unistd.h>$systeminfo$headers
+${tail}
+int
+main()
+{
+       printf("$f\n", $conf_name);
+       return 0;
+}
+!
+                                               ;;
                                        *)      cat > $tmp.c <<!
 ${head}
 #include <sys/types.h>
@@ -1038,7 +1074,7 @@
                                        esac
                                        case $args in
                                        '')     set "" ;;
-                                       *)      eval set "" "$args"; shift ;;
+                                       *)      eval set '""' '"'$args'"'; 
shift ;;
                                        esac
                                        for a
                                        do      case $script in
@@ -1070,6 +1106,10 @@
                        case ${x:+1}:$flags:$conf_op in
                        1:*:-1|1:*X*:*)
                                conf_limit=$x
+                               case $flags in
+                               *L*)    ;;
+                               *)      conf_flags="${conf_flags}|CONF_LIMIT" ;;
+                               esac
                                conf_flags="${conf_flags}|CONF_LIMIT_DEF"
                                case $string:$x in
                                1:*)    cat >> $tmp.l <<!
@@ -1204,8 +1244,30 @@
                ;;
        esac
        case $string in
-       1)      conf_limit="{ 0, $conf_limit }" conf_minmax="{ 0, $conf_minmax 
}" ;;
-       *)      conf_limit="{ $conf_limit, 0 }" conf_minmax="{ $conf_minmax, 0 
}" ;;
+       1)      conf_limit="{ 0, $conf_limit }" conf_minmax="{ 0, $conf_minmax 
}"
+               ;;
+       *)      case $conf_limit in
+               
0[xX]*|-*|+*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*)
+                       ;;
+               *[!0123456789abcdefABCDEF]*)
+                       conf_limit=0
+                       ;;
+               *[!0123456789]*)
+                       conf_limit=0x$conf_limit
+                       ;;
+               esac
+               case $conf_minmax in
+               
0[xX]*|-*|+*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*)
+                       ;;
+               *[!0123456789abcdefABCDEF]*)
+                       conf_minmax=0
+                       ;;
+               *[!0123456789]*)
+                       conf_minmax=0x$conf_minmax
+                       ;;
+               esac
+               conf_limit="{ $conf_limit, 0 }" conf_minmax="{ $conf_minmax, 0 
}"
+               ;;
        esac
        echo "{ \"$conf_name\", $conf_limit, $conf_minmax, $conf_flags, 
$conf_standard, $conf_section, $conf_call, $conf_op },"
        case $shell in
@@ -1295,11 +1357,11 @@
 
 struct Conf_s; typedef struct Conf_s Conf_t;
 
-typedef int (*Conf_f)(Conf_t*, _ast_intmax_t*, char**);
+typedef int (*Conf_f)(Conf_t*, intmax_t*, char**);
 
 typedef struct Value_s
 {
-       _ast_intmax_t   number;
+       intmax_t        number;
        const char*     string;
 } Value_t;
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/conf.tab 
ksh93_2007_03_28/src/lib/libast/comp/conf.tab
--- ksh93_2007_01_11/src/lib/libast/comp/conf.tab       2006-12-12 
09:38:22.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/comp/conf.tab       2007-03-01 
08:38:58.000000000 +0100
@@ -1,7 +1,7 @@
 #
 # posix { getconf limits } macro table
 #
-# @(#)conf.tab (AT&T Research) 2006-12-04
+# @(#)conf.tab (AT&T Research) 2007-02-14
 #
 # name standard section call flags [ header ... ] [ value ... ]
 #
@@ -195,12 +195,12 @@
 LFS_LINTFLAGS                  POSIX   CS 1 MU         : LFS_CFLAGS
 LINE_MAX                       POSIX   SC 2 LMN        2048
 LINK_MAX                       POSIX   PC 1 LMU        MAXLINK SHRT_MAX 8
+LLONG_MAX                      C       XX 1 L
+LLONG_MIN                      C       XX 1 L
 LOCALEDEF                      POSIX   SC 1 FUW
 LOCALEDEF                      POSIX   SC 2 FUW
 LOGIN_NAME_MAX                 POSIX   SC 1 LMU
 LOGNAME_MAX                    SVID    SC 1 MU         8
-LONGLONG_MAX                   C       XX 1 L
-LONGLONG_MIN                   C       XX 1 L
 LONG_BIT                       XOPEN   XX 1 L          (8*sizeof(long)) 32
 LONG_MAX                       C       XX 1 L          2147483647
 LONG_MIN                       C       XX 1 L          -2147483647
@@ -541,7 +541,7 @@
 UID_MAX                                SVID    SC 1 LMU        60002
 UINT_MAX                       C       XX 1 L          65535
 UIO_MAXIOV                     C       QQ 1 0
-ULONGLONG_MAX                  C       XX 1 L
+ULLONG_MAX                     C       XX 1 L
 ULONG_MAX                      C       XX 1 L          4294967295
 UNIX                           XOPEN   SC 1 FSUW
 UPE                            POSIX   SC 2 FUW
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/dirname.c 
ksh93_2007_03_28/src/lib/libast/comp/dirname.c
--- ksh93_2007_01_11/src/lib/libast/comp/dirname.c      2006-10-27 
22:53:03.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/dirname.c      2007-03-02 
14:57:10.000000000 +0100
@@ -24,7 +24,7 @@
  * dirname(3) implementation
  */
 
-#include <ast_common.h>
+#include <ast_std.h>
 
 #if defined(__EXPORT__)
 #define extern __EXPORT__
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/getpgrp.c 
ksh93_2007_03_28/src/lib/libast/comp/getpgrp.c
--- ksh93_2007_01_11/src/lib/libast/comp/getpgrp.c      2006-09-22 
06:37:24.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/getpgrp.c      2007-03-02 
14:57:47.000000000 +0100
@@ -21,7 +21,11 @@
 ***********************************************************************/
 #pragma prototyped
 
-#include <ast_common.h>
+#define getpgrp                ______getpgrp
+
+#include <ast_std.h>
+
+#undef getpgrp
 
 /*
  * bsd         int getpgrp(int);
@@ -30,8 +34,6 @@
  * user                SOL
  */
 
-#undef getpgrp
-
 extern int     getpgrp(int);
 
 #if defined(__EXPORT__)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/strtol.c 
ksh93_2007_03_28/src/lib/libast/comp/strtol.c
--- ksh93_2007_01_11/src/lib/libast/comp/strtol.c       2002-10-04 
19:37:30.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/strtol.c       2007-02-14 
08:24:12.000000000 +0100
@@ -27,6 +27,7 @@
 
 #define S2I_function   strtol
 #define S2I_number     long
+#define S2I_unumber    unsigned long
 
 #include "strtoi.h"
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/strtoll.c 
ksh93_2007_03_28/src/lib/libast/comp/strtoll.c
--- ksh93_2007_01_11/src/lib/libast/comp/strtoll.c      2006-10-27 
22:00:40.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/strtoll.c      2007-02-14 
08:24:34.000000000 +0100
@@ -38,6 +38,7 @@
 #endif
 
 #define S2I_function   strtoll
-#define S2I_number     _ast_intmax_t
+#define S2I_number     intmax_t
+#define S2I_unumber    uintmax_t
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/strtoul.c 
ksh93_2007_03_28/src/lib/libast/comp/strtoul.c
--- ksh93_2007_01_11/src/lib/libast/comp/strtoul.c      2002-10-04 
19:37:40.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/strtoul.c      2007-02-14 
08:24:49.000000000 +0100
@@ -27,6 +27,7 @@
 
 #define S2I_function   strtoul
 #define S2I_number     long
+#define S2I_unumber    unsigned long
 #define S2I_unsigned   1
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/strtoull.c 
ksh93_2007_03_28/src/lib/libast/comp/strtoull.c
--- ksh93_2007_01_11/src/lib/libast/comp/strtoull.c     2006-10-27 
22:00:52.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/strtoull.c     2007-02-14 
08:25:05.000000000 +0100
@@ -38,7 +38,8 @@
 #endif
 
 #define S2I_function   strtoull
-#define S2I_number     _ast_intmax_t
+#define S2I_number     intmax_t
+#define S2I_unumber    uintmax_t
 #define S2I_unsigned   1
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/comp/transition.c 
ksh93_2007_03_28/src/lib/libast/comp/transition.c
--- ksh93_2007_01_11/src/lib/libast/comp/transition.c   2006-10-03 
08:49:55.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/comp/transition.c   2007-02-14 
07:30:04.000000000 +0100
@@ -63,7 +63,7 @@
 
 #ifndef strtoll
 #undef STUB
-extern _ast_intmax_t
+extern intmax_t
 _ast_strtoll(const char* a, char** b, int c)
 {
        return strtoll(a, b, c);
@@ -72,8 +72,8 @@
 
 #ifndef strtoull
 #undef STUB
-extern unsigned
-_ast_intmax_t _ast_strtoull(const char* a, char** b, int c)
+extern uintmax_t
+_ast_strtoull(const char* a, char** b, int c)
 {
        return strtoull(a, b, c);
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/align.c 
ksh93_2007_03_28/src/lib/libast/features/align.c
--- ksh93_2007_01_11/src/lib/libast/features/align.c    2006-09-28 
20:16:19.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/align.c    2007-02-14 
07:30:35.000000000 +0100
@@ -39,8 +39,8 @@
        char*                   u2;
        double                  u3;
        char                    u4[1024];
-       _ast_intmax_t           u5;
-       unsigned _ast_intmax_t  u6;
+       intmax_t                u5;
+       uintmax_t               u6;
        _ast_fltmax_t           u7;
        void*                   u8;
        char*                   (*u9)();
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/botch.c 
ksh93_2007_03_28/src/lib/libast/features/botch.c
--- ksh93_2007_01_11/src/lib/libast/features/botch.c    2006-09-28 
20:16:23.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/botch.c    2007-01-22 
20:40:04.000000000 +0100
@@ -32,7 +32,9 @@
 #include "FEATURE/lib"
 #include "FEATURE/types"
 
+#if _lib_getgroups
 extern int             getgroups(int, gid_t*);
+#endif
 
 int
 main()
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/common 
ksh93_2007_03_28/src/lib/libast/features/common
--- ksh93_2007_01_11/src/lib/libast/features/common     2006-11-21 
05:51:39.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/features/common     2007-03-25 
19:07:46.000000000 +0200
@@ -1,5 +1,5 @@
 iff    AST_COMMON
-hdr    pthread,stdarg,stddef,types,unistd
+hdr    pthread,stdarg,stddef,stdint,inttypes,types,unistd
 sys    types
 typ    long.double,size_t,ssize_t
 
@@ -329,6 +329,57 @@
        }
 }end
 
+typ int8_t stdint.h inttypes.h no{
+       #undef  _typ_int8_t
+       #define _typ_int8_t     1
+       typedef _ast_int1_t int8_t;
+}end
+typ uint8_t stdint.h inttypes.h no{
+       #undef  _typ_uint8_t
+       #define _typ_uint8_t    1
+       typedef unsigned _ast_int1_t uint8_t;
+}end
+typ int16_t stdint.h inttypes.h no{
+       #undef  _typ_int16_t
+       #define _typ_int16_t    1
+       typedef _ast_int2_t int16_t;
+}end
+typ uint16_t stdint.h inttypes.h no{
+       #undef  _typ_uint16_t
+       #define _typ_uint16_t   1
+       typedef unsigned _ast_int2_t uint16_t;
+}end
+typ int32_t stdint.h inttypes.h no{
+       #undef  _typ_int32_t
+       #define _typ_int32_t    1
+       typedef _ast_int4_t int32_t;
+}end
+typ uint32_t stdint.h inttypes.h no{
+       #undef  _typ_uint32_t
+       #define _typ_uint32_t   1
+       typedef unsigned _ast_int4_t uint32_t;
+}end
+typ int64_t stdint.h inttypes.h no{
+       #ifdef _ast_int8_t
+       #undef  _typ_int64_t
+       #define _typ_int64_t    1
+       typedef _ast_int8_t int64_t;
+       #endif
+}end
+typ uint64_t stdint.h inttypes.h no{
+       #ifdef _ast_int8_t
+       #undef  _typ_uint64_t
+       #define _typ_uint64_t   1
+       typedef unsigned _ast_int8_t uint64_t;
+       #endif
+}end
+typ intmax_t stdint.h inttypes.h no{
+       typedef _ast_intmax_t intmax_t;
+}end
+typ uintmax_t stdint.h inttypes.h no{
+       typedef unsigned _ast_intmax_t uintmax_t;
+}end
+
 tst    - -DTRY=1 - -DTRY=1 -Dvoid=char - -DTRY=2 - -DTRY=3 - -DTRY=4 output{
        #if _STD_ && _hdr_stdarg
        #include <stdarg.h>
@@ -427,39 +478,14 @@
        #endif
        #endif
        
-               r = 1;
-               printf("#undef  _ast_va_list\n");
-               printf("#ifdef  va_start\n");
-               printf("#define _ast_va_list va_list\n");
-               printf("#else\n");
-       #if TRY == 1 || TRY == 2
-               printf("#define _ast_va_list void*");
-       #else
-       #if TRY == 3
-               if (sizeof(va_list) == sizeof(long))
-                       printf("#define _ast_va_list long");
-               else if (sizeof(va_list) == sizeof(short))
-                       printf("#define _ast_va_list short");
-               else
-                       printf("#define _ast_va_list int");
-       #else
-       #if defined(_M_ALPHA) && defined(_VA_LIST_DEFINED)
-               printf("typedef struct { char *a0; int offset; } 
_ast_va_list_t;\n");
-               printf("#define _ast_va_list _ast_va_list_t");
-       #else
+               printf("#ifndef va_start\n");
                printf("#if __STD_C\n");
                printf("#include <stdarg.h>\n");
                printf("#else\n");
                printf("#include <varargs.h>\n");
                printf("#endif\n");
-               printf("#define _ast_va_list va_list\n");
-               r = 0;
-       #endif
-       #endif
-       #endif
-               if (r)
-                       printf("\t/* va_list that avoids #include */\n");
                printf("#endif\n");
+
                printf("#endif\n");
                return 0;
        }
@@ -473,6 +499,13 @@
        #       if _sys_types
        #       include <sys/types.h>
        #       endif
+       #       if _hdr_stdint
+       #       include <stdint.h>
+       #       else
+       #               if _hdr_inttypes
+       #               include <inttypes.h>
+       #               endif
+       #       endif
        #endif
        #if !_typ_size_t
        #       define _typ_size_t      1
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/dirent 
ksh93_2007_03_28/src/lib/libast/features/dirent
--- ksh93_2007_01_11/src/lib/libast/features/dirent     2005-07-28 
00:16:03.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/dirent     2007-02-14 
20:00:46.000000000 +0100
@@ -87,7 +87,7 @@
        #endif
 
        #undef  __ino64_t
-       #define __ino64_t       _ast_int8_t
+       #define __ino64_t       int64_t
 
        #include $_nxt_dirent   /* the native <dirent.h> */
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/float 
ksh93_2007_03_28/src/lib/libast/features/float
--- ksh93_2007_01_11/src/lib/libast/features/float      2006-12-01 
23:05:15.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/features/float      2007-02-14 
20:14:15.000000000 +0100
@@ -299,8 +299,8 @@
                        i = 0;
                        while (uq /= 10)
                                i++;
-                       printf("#define ULONGLONG_DIG           %d\n", i);
-                       printf("#define UINTMAX_DIG             
ULONGLONG_DIG\n");
+                       printf("#define ULLONG_DIG              %d\n", i);
+                       printf("#define UINTMAX_DIG             ULLONG_DIG\n");
                }
                else
                        printf("#define UINTMAX_DIG             ULONG_DIG\n");
@@ -320,12 +320,12 @@
                printf("#define FLT_ULONG_MAX           %lu.0F\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define FLT_ULONGLONG_MAX       %llu.0F\n", w);
-                       printf("#define FLT_UINTMAX_MAX         
FLT_ULONGLONG_MAX\n");
+                       printf("#define FLT_ULLONG_MAX          %llu.0F\n", w);
+                       printf("#define FLT_UINTMAX_MAX         
FLT_ULLONG_MAX\n");
                }
                else
                {
-                       printf("#define FLT_ULONGLONG_MAX       
FLT_ULONG_MAX\n");
+                       printf("#define FLT_ULLONG_MAX          
FLT_ULONG_MAX\n");
                        printf("#define FLT_UINTMAX_MAX         
FLT_ULONG_MAX\n");
                }
                u /= 2;
@@ -333,12 +333,12 @@
                printf("#define FLT_LONG_MAX            %lu.0F\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define FLT_LONGLONG_MAX        %llu.0F\n", w);
-                       printf("#define FLT_INTMAX_MAX          
FLT_LONGLONG_MAX\n");
+                       printf("#define FLT_LLONG_MAX           %llu.0F\n", w);
+                       printf("#define FLT_INTMAX_MAX          
FLT_LLONG_MAX\n");
                }
                else
                {
-                       printf("#define FLT_LONGLONG_MAX        
FLT_LONG_MAX\n");
+                       printf("#define FLT_LLONG_MAX           
FLT_LONG_MAX\n");
                        printf("#define FLT_INTMAX_MAX          
FLT_LONG_MAX\n");
                }
                u++;
@@ -346,12 +346,12 @@
                printf("#define FLT_LONG_MIN            (-%lu.0F)\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define FLT_LONGLONG_MIN        (-%llu.0F)\n", 
w);
-                       printf("#define FLT_INTMAX_MIN          
FLT_LONGLONG_MIN\n");
+                       printf("#define FLT_LLONG_MIN           (-%llu.0F)\n", 
w);
+                       printf("#define FLT_INTMAX_MIN          
FLT_LLONG_MIN\n");
                }
                else
                {
-                       printf("#define FLT_LONGLONG_MIN        
FLT_LONG_MIN\n");
+                       printf("#define FLT_LLONG_MIN           
FLT_LONG_MIN\n");
                        printf("#define FLT_INTMAX_MIN          
FLT_LONG_MIN\n");
                }
        #ifdef FLT_DIG
@@ -495,12 +495,12 @@
                printf("#define DBL_ULONG_MAX           %lu.0\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define DBL_ULONGLONG_MAX       %llu.0\n", w);
-                       printf("#define DBL_UINTMAX_MAX         
DBL_ULONGLONG_MAX\n");
+                       printf("#define DBL_ULLONG_MAX          %llu.0\n", w);
+                       printf("#define DBL_UINTMAX_MAX         
DBL_ULLONG_MAX\n");
                }
                else
                {
-                       printf("#define DBL_ULONGLONG_MAX       
DBL_ULONG_MAX\n");
+                       printf("#define DBL_ULLONG_MAX          
DBL_ULONG_MAX\n");
                        printf("#define DBL_UINTMAX_MAX         
DBL_ULONG_MAX\n");
                }
                u /= 2;
@@ -508,12 +508,12 @@
                printf("#define DBL_LONG_MAX            %lu.0\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define DBL_LONGLONG_MAX        %llu.0\n", w);
-                       printf("#define DBL_INTMAX_MAX          
DBL_LONGLONG_MAX\n");
+                       printf("#define DBL_LLONG_MAX           %llu.0\n", w);
+                       printf("#define DBL_INTMAX_MAX          
DBL_LLONG_MAX\n");
                }
                else
                {
-                       printf("#define DBL_LONGLONG_MAX        
DBL_LONG_MAX\n");
+                       printf("#define DBL_LLONG_MAX           
DBL_LONG_MAX\n");
                        printf("#define DBL_INTMAX_MAX          
DBL_LONG_MAX\n");
                }
                u++;
@@ -521,12 +521,12 @@
                printf("#define DBL_LONG_MIN            (-%lu.0)\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define DBL_LONGLONG_MIN        (-%llu.0)\n", 
w);
-                       printf("#define DBL_INTMAX_MIN          
DBL_LONGLONG_MIN\n");
+                       printf("#define DBL_LLONG_MIN           (-%llu.0)\n", 
w);
+                       printf("#define DBL_INTMAX_MIN          
DBL_LLONG_MIN\n");
                }
                else
                {
-                       printf("#define DBL_LONGLONG_MIN        
DBL_LONG_MIN\n");
+                       printf("#define DBL_LLONG_MIN           
DBL_LONG_MIN\n");
                        printf("#define DBL_INTMAX_MIN          
DBL_LONG_MIN\n");
                }
        #ifdef DBL_DIG
@@ -666,12 +666,12 @@
                printf("#define LDBL_ULONG_MAX          %lu.0L\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define LDBL_ULONGLONG_MAX      %llu.0L\n", w);
-                       printf("#define LDBL_UINTMAX_MAX        
LDBL_ULONGLONG_MAX\n");
+                       printf("#define LDBL_ULLONG_MAX         %llu.0L\n", w);
+                       printf("#define LDBL_UINTMAX_MAX        
LDBL_ULLONG_MAX\n");
                }
                else
                {
-                       printf("#define LDBL_ULONGLONG_MAX      
LDBL_ULONG_MAX\n");
+                       printf("#define LDBL_ULLONG_MAX         
LDBL_ULONG_MAX\n");
                        printf("#define LDBL_UINTMAX_MAX        
LDBL_ULONG_MAX\n");
                }
                u /= 2;
@@ -679,12 +679,12 @@
                printf("#define LDBL_LONG_MAX           %lu.0L\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define LDBL_LONGLONG_MAX       %llu.0L\n", w);
-                       printf("#define LDBL_INTMAX_MAX         
LDBL_LONGLONG_MAX\n");
+                       printf("#define LDBL_LLONG_MAX          %llu.0L\n", w);
+                       printf("#define LDBL_INTMAX_MAX         
LDBL_LLONG_MAX\n");
                }
                else
                {
-                       printf("#define LDBL_LONGLONG_MAX       
LDBL_LONG_MAX\n");
+                       printf("#define LDBL_LLONG_MAX          
LDBL_LONG_MAX\n");
                        printf("#define LDBL_INTMAX_MAX         
LDBL_LONG_MAX\n");
                }
                u++;
@@ -692,12 +692,12 @@
                printf("#define LDBL_LONG_MIN           (-%lu.0L)\n", u);
                if (sizeof(w) > sizeof(u))
                {
-                       printf("#define LDBL_LONGLONG_MIN       (-%llu.0L)\n", 
w);
-                       printf("#define LDBL_INTMAX_MIN         
LDBL_LONGLONG_MIN\n");
+                       printf("#define LDBL_LLONG_MIN          (-%llu.0L)\n", 
w);
+                       printf("#define LDBL_INTMAX_MIN         
LDBL_LLONG_MIN\n");
                }
                else
                {
-                       printf("#define LDBL_LONGLONG_MIN       
LDBL_LONG_MIN\n");
+                       printf("#define LDBL_LLONG_MIN          
LDBL_LONG_MIN\n");
                        printf("#define LDBL_INTMAX_MIN         
LDBL_LONG_MIN\n");
                }
        #ifdef LDBL_DIG
@@ -884,7 +884,7 @@
                                for (j = i + 1; j < sizeof(a.e) / 
sizeof(a.e[0]); j++)
                                        if (a.e[j] ^ b.e[j])
                                                return 0;
-                               printf("typedef union 
_ast_dbl_exp_u\n{\n\tunsigned 
_ast_int4_t\te[sizeof(double)/4];\n\tdouble\t\t\tf;\n} _ast_dbl_exp_t;\n\n");
+                               printf("typedef union 
_ast_dbl_exp_u\n{\n\tuint32_t\t\te[sizeof(double)/4];\n\tdouble\t\t\tf;\n} 
_ast_dbl_exp_t;\n\n");
                                printf("#define _ast_dbl_exp_index      %d\n", 
i);
                                for (i = 0; !(e & 1); e >>= 1, i++);
                                printf("#define _ast_dbl_exp_shift      
%d\n\n", i);
@@ -917,7 +917,7 @@
                                for (j = i + 1; j < sizeof(a.e) / 
sizeof(a.e[0]); j++)
                                        if (a.e[j] ^ b.e[j])
                                                return 0;
-                               printf("typedef union 
_fltmax_exp_u\n{\n\tunsigned 
_ast_int4_t\te[sizeof(_ast_fltmax_t)/4];\n\t_ast_fltmax_t\t\tf;\n} 
_ast_fltmax_exp_t;\n\n");
+                               printf("typedef union 
_fltmax_exp_u\n{\n\tuint32_t\t\te[sizeof(_ast_fltmax_t)/4];\n\t_ast_fltmax_t\t\tf;\n}
 _ast_fltmax_exp_t;\n\n");
                                printf("#define _ast_fltmax_exp_index\t%d\n", 
i);
                                for (i = 0; !(e & 1); e >>= 1, i++);
                                printf("#define _ast_fltmax_exp_shift\t%d\n\n", 
i);
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/lib 
ksh93_2007_03_28/src/lib/libast/features/lib
--- ksh93_2007_01_11/src/lib/libast/features/lib        2006-10-31 
17:02:05.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/features/lib        2007-03-05 
16:45:24.000000000 +0100
@@ -560,7 +560,7 @@
        }
 }end
 
-std    strtod note{ stuck with standard strtod }end nostatic{
+std    strtod stdlib.h note{ stuck with standard strtod }end nostatic{
        _BEGIN_EXTERNS_
        #if _STD_
        double strtod(const char* s, char** e) { return 0.0; }
@@ -571,6 +571,17 @@
        int main() { printf(""); return strtod("1",0) != 0; }
 }end
 
+std    strtold stdlib.h note{ stuck with standard strtold }end nostatic{
+       _BEGIN_EXTERNS_
+       #if _STD_
+       long double strtold(const char* s, char** e) { return 0.0; }
+       #else
+       long double strtold(s, e) char* s; char** e; { return 0.0; }
+       #endif
+       _END_EXTERNS_
+       int main() { printf(""); return strtold("1",0) != 0; }
+}end
+
 std    strtol note{ stuck with standard strtol }end nostatic{
        _BEGIN_EXTERNS_
        #if _STD_
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/limits.c 
ksh93_2007_03_28/src/lib/libast/features/limits.c
--- ksh93_2007_01_11/src/lib/libast/features/limits.c   2006-10-19 
23:16:47.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/limits.c   2007-02-14 
07:35:09.000000000 +0100
@@ -91,9 +91,9 @@
        unsigned int            ui;
        unsigned long           ul;
        unsigned long           val;
-#ifdef _ast_int8_t
-       unsigned _ast_int8_t    ull;
-       unsigned _ast_int8_t    vll;
+#if _typ_uint64_t
+       uint64_t                ull;
+       uint64_t                vll;
 #endif
 
        /*
@@ -123,7 +123,7 @@
        ui = ~ui;
        ul = 0;
        ul = ~ul;
-#ifdef _ast_int8_t
+#if _typ_uint64_t
        ull = 0;
        ull = ~ull;
 #endif
@@ -260,52 +260,52 @@
 #endif
        }
 
-#if defined(_ast_int8_t) && !_ast_intmax_long
+#if _typ_uint64_t && !_ast_intmax_long
        if (ull == ul)
        {
-#ifndef ULONGLONG_MAX
-               printf("#define ULONGLONG_MAX   ULONG_MAX\n");
+#ifndef ULLONG_MAX
+               printf("#define ULLONG_MAX      ULONG_MAX\n");
 #endif
 
-#ifndef LONGLONG_MIN
-               printf("#define LONGLONG_MIN    LONG_MIN\n");
+#ifndef LLONG_MIN
+               printf("#define LLONG_MIN       LONG_MIN\n");
 #endif
 
-#ifndef LONGLONG_MAX
-               printf("#define LONGLONG_MAX    LONG_MAX\n");
+#ifndef LLONG_MAX
+               printf("#define LLONG_MAX       LONG_MAX\n");
 #endif
        }
        else
        {
-#ifndef ULONGLONG_MAX
+#ifndef ULLONG_MAX
                vll = ull;
-               printf("#ifndef ULONGLONG_MAX\n");
+               printf("#ifndef ULLONG_MAX\n");
                printf("#if defined(__STDC__) && _ast_LL\n");
-               printf("#define ULONGLONG_MAX   %lluULL\n", vll);
+               printf("#define ULLONG_MAX      %lluULL\n", vll);
                printf("#else\n");
-               printf("#define ULONGLONG_MAX   %llu\n", vll);
+               printf("#define ULLONG_MAX      %llu\n", vll);
                printf("#endif\n");
                printf("#endif\n");
 #endif
 
-#ifndef LONGLONG_MIN
-               vll = (unsigned _ast_int8_t)(ull >> 1) + 1;
-               printf("#ifndef LONGLONG_MIN\n");
+#ifndef LLONG_MIN
+               vll = (uint64_t)(ull >> 1) + 1;
+               printf("#ifndef LLONG_MIN\n");
                printf("#if defined(__STDC__) && _ast_LL\n");
-               printf("#define LONGLONG_MIN    (-%lluLL-1LL)\n", vll - 1);
+               printf("#define LLONG_MIN       (-%lluLL-1LL)\n", vll - 1);
                printf("#else\n");
-               printf("#define LONGLONG_MIN    (-%llu-1)\n", vll - 1);
+               printf("#define LLONG_MIN       (-%llu-1)\n", vll - 1);
                printf("#endif\n");
                printf("#endif\n");
 #endif
 
-#ifndef LONGLONG_MAX
-               vll = (unsigned _ast_int8_t)(ull >> 1);
-               printf("#ifndef LONGLONG_MAX\n");
+#ifndef LLONG_MAX
+               vll = (uint64_t)(ull >> 1);
+               printf("#ifndef LLONG_MAX\n");
                printf("#if defined(__STDC__) && _ast_LL\n");
-               printf("#define LONGLONG_MAX    %lluLL\n", vll);
+               printf("#define LLONG_MAX       %lluLL\n", vll);
                printf("#else\n");
-               printf("#define LONGLONG_MAX    %llu\n", vll);
+               printf("#define LLONG_MAX       %llu\n", vll);
                printf("#endif\n");
                printf("#endif\n");
 #endif
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/map.c 
ksh93_2007_03_28/src/lib/libast/features/map.c
--- ksh93_2007_01_11/src/lib/libast/features/map.c      2006-10-26 
23:35:24.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/map.c      2007-03-25 
07:43:02.000000000 +0200
@@ -222,6 +222,8 @@
        printf("#define regcomb         _ast_regcomb\n");
        printf("#undef  regcomp\n");
        printf("#define regcomp         _ast_regcomp\n");
+       printf("#undef  regdecomp\n");
+       printf("#define regdecomp       _ast_regdecomp\n");
        printf("#undef  regdup\n");
        printf("#define regdup          _ast_regdup\n");
        printf("#undef  regerror\n");
@@ -450,6 +452,8 @@
 #if _map_libc || _std_strtod
        printf("#undef  strtod\n");
        printf("#define strtod          _ast_strtod\n");
+#endif
+#if _map_libc || _std_strtold
        printf("#undef  strtold\n");
        printf("#define strtold         _ast_strtold\n");
 #endif
@@ -485,12 +489,12 @@
        printf("#if !_UWIN\n");
        printf("#undef  extern\n");
        printf("#endif\n");
-#if _npt_strtold || _map_libc || _std_strtod
-#if _npt_strtold && !_map_libc && !_std_strtod
+#if _npt_strtold || _map_libc || _std_strtold
+#if _npt_strtold && !_map_libc && !_std_strtold
        printf("#ifndef _ISOC99_SOURCE\n");
 #endif
        printf("extern _ast_fltmax_t    strtold(const char*, char**);\n");
-#if _npt_strtold && !_map_libc && !_std_strtod
+#if _npt_strtold && !_map_libc && !_std_strtold
        printf("#endif\n");
 #endif
 #endif
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/stdio 
ksh93_2007_03_28/src/lib/libast/features/stdio
--- ksh93_2007_01_11/src/lib/libast/features/stdio      2006-10-04 
19:36:17.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/stdio      2007-03-09 
18:43:06.000000000 +0100
@@ -74,14 +74,14 @@
        #endif
 
        #define fpos_t          _ast_fpos_t
-       #ifdef _ast_int8_t
+       #if _typ_int64_t
        #define fpos64_t        _ast_fpos_t
        #endif
 
        typedef struct _ast_fpos_s
        {
-               _ast_intmax_t   _sf_offset;
-               unsigned char   _sf_state[64 - sizeof(_ast_intmax_t)];
+               intmax_t        _sf_offset;
+               unsigned char   _sf_state[64 - sizeof(intmax_t)];
        } _ast_fpos_t;
 
        #define _base           _data
@@ -99,8 +99,8 @@
        #undef  strerror
        extern char*    strerror(int) __THROW;
 
-       extern int      _doprnt(const char*, _ast_va_list, FILE*);
-       extern int      _doscan(FILE*, const char*, _ast_va_list);
+       extern int      _doprnt(const char*, va_list, FILE*);
+       extern int      _doscan(FILE*, const char*, va_list);
        extern int      asprintf(char**, const char*, ...);
        extern int      clearerr(FILE*);
        extern int      fclose(FILE*);
@@ -148,23 +148,23 @@
        extern int      sscanf(const char*, const char*, ...);
        extern FILE*    tmpfile(void);
        extern int      ungetc(int, FILE*);
-       extern int      vasprintf(char**, const char*, _ast_va_list);
-       extern int      vfprintf(FILE*, const char*, _ast_va_list);
-       extern int      vfscanf(FILE*, const char*, _ast_va_list);
-       extern int      vprintf(const char*, _ast_va_list);
-       extern int      vscanf(const char*, _ast_va_list);
-       extern int      vsnprintf(char*, int, const char*, _ast_va_list);
-       extern int      vsprintf(char*, const char*, _ast_va_list);
-       extern int      vsscanf(const char*, const char*, _ast_va_list);
+       extern int      vasprintf(char**, const char*, va_list);
+       extern int      vfprintf(FILE*, const char*, va_list);
+       extern int      vfscanf(FILE*, const char*, va_list);
+       extern int      vprintf(const char*, va_list);
+       extern int      vscanf(const char*, va_list);
+       extern int      vsnprintf(char*, int, const char*, va_list);
+       extern int      vsprintf(char*, const char*, va_list);
+       extern int      vsscanf(const char*, const char*, va_list);
 
-       #ifdef _ast_int8_t
+       #if _typ_int64_t
 
        extern int              fgetpos64(FILE*, fpos64_t*);
        extern int              fsetpos64(FILE*, const fpos64_t*);
-       extern int              fseek64(FILE*, _ast_int8_t, int);
-       extern int              fseeko64(FILE*, _ast_int8_t, int);
-       extern _ast_int8_t      ftell64(FILE*);
-       extern _ast_int8_t      ftello64(FILE*);
+       extern int              fseek64(FILE*, int64_t, int);
+       extern int              fseeko64(FILE*, int64_t, int);
+       extern int64_t          ftell64(FILE*);
+       extern int64_t          ftello64(FILE*);
 
        #endif
 
@@ -371,8 +371,8 @@
        #define extern          __EXPORT__
        #endif
 
-       extern int      _doprnt(const char*, _ast_va_list, FILE*);
-       extern int      _doscan(FILE*, const char*, _ast_va_list);
+       extern int      _doprnt(const char*, va_list, FILE*);
+       extern int      _doscan(FILE*, const char*, va_list);
        extern int      asprintf(char**, const char*, ...);
        extern int      clearerr(FILE*);
        extern int      fclose(FILE*);
@@ -420,23 +420,23 @@
        extern int      sscanf(const char*, const char*, ...);
        extern FILE*    tmpfile(void);
        extern int      ungetc(int, FILE*);
-       extern int      vasprintf(char**, const char*, _ast_va_list);
-       extern int      vfprintf(FILE*, const char*, _ast_va_list);
-       extern int      vfscanf(FILE*, const char*, _ast_va_list);
-       extern int      vprintf(const char*, _ast_va_list);
-       extern int      vscanf(const char*, _ast_va_list);
-       extern int      vsnprintf(char*, int, const char*, _ast_va_list);
-       extern int      vsprintf(char*, const char*, _ast_va_list);
-       extern int      vsscanf(const char*, const char*, _ast_va_list);
+       extern int      vasprintf(char**, const char*, va_list);
+       extern int      vfprintf(FILE*, const char*, va_list);
+       extern int      vfscanf(FILE*, const char*, va_list);
+       extern int      vprintf(const char*, va_list);
+       extern int      vscanf(const char*, va_list);
+       extern int      vsnprintf(char*, int, const char*, va_list);
+       extern int      vsprintf(char*, const char*, va_list);
+       extern int      vsscanf(const char*, const char*, va_list);
 
-       #ifdef _ast_int8_t
+       #if _typ_int64_t
 
        extern int              fgetpos64(FILE*, fpos64_t*);
        extern int              fsetpos64(FILE*, const fpos64_t*);
-       extern int              fseek64(FILE*, _ast_int8_t, int);
-       extern int              fseeko64(FILE*, _ast_int8_t, int);
-       extern _ast_int8_t      ftell64(FILE*);
-       extern _ast_int8_t      ftello64(FILE*);
+       extern int              fseek64(FILE*, int64_t, int);
+       extern int              fseeko64(FILE*, int64_t, int);
+       extern int64_t          ftell64(FILE*);
+       extern int64_t          ftello64(FILE*);
 
        #ifdef _LARGEFILE64_SOURCE
 
@@ -453,7 +453,7 @@
        #if _typ_off64_t
        #define off_t           off64_t
        #else
-       #define off_t           _ast_int8_t
+       #define off_t           int64_t
        #endif
 
        #define fgetpos         fgetpos64
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/sys 
ksh93_2007_03_28/src/lib/libast/features/sys
--- ksh93_2007_01_11/src/lib/libast/features/sys        2006-10-26 
19:58:15.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/sys        2007-03-24 
05:14:39.000000000 +0100
@@ -38,6 +38,8 @@
 header stdlib.h
 header stddef.h
 header sys/types.h
+header stdint.h
+header inttypes.h
 header string.h
 header unistd.h
 header limits.h
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/time 
ksh93_2007_03_28/src/lib/libast/features/time
--- ksh93_2007_01_11/src/lib/libast/features/time       2006-10-09 
03:16:04.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/time       2007-02-14 
20:07:19.000000000 +0100
@@ -1,7 +1,7 @@
 set    prototyped
 lib    nanosleep,usleep,_strftime
-typ    clock_t = unsigned _ast_int4_t
-typ    time_t = unsigned _ast_int4_t
+typ    clock_t = uint32_t
+typ    time_t = uint32_t
 
 if sys time {
        #include <sys/time.h>
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/tmx 
ksh93_2007_03_28/src/lib/libast/features/tmx
--- ksh93_2007_01_11/src/lib/libast/features/tmx        2005-07-22 
07:38:51.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/tmx        2007-02-15 
11:56:06.000000000 +0100
@@ -22,9 +22,9 @@
        #define TMX_MAXNSEC     709551614
        #define TMX_RESOLUTION  1000000000
 
-       typedef unsigned _ast_int8_t Time_t;
-       typedef unsigned _ast_int8_t Tmxsec_t;
-       typedef unsigned _ast_int4_t Tmxnsec_t;
+       typedef uint64_t Time_t;
+       typedef uint64_t Tmxsec_t;
+       typedef uint32_t Tmxnsec_t;
 
        #define tmxsec(t)       ((Tmxsec_t)((t)/1000000000))
        #define tmxnsec(t)      ((Tmxnsec_t)((t)%1000000000))
@@ -39,12 +39,12 @@
        #define TMX_RESOLUTION  1000
 
        typedef _ast_flt8_t Time_t;
-       typedef unsigned _ast_int4_t Tmxsec_t;
-       typedef unsigned _ast_int4_t Tmxnsec_t;
+       typedef uint32_t Tmxsec_t;
+       typedef uint32_t Tmxnsec_t;
 
        #define tmxsec(t)       ((Tmxsec_t)(t))
-       #define tmxnsec(t)      (((Tmxnsec_t)(((t)-((unsigned 
_ast_int4_t)(t))+0.0000005)*1000L))*1000000L)
-       #define tmxsns(s,n)     (((Time_t)(s))+((((unsigned 
_ast_int4_t)(n))/1000L)/1e6))
+       #define tmxnsec(t)      
(((Tmxnsec_t)(((t)-((uint32_t)(t))+0.0000005)*1000L))*1000000L)
+       #define tmxsns(s,n)     (((Time_t)(s))+((((uint32_t)(n))/1000L)/1e6))
 }
 else {
        #define TMX_MAXDATE     "2106-02-07+06:28:14 UTC"
@@ -53,9 +53,9 @@
        #define TMX_MAXNSEC     0L
        #define TMX_RESOLUTION  1
 
-       typedef unsigned _ast_int4_t Time_t;
-       typedef unsigned _ast_int4_t Tmxsec_t;
-       typedef unsigned _ast_int4_t Tmxnsec_t;
+       typedef uint32_t Time_t;
+       typedef uint32_t Tmxsec_t;
+       typedef uint32_t Tmxnsec_t;
 
        #define tmxsec(t)       ((Tmxsec_t)(t))
        #define tmxnsec(t)      (0)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/tv 
ksh93_2007_03_28/src/lib/libast/features/tv
--- ksh93_2007_01_11/src/lib/libast/features/tv 2005-01-14 14:58:32.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/features/tv 2007-02-14 20:09:03.000000000 
+0100
@@ -16,8 +16,8 @@
 
        typedef struct Tv_s
        {
-               unsigned _ast_int4_t    tv_sec;
-               unsigned _ast_int4_t    tv_nsec;
+               uint32_t        tv_sec;
+               uint32_t        tv_nsec;
        } Tv_t;
 }end
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/features/wchar 
ksh93_2007_03_28/src/lib/libast/features/wchar
--- ksh93_2007_01_11/src/lib/libast/features/wchar      2006-09-22 
09:12:03.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/features/wchar      2007-03-09 
18:43:14.000000000 +0100
@@ -97,12 +97,12 @@
        extern int              swprintf(wchar_t*, size_t, const wchar_t*, ...);
        extern int              swscanf(const wchar_t*, const wchar_t*, ...);
        extern wint_t           ungetwc(wint_t, FILE*);
-       extern int              vfwprintf(FILE*, const wchar_t*, _ast_va_list);
-       extern int              vfwscanf(FILE*, const wchar_t*, _ast_va_list);
-       extern int              vwprintf(const wchar_t*, _ast_va_list);
-       extern int              vwscanf(const wchar_t*, _ast_va_list);
-       extern int              vswprintf(wchar_t*, size_t, const wchar_t*, 
_ast_va_list);
-       extern int              vswscanf(const wchar_t*, const wchar_t*, 
_ast_va_list);
+       extern int              vfwprintf(FILE*, const wchar_t*, va_list);
+       extern int              vfwscanf(FILE*, const wchar_t*, va_list);
+       extern int              vwprintf(const wchar_t*, va_list);
+       extern int              vwscanf(const wchar_t*, va_list);
+       extern int              vswprintf(wchar_t*, size_t, const wchar_t*, 
va_list);
+       extern int              vswscanf(const wchar_t*, const wchar_t*, 
va_list);
        extern int              wprintf(const wchar_t*, ...);
        extern int              wscanf(const wchar_t*, ...);
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/ast.h 
ksh93_2007_03_28/src/lib/libast/include/ast.h
--- ksh93_2007_01_11/src/lib/libast/include/ast.h       2006-11-15 
23:06:04.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/ast.h       2007-02-14 
07:36:29.000000000 +0100
@@ -248,8 +248,8 @@
 extern int             chrtoi(const char*);
 extern int             eaccess(const char*, int);
 extern char*           fmtbase(long, int, int);
-extern char*           fmtbasell(_ast_intmax_t, int, int);
-#define fmtbase(a,b,c) fmtbasell((_ast_intmax_t)(a),b,c) /* until 2003-09-01 */
+extern char*           fmtbasell(intmax_t, int, int);
+#define fmtbase(a,b,c) fmtbasell((intmax_t)(a),b,c) /* until 2003-09-01 */
 extern char*           fmtbuf(size_t);
 extern char*           fmtclock(Sfulong_t);
 extern char*           fmtelapsed(unsigned long, int);
@@ -257,7 +257,7 @@
 extern char*           fmtesc(const char*);
 extern char*           fmtesq(const char*, const char*);
 extern char*           fmtident(const char*);
-extern char*           fmtip4(unsigned _ast_int4_t, int);
+extern char*           fmtip4(uint32_t, int);
 extern char*           fmtfmt(const char*);
 extern char*           fmtgid(int);
 extern char*           fmtmatch(const char*);
@@ -314,9 +314,9 @@
 extern double          strntod(const char*, size_t, char**);
 extern _ast_fltmax_t   strntold(const char*, size_t, char**);
 extern long            strntol(const char*, size_t, char**, int);
-extern _ast_intmax_t   strntoll(const char*, size_t, char**, int);
+extern intmax_t                strntoll(const char*, size_t, char**, int);
 extern unsigned long   strntoul(const char*, size_t, char**, int);
-extern unsigned _ast_intmax_t  strntoull(const char*, size_t, char**, int);
+extern uintmax_t       strntoull(const char*, size_t, char**, int);
 extern int             stropt(const char*, const void*, int, int(*)(void*, 
const void*, int, const char*), void*);
 extern int             strperm(const char*, char**, int);
 extern void*           strpsearch(const void*, size_t, size_t, const char*, 
char**);
@@ -325,9 +325,9 @@
 extern char*           strsubmatch(const char*, const char*, int);
 extern unsigned long   strsum(const char*, unsigned long);
 extern char*           strtape(const char*, char**);
-extern int             strtoip4(const char*, char**, unsigned _ast_int4_t*, 
unsigned char*);
+extern int             strtoip4(const char*, char**, uint32_t*, unsigned 
char*);
 extern long            strton(const char*, char**, char*, int);
-extern _ast_intmax_t   strtonll(const char*, char**, char*, int);
+extern intmax_t                strtonll(const char*, char**, char*, int);
 extern int             struid(const char*);
 extern int             struniq(char**, int);
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/ast_std.h 
ksh93_2007_03_28/src/lib/libast/include/ast_std.h
--- ksh93_2007_01_11/src/lib/libast/include/ast_std.h   2006-10-26 
23:17:58.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/include/ast_std.h   2007-03-09 
18:44:03.000000000 +0100
@@ -68,9 +68,6 @@
 #include <ast_limits.h>
 #include <ast_botch.h>
 
-#undef _ast_va_list
-#define _ast_va_list   va_list
-
 #ifdef _SKIP_SFSTDIO_H
 #undef _SKIP_SFSTDIO_H
 #else
@@ -209,8 +206,8 @@
 
        struct
        {
-       unsigned _ast_int4_t    serial;
-       unsigned _ast_int4_t    set;
+       uint32_t        serial;
+       uint32_t        set;
        }               locale;
 
        long            tmp_long;
@@ -231,7 +228,7 @@
        int             (*mb_width)(wchar_t);
        int             (*mb_conv)(char*, wchar_t);
 
-       unsigned _ast_int4_t    env_serial;
+       uint32_t        env_serial;
 
        char            pad[944];
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/ccode.h 
ksh93_2007_03_28/src/lib/libast/include/ccode.h
--- ksh93_2007_01_11/src/lib/libast/include/ccode.h     2004-11-01 
07:58:56.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/ccode.h     2007-03-13 
16:20:12.000000000 +0100
@@ -70,7 +70,7 @@
 
 #define CCCVT(x)               CCMAP(x,0)
 #define CCMAP(i,o)             ((i)==(o)?(unsigned char*)0:_ccmap(i,o))
-#define CCMAPCHR(m,c)          ((m)?m[c]:(c))
+#define CCMAPCHR(m,c)          ((m)?(m)[c]:(c))
 #define CCMAPCPY(m,t,f,n)      ((m)?_ccmapcpy(m,t,f,n):memcpy(t,f,n))
 #define CCMAPSTR(m,s,n)                ((m)?_ccmapstr(m,s,n):(void*)(s))
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/cdt.h 
ksh93_2007_03_28/src/lib/libast/include/cdt.h
--- ksh93_2007_01_11/src/lib/libast/include/cdt.h       2005-11-10 
00:08:51.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/cdt.h       2007-03-13 
16:28:02.000000000 +0100
@@ -242,15 +242,15 @@
 /* internal functions for translating among holder, object and key */
 #define _DT(dt)                ((Dt_t*)(dt))
 #define _DTDSC(dc,ky,sz,lk,cmpf) \
-                       (ky = dc->key, sz = dc->size, lk = dc->link, cmpf = 
dc->comparf)
+                       (ky = (dc)->key, sz = (dc)->size, lk = (dc)->link, cmpf 
= (dc)->comparf)
 #define _DTLNK(o,lk)   ((Dtlink_t*)((char*)(o) + lk) )
-#define _DTOBJ(e,lk)   (lk < 0 ? ((Dthold_t*)(e))->obj : (Void_t*)((char*)(e) 
- lk) )
-#define _DTKEY(o,ky,sz)        (Void_t*)(sz < 0 ? *((char**)((char*)(o)+ky)) : 
((char*)(o)+ky))
+#define _DTOBJ(e,lk)   ((lk) < 0 ? ((Dthold_t*)(e))->obj : 
(Void_t*)((char*)(e) - (lk)) )
+#define _DTKEY(o,ky,sz)        (Void_t*)((sz) < 0 ? 
*((char**)((char*)(o)+(ky))) : ((char*)(o)+(ky)))
 
 #define _DTCMP(dt,k1,k2,dc,cmpf,sz) \
-                       (cmpf ? (*cmpf)(dt,k1,k2,dc) : \
-                        (sz <= 0 ? strcmp(k1,k2) : memcmp(k1,k2,sz)) )
-#define _DTHSH(dt,ky,dc,sz) (dc->hashf ? (*dc->hashf)(dt,ky,dc) : 
dtstrhash(0,ky,sz) )
+                       ((cmpf) ? (*cmpf)(dt,k1,k2,dc) : \
+                        ((sz) <= 0 ? strcmp(k1,k2) : memcmp(k1,k2,sz)) )
+#define _DTHSH(dt,ky,dc,sz) ((dc)->hashf ? (*(dc)->hashf)(dt,ky,dc) : 
dtstrhash(0,ky,sz) )
 
 /* special search function for tree structure only */
 #define _DTMTCH(dt,key,action) \
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/error.h 
ksh93_2007_03_28/src/lib/libast/include/error.h
--- ksh93_2007_01_11/src/lib/libast/include/error.h     2004-10-27 
21:36:08.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/include/error.h     2007-03-22 
23:14:02.000000000 +0100
@@ -34,11 +34,7 @@
 #include <option.h>
 #include <errno.h>
 
-#define ERROR_VERSION  20030214L
-
-#ifndef        error_info
-#define error_info     _error_info_
-#endif
+#define ERROR_VERSION  20070319L
 
 #if !defined(errno) && defined(__DYNAMIC__)
 #define errno          __DYNAMIC__(errno)
@@ -83,13 +79,29 @@
 #define ERROR_SILENT           0x0002  /* context is silent            */
 #define ERROR_NOTIFY           0x0004  /* main(-sig,0,ctx) on signal   */
 
-#define errorpush(p,f) 
(*(p)=*ERROR_CONTEXT_BASE,*ERROR_CONTEXT_BASE=error_info.empty,error_info.context=(p),error_info.flags=(f))
-#define errorpop(p)    (*ERROR_CONTEXT_BASE=*(p))
+#define ERROR_FREE             0x0010  /* free context on pop          */
+#define ERROR_POP              0x0020  /* pop context                  */
+#define ERROR_PUSH             0x0040  /* push context                 */
+#define ERROR_SET              0x0080  /* set context                  */
+
+/*
+ * errorpush()/errorpop() are obsolete -- use errorctx() instead
+ */
+
+#ifndef ERROR_CONTEXT_T
+#define ERROR_CONTEXT_T                Error_info_t
+#endif
 
 #define ERROR_CONTEXT_BASE     ((Error_context_t*)&error_info.context)
 
+#define errorpush(p,f) 
(*(p)=*ERROR_CONTEXT_BASE,*ERROR_CONTEXT_BASE=error_info.empty,error_info.context=(Error_context_t*)(p),error_info.flags=(f))
+#define errorpop(p)    (*ERROR_CONTEXT_BASE=*(p))
+
+typedef struct Error_info_s Error_info_t;
+typedef struct Error_context_s Error_context_t;
+
 #define ERROR_CONTEXT \
-       Error_context_t* context;       /* prev context stack element   */ \
+       ERROR_CONTEXT_T* context;       /* prev context stack element   */ \
        int     errors;                 /* >= ERROR_ERROR count         */ \
        int     flags;                  /* context flags                */ \
        int     line;                   /* input|output line number     */ \
@@ -97,16 +109,12 @@
        char*   file;                   /* input|output file name       */ \
        char*   id;                     /* command id                   */
 
-#define errorcontext Error_context_s   /* compatibility til 2004       */
-
-typedef struct Error_context_s Error_context_t;
-
 struct Error_context_s                 /* context stack element        */
 {
        ERROR_CONTEXT
 };
 
-typedef struct Error_info_s            /* error state                  */
+struct Error_info_s                    /* error state                  */
 {
        int     fd;                     /* write(2) fd                  */
 
@@ -135,9 +143,9 @@
        unsigned long   time;           /* debug time trace             */
 
        char*   (*translate)(const char*, const char*, const char*, const 
char*);       /* format translator */
-       const char*     catalog;        /* default message catalog      */
 
-} Error_info_t;
+       const char*     catalog;        /* message catalog              */
+};
 
 #ifndef errno
 extern int     errno;                  /* system call error status     */
@@ -150,7 +158,9 @@
 #define extern         extern __IMPORT__
 #endif
 
-extern Error_info_t    error_info;
+extern Error_info_t*   _error_infop_;
+
+#define error_info     (*_error_infop_)
 
 #undef extern
 
@@ -158,16 +168,14 @@
 #define extern         __EXPORT__
 #endif
 
-extern void    error(int, ...);
-extern int     errormsg(const char*, int, ...);
-extern int     errorf(void*, void*, int, ...);
-extern void    errorv(const char*, int, va_list);
+extern void            error(int, ...);
+extern int             errormsg(const char*, int, ...);
+extern int             errorf(void*, void*, int, ...);
+extern void            errorv(const char*, int, va_list);
 #ifndef errorx
-extern char*   errorx(const char*, const char*, const char*, const char*);
+extern char*           errorx(const char*, const char*, const char*, const 
char*);
 #endif
-
-extern void    liberror(const char*, int, ...);        /* OBSOLETE 20000101 */
-extern int     libevent(void*, void*, int, ...);       /* OBSOLETE 19990101 */
+extern Error_info_t*   errorctx(Error_info_t*, int, int);
 
 #undef extern
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/fnv.h 
ksh93_2007_03_28/src/lib/libast/include/fnv.h
--- ksh93_2007_01_11/src/lib/libast/include/fnv.h       2003-09-29 
18:49:08.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/include/fnv.h       2007-03-13 
16:33:13.000000000 +0100
@@ -38,14 +38,14 @@
 #define FNV_MULT       0x01000193L
 
 #define FNVINIT(h)     (h = FNV_INIT)
-#define FNVPART(h,c)   (h = h * FNV_MULT ^ (c))
+#define FNVPART(h,c)   (h = (h) * FNV_MULT ^ (c))
 #define FNVSUM(h,s,n)  do { \
                        register size_t _i_ = 0; \
                        while (_i_ < n) \
                                FNVPART(h, ((unsigned char*)s)[_i_++]); \
                        } while (0)
 
-#ifdef _ast_int8_t
+#if _typ_int64_t
 
 #ifdef _ast_LL
 
@@ -54,13 +54,13 @@
 
 #else
 
-#define FNV_INIT64     ((_ast_int8_t)0xcbf29ce484222325)
-#define FNV_MULT64     ((_ast_int8_t)0x00000100000001b3)
+#define FNV_INIT64     ((int64_t)0xcbf29ce484222325)
+#define FNV_MULT64     ((int64_t)0x00000100000001b3)
 
 #endif
 
 #define FNVINIT64(h)   (h = FNV_INIT64)
-#define FNVPART64(h,c) (h = h * FNV_MULT64 ^ (c))
+#define FNVPART64(h,c) (h = (h) * FNV_MULT64 ^ (c))
 #define FNVSUM64(h,s,n)        do { \
                        register int _i_ = 0; \
                        while (_i_ < n) \
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/int.h 
ksh93_2007_03_28/src/lib/libast/include/int.h
--- ksh93_2007_01_11/src/lib/libast/include/int.h       1998-03-17 
14:44:13.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/int.h       1970-01-01 
01:00:00.000000000 +0100
@@ -1,59 +0,0 @@
-/***********************************************************************
-*                                                                      *
-*               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>                    *
-*                                                                      *
-***********************************************************************/
-/*
- * types by byte capacity
- */
-
-#ifndef _INT_H
-#define _INT_H
-
-#include <ast_common.h>
-
-#ifdef _ast_int1_t
-#define int_1          _ast_int1_t
-#endif
-#ifdef _ast_int2_t
-#define int_2          _ast_int2_t
-#endif
-#ifdef _ast_int4_t
-#define int_4          _ast_int4_t
-#endif
-#ifdef _ast_int8_t
-#define int_8          _ast_int8_t
-#endif
-
-#define int_max                _ast_intmax_t
-#define int_swap       _ast_intswap
-
-#ifdef _ast_flt4_t
-#define flt_4          _ast_flt4_t
-#endif
-#ifdef _ast_flt8_t
-#define flt_8          _ast_flt8_t
-#endif
-#ifdef _ast_flt16_t
-#define flt_16         _ast_flt16_t
-#endif
-
-#define flt_max                _ast_fltmax_t
-
-#endif
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/magicid.h 
ksh93_2007_03_28/src/lib/libast/include/magicid.h
--- ksh93_2007_01_11/src/lib/libast/include/magicid.h   2002-01-16 
17:00:27.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/magicid.h   2007-02-14 
07:43:23.000000000 +0100
@@ -32,7 +32,7 @@
 
 #define MAGICID                0x00010203
 
-typedef unsigned _ast_int4_t Magicid_data_t;
+typedef uint32_t Magicid_data_t;
 
 typedef struct Magicid_s
 {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/option.h 
ksh93_2007_03_28/src/lib/libast/include/option.h
--- ksh93_2007_01_11/src/lib/libast/include/option.h    2004-11-01 
16:25:34.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/option.h    2007-03-22 
23:14:38.000000000 +0100
@@ -32,9 +32,7 @@
 
 #include <ast.h>
 
-#define OPT_VERSION    20000401L
-
-#define opt_info       _opt_info_
+#define OPT_VERSION    20070319L
 
 #define OPT_USER       (1L<<16)        /* first user flag bit          */
 
@@ -70,7 +68,7 @@
        char            option[8];      /* current flag {-,+} + option  */
        char            name[64];       /* current long name or flag    */
        Optdisc_t*      disc;           /* user discipline              */
-       _ast_intmax_t   number;         /* # numeric argument           */
+       intmax_t        number;         /* # numeric argument           */
        unsigned char   assignment;     /* option arg assigment op      */
        unsigned char   pads[sizeof(void*)-1];
        _OPT_PRIVATE_
@@ -83,7 +81,9 @@
 #define extern         extern __IMPORT__
 #endif
 
-extern Opt_t           opt_info;
+extern Opt_t*          _opt_infop_;
+
+#define opt_info       (*_opt_infop_)
 
 #undef extern
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/recfmt.h 
ksh93_2007_03_28/src/lib/libast/include/recfmt.h
--- ksh93_2007_01_11/src/lib/libast/include/recfmt.h    2005-11-15 
16:39:28.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/recfmt.h    2007-02-14 
07:43:45.000000000 +0100
@@ -32,7 +32,7 @@
 
 #include <ast.h>
 
-typedef unsigned _ast_int4_t Recfmt_t;
+typedef uint32_t Recfmt_t;
 
 #define REC_delimited          0
 #define REC_fixed              1
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/regex.h 
ksh93_2007_03_28/src/lib/libast/include/regex.h
--- ksh93_2007_01_11/src/lib/libast/include/regex.h     2006-10-26 
15:45:12.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/include/regex.h     2007-03-21 
15:57:41.000000000 +0100
@@ -127,7 +127,7 @@
 struct regdisc_s; typedef struct regdisc_s regdisc_t;
 
 typedef int (*regclass_t)(int);
-typedef _ast_int4_t regflags_t;
+typedef int32_t regflags_t;
 typedef int regoff_t;
 typedef int (*regerror_t)(const regex_t*, regdisc_t*, int, ...);
 typedef void* (*regcomp_t)(const regex_t*, const char*, size_t, regdisc_t*);
@@ -182,7 +182,7 @@
        regsub_t*       re_sub;         /* regsubcomp() data            */
 };
 
-#define reginit(disc)  
(memset(disc,0,sizeof(*disc)),disc->re_version=REG_VERSION)
+#define reginit(disc)  
(memset(disc,0,sizeof(*(disc))),(disc)->re_version=REG_VERSION)
 
 #if _BLD_ast && defined(__EXPORT__)
 #define extern         __EXPORT__
@@ -195,9 +195,14 @@
 
 /* nonstandard hooks */
 
+#define _REG_cache     1       /* have regcache()                      */
+#define _REG_class     1       /* have regclass()                      */
 #define _REG_collate   1       /* have regcollate(), regclass()        */
 #define _REG_comb      1       /* have regcomb()                       */
+#define _REG_decomp    1       /* have regdecomp()                     */
+#define _REG_dup       1       /* have regdup()                        */
 #define _REG_fatal     1       /* have regfatal(), regfatalpat()       */
+#define _REG_ncomp     1       /* have regncomp()                      */
 #define _REG_nexec     1       /* have regnexec()                      */
 #define _REG_rexec     1       /* have regrexec(), regrecord()         */
 #define _REG_stat      1       /* have regstat()                       */
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/sfio.h 
ksh93_2007_03_28/src/lib/libast/include/sfio.h
--- ksh93_2007_01_11/src/lib/libast/include/sfio.h      2005-04-30 
11:12:52.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/include/sfio.h      2007-03-13 
16:29:07.000000000 +0100
@@ -31,7 +31,6 @@
 
 typedef struct _sfio_s         Sfio_t;
 typedef struct _sfdisc_s       Sfdisc_t;
-typedef struct _sfieee_s       Sfieee_t;
 
 #if defined(_AST_STD_H) || defined(_PACKAGE_ast) && defined(_SFIO_PRIVATE)
 #include       <ast_std.h>
@@ -40,9 +39,9 @@
 #endif /* _PACKAGE_ast */
 
 /* Sfoff_t should be large enough for largest file address */
-#define Sfoff_t                _ast_intmax_t
-#define Sflong_t       _ast_intmax_t
-#define Sfulong_t      unsigned _ast_intmax_t
+#define Sfoff_t                intmax_t
+#define Sflong_t       intmax_t
+#define Sfulong_t      uintmax_t
 #define Sfdouble_t     _ast_fltmax_t
 
 typedef ssize_t                (*Sfread_f)_ARG_((Sfio_t*, Void_t*, size_t, 
Sfdisc_t*));
@@ -59,16 +58,6 @@
        Sfdisc_t*       disc;           /* the continuing discipline    */
 };
 
-/* IEEE constants structure */
-struct _sfieee_s
-{      float           fltnan;         /* float NAN                    */
-       float           fltinf;         /* float INF                    */
-       double          dblnan;         /* double NAN                   */
-       double          dblinf;         /* double INF                   */
-       Sfdouble_t      ldblnan;        /* Sfdouble_t NAN               */
-       Sfdouble_t      ldblinf;        /* Sfdouble_t INF               */
-};
-
 #include <sfio_s.h>
 
 /* formatting environment */
@@ -81,7 +70,7 @@
        Sffmtevent_f    eventf; /* process events                       */
 
        char*           form;   /* format string to stack               */
-       _ast_va_list    args;   /* corresponding arg list               */
+       va_list args;   /* corresponding arg list               */
 
        int             fmt;    /* format character                     */
        ssize_t         size;   /* object size                          */
@@ -98,28 +87,29 @@
        Void_t*         none;   /* unused for now                       */
 };
 #define sffmtversion(fe,type) \
-               (type ? ((fe)->version = SFIO_VERSION) : (fe)->version)
+               ((type) ? ((fe)->version = SFIO_VERSION) : (fe)->version)
 
-#define SFFMT_SSHORT   00000010 /* 'hh' flag, char                     */
-#define SFFMT_TFLAG    00000020 /* 't' flag, ptrdiff_t                 */
-#define SFFMT_ZFLAG    00000040 /* 'z' flag, size_t                    */
-
-#define SFFMT_LEFT     00000100 /* left-justification                  */
-#define SFFMT_SIGN     00000200 /* must have a sign                    */
-#define SFFMT_BLANK    00000400 /* if not signed, prepend a blank      */
-#define SFFMT_ZERO     00001000 /* zero-padding on the left            */
-#define SFFMT_ALTER    00002000 /* alternate formatting                */
-#define SFFMT_THOUSAND 00004000 /* thousand grouping                   */
-#define SFFMT_SKIP     00010000 /* skip assignment in scanf()          */
-#define SFFMT_SHORT    00020000 /* 'h' flag                            */
-#define SFFMT_LONG     00040000 /* 'l' flag                            */
-#define SFFMT_LLONG    00100000 /* 'll' flag                           */
-#define SFFMT_LDOUBLE  00200000 /* 'L' flag                            */
-#define SFFMT_VALUE    00400000 /* value is returned                   */
-#define SFFMT_ARGPOS   01000000 /* getting arg for $ patterns          */
-#define SFFMT_IFLAG    02000000 /* 'I' flag                            */
-#define SFFMT_JFLAG    04000000 /* 'j' flag, intmax_t                  */
-#define SFFMT_SET      07777770 /* flags settable on calling extf      */
+#define SFFMT_SSHORT   000000010 /* 'hh' flag, char                    */
+#define SFFMT_TFLAG    000000020 /* 't' flag, ptrdiff_t                        
*/
+#define SFFMT_ZFLAG    000000040 /* 'z' flag, size_t                   */
+
+#define SFFMT_LEFT     000000100 /* left-justification                 */
+#define SFFMT_SIGN     000000200 /* must have a sign                   */
+#define SFFMT_BLANK    000000400 /* if not signed, prepend a blank     */
+#define SFFMT_ZERO     000001000 /* zero-padding on the left           */
+#define SFFMT_ALTER    000002000 /* alternate formatting               */
+#define SFFMT_THOUSAND 000004000 /* thousand grouping                  */
+#define SFFMT_SKIP     000010000 /* skip assignment in scanf()         */
+#define SFFMT_SHORT    000020000 /* 'h' flag                           */
+#define SFFMT_LONG     000040000 /* 'l' flag                           */
+#define SFFMT_LLONG    000100000 /* 'll' flag                          */
+#define SFFMT_LDOUBLE  000200000 /* 'L' flag                           */
+#define SFFMT_VALUE    000400000 /* value is returned                  */
+#define SFFMT_ARGPOS   001000000 /* getting arg for $ patterns         */
+#define SFFMT_IFLAG    002000000 /* 'I' flag                           */
+#define SFFMT_JFLAG    004000000 /* 'j' flag, intmax_t                 */
+#define SFFMT_CENTER   010000000 /* '=' flag, center justification     */
+#define SFFMT_SET      017777770 /* flags settable on calling extf     */
 
 /* for sfmutex() call */
 #define SFMTX_LOCK     0       /* up mutex count                       */
@@ -156,9 +146,10 @@
 #define SF_MTSAFE      0010000 /* need thread safety                   */
 #define SF_WHOLE       0020000 /* preserve wholeness of sfwrite/sfputr */
 #define SF_IOINTR      0040000 /* return on interrupts                 */
+#define SF_WCWIDTH     0100000 /* wcwidth display stream               */
 
-#define SF_FLAGS       0077177 /* PUBLIC FLAGS PASSABLE TO SFNEW()     */
-#define SF_SETS                0077163 /* flags passable to sfset()            
*/
+#define SF_FLAGS       0177177 /* PUBLIC FLAGS PASSABLE TO SFNEW()     */
+#define SF_SETS                0177163 /* flags passable to sfset()            
*/
 
 #ifndef _SF_NO_OBSOLETE
 #define SF_BUFCONST    0400000 /* unused flag - for compatibility only */
@@ -266,12 +257,12 @@
 extern int             sfprintf _ARG_((Sfio_t*, const char*, ...));
 extern char*           sfprints _ARG_((const char*, ...));
 extern ssize_t         sfsprintf _ARG_((char*, size_t, const char*, ...));
-extern ssize_t         sfvsprintf _ARG_((char*, size_t, const char*, 
_ast_va_list));
-extern int             sfvprintf _ARG_((Sfio_t*, const char*, _ast_va_list));
+extern ssize_t         sfvsprintf _ARG_((char*, size_t, const char*, va_list));
+extern int             sfvprintf _ARG_((Sfio_t*, const char*, va_list));
 extern int             sfscanf _ARG_((Sfio_t*, const char*, ...));
 extern int             sfsscanf _ARG_((const char*, const char*, ...));
-extern int             sfvsscanf _ARG_((const char*, const char*, 
_ast_va_list));
-extern int             sfvscanf _ARG_((Sfio_t*, const char*, _ast_va_list));
+extern int             sfvsscanf _ARG_((const char*, const char*, va_list));
+extern int             sfvscanf _ARG_((Sfio_t*, const char*, va_list));
 
 /* mutex locking for thread-safety */
 extern int             sfmutex _ARG_((Sfio_t*, int));
@@ -283,8 +274,6 @@
 extern ssize_t         sfpkrd _ARG_((int, Void_t*, size_t, int, long, int));
 
 /* portable handling of primitive types */
-extern Sfieee_t*       sfieee _ARG_((void));
-
 extern int             sfdlen _ARG_((Sfdouble_t));
 extern int             sfllen _ARG_((Sflong_t));
 extern int             sfulen _ARG_((Sfulong_t));
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/swap.h 
ksh93_2007_03_28/src/lib/libast/include/swap.h
--- ksh93_2007_01_11/src/lib/libast/include/swap.h      1997-10-22 
22:11:39.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/include/swap.h      2007-02-14 
08:16:33.000000000 +0100
@@ -25,13 +25,15 @@
  * AT&T Research
  *
  * integral representation conversion support definitions
- * supports sizeof(integral_type)<=sizeof(int_max)
+ * supports sizeof(integral_type)<=sizeof(intmax_t)
  */
 
 #ifndef _SWAP_H
 #define _SWAP_H
 
-#include <int.h>
+#include <ast_common.h>
+
+#define int_swap       _ast_intswap
 
 #define SWAP_MAX       8
 
@@ -42,8 +44,8 @@
 #endif
 
 extern void*           swapmem(int, const void*, void*, size_t);
-extern int_max         swapget(int, const void*, int);
-extern void*           swapput(int, void*, int, int_max);
+extern intmax_t                swapget(int, const void*, int);
+extern void*           swapput(int, void*, int, intmax_t);
 extern int             swapop(const void*, const void*, int);
 
 #undef extern
diff -r -N -u ksh93_2007_01_11/src/lib/libast/include/tm.h 
ksh93_2007_03_28/src/lib/libast/include/tm.h
--- ksh93_2007_01_11/src/lib/libast/include/tm.h        2005-01-05 
07:05:12.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/include/tm.h        2007-03-22 
23:10:16.000000000 +0100
@@ -30,10 +30,7 @@
 #ifndef _TM_H
 #define _TM_H
 
-#define TM_VERSION     20041201L
-
-#define tm_data                _tm_data_
-#define tm_info                _tm_info_
+#define TM_VERSION     20070319L
 
 #include <ast.h>
 #include <times.h>
@@ -146,7 +143,7 @@
        int                     tm_wday;
        int                     tm_yday;
        int                     tm_isdst;
-       unsigned _ast_int4_t    tm_nsec;
+       uint32_t                tm_nsec;
        Tm_zone_t*              tm_zone;
 } Tm_t;
 
@@ -157,8 +154,11 @@
 #define extern         extern __IMPORT__
 #endif
 
-extern Tm_data_t       tm_data;
-extern Tm_info_t       tm_info;
+extern Tm_data_t*      _tm_datap_;
+extern Tm_info_t*      _tm_infop_;
+
+#define tm_data                (*_tm_datap_)
+#define tm_info                (*_tm_infop_)
 
 #undef extern
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/Makefile 
ksh93_2007_03_28/src/lib/libast/Makefile
--- ksh93_2007_01_11/src/lib/libast/Makefile    2006-12-11 17:49:36.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/Makefile    2007-03-22 18:27:48.000000000 
+0100
@@ -30,7 +30,7 @@
 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 int.h lc.h ls.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 \
@@ -84,7 +84,6 @@
        error.c errorf.c errormsg.c errorx.c \
        localeconv.c setlocale.c translate.c \
        catopen.c iconv.c lc.c mc.c \
-       liberror.c libevent.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 \
@@ -148,7 +147,7 @@
        sfclose.c sfclrlock.c sfdisc.c sfdlen.c sfexcept.c \
        sfgetl.c sfgetu.c sfcvt.c sfecvt.c sffcvt.c \
        sfextern.c sffilbuf.c sfflsbuf.c sfprints.c sfgetd.c \
-       sfgetr.c sfieee.c sfllen.c sfmode.c sfmove.c sfnew.c \
+       sfgetr.c sfllen.c sfmode.c sfmove.c sfnew.c \
        sfpkrd.c sfnotify.c sfnputc.c sfopen.c sfpeek.c sfpoll.c \
        sfpool.c sfpopen.c sfprintf.c sfputd.c sfputl.c sfputr.c \
        sfputu.c sfrd.c sfread.c sfreserve.c sfscanf.c sfseek.c sfset.c \
diff -r -N -u ksh93_2007_01_11/src/lib/libast/Mamfile 
ksh93_2007_03_28/src/lib/libast/Mamfile
--- ksh93_2007_01_11/src/lib/libast/Mamfile     2007-01-12 10:54:50.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/Mamfile     2007-03-29 19:07:12.000000000 
+0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-01-11
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
 setv INSTALLROOT ../../..
 setv PACKAGEROOT ../../../../..
 setv AR ar
@@ -1198,9 +1198,7 @@
 prev include/sfio.h implicit
 done include/magic.h
 make include/swap.h implicit
-make include/int.h implicit
 prev ast_common.h implicit
-done include/int.h dontcare
 done include/swap.h
 prev include/regex.h implicit
 prev include/error.h implicit
@@ -1273,6 +1271,7 @@
 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
@@ -1284,7 +1283,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 -DERROR_CATALOG=\""libast"\" -D_PACKAGE_ast -c 
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
 done error.o generated
 make errorf.o
 make misc/errorf.c
@@ -1461,22 +1460,6 @@
 prev port/mc.c
 exec - ${CC} ${mam_cc_FLAGS} ${-debug-symbols?1?${mam_cc_DEBUG} 
-D_BLD_DEBUG?${CCFLAGS.FORCE}?} -I. -Icomp -Iport -Isfio -Iinclude -Istd 
-I${INSTALLROOT}/include -D_PACKAGE_ast -c port/mc.c
 done mc.o generated
-make liberror.o
-make misc/liberror.c
-prev include/error.h implicit
-done misc/liberror.c
-meta liberror.o %.c>%.o misc/liberror.c liberror
-prev misc/liberror.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd 
-D_PACKAGE_ast -c misc/liberror.c
-done liberror.o generated
-make libevent.o
-make misc/libevent.c
-prev include/error.h implicit
-done misc/libevent.c
-meta libevent.o %.c>%.o misc/libevent.c libevent
-prev misc/libevent.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd 
-D_PACKAGE_ast -c misc/libevent.c
-done libevent.o generated
 make base64.o
 make string/base64.c
 prev include/ast.h implicit
@@ -2947,11 +2930,11 @@
 done symlink.o generated
 make getpgrp.o
 make comp/getpgrp.c
-prev ast_common.h implicit
+prev include/ast_std.h implicit
 done comp/getpgrp.c
 meta getpgrp.o %.c>%.o comp/getpgrp.c getpgrp
 prev comp/getpgrp.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Istd  -c comp/getpgrp.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd  -c 
comp/getpgrp.c
 done getpgrp.o generated
 make setpgid.o
 make comp/setpgid.c
@@ -3270,11 +3253,11 @@
 done wc.o generated
 make basename.o
 make comp/basename.c
-prev ast_common.h implicit
+prev include/ast_std.h implicit
 done comp/basename.c
 meta basename.o %.c>%.o comp/basename.c basename
 prev comp/basename.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Istd  -c comp/basename.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd  -c 
comp/basename.c
 done basename.o generated
 make closelog.o
 make comp/closelog.c
@@ -3291,11 +3274,11 @@
 done closelog.o generated
 make dirname.o
 make comp/dirname.c
-prev ast_common.h implicit
+prev include/ast_std.h implicit
 done comp/dirname.c
 meta dirname.o %.c>%.o comp/dirname.c dirname
 prev comp/dirname.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Istd  -c comp/dirname.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iinclude -Istd  -c 
comp/dirname.c
 done dirname.o generated
 make fmtmsglib.o
 make comp/fmtmsglib.c
@@ -3946,14 +3929,6 @@
 prev sfio/sfgetr.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Isfio -Iinclude 
-Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfgetr.c
 done sfgetr.o generated
-make sfieee.o
-make sfio/sfieee.c
-prev sfio/sfhdr.h implicit
-done sfio/sfieee.c
-meta sfieee.o %.c>%.o sfio/sfieee.c sfieee
-prev sfio/sfieee.c
-exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -Icomp -Iport -Isfio -Iinclude 
-Istd -I${INSTALLROOT}/include -D_PACKAGE_ast -c sfio/sfieee.c
-done sfieee.o generated
 make sfllen.o
 make sfio/sfllen.c
 prev sfio/sfhdr.h implicit
@@ -5780,12 +5755,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 
liberror.o libevent.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 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
-exec - ${AR} cr libast.a 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 dtrestore.o
-exec - ${AR} cr libast.a 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 sfieee.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 - ${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 - (ranlib libast.a) >/dev/null 2>&1 || true
 done libast.a generated
 done ast virtual
@@ -6279,14 +6254,6 @@
 exec - else    mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/hashpart.h
 exec - fi
 done ${INSTALLROOT}/include/ast/hashpart.h generated
-make ${INSTALLROOT}/include/ast/int.h
-prev include/int.h
-exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  include/int.h  > 1.${COTEMP}.x
-exec - if      cmp 2>/dev/null -s ${INSTALLROOT}/include/ast/int.h 
1.${COTEMP}.x
-exec - then    rm -f 1.${COTEMP}.x
-exec - else    mv 1.${COTEMP}.x ${INSTALLROOT}/include/ast/int.h
-exec - fi
-done ${INSTALLROOT}/include/ast/int.h generated
 make ${INSTALLROOT}/include/ast/lc.h
 prev lc.h
 exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1985,author=gsf+dgk+kpv'  lc.h  > 1.${COTEMP}.x
diff -r -N -u ksh93_2007_01_11/src/lib/libast/man/astsa.3 
ksh93_2007_03_28/src/lib/libast/man/astsa.3
--- ksh93_2007_01_11/src/lib/libast/man/astsa.3 2004-11-04 04:45:04.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/man/astsa.3 2007-01-18 18:11:34.000000000 
+0100
@@ -21,14 +21,14 @@
 .de RL
 .aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
 ..
-.de Ex         \" start example
+.de EX         \" start example
 .ta 1i 2i 3i 4i 5i 6i
 .PP
 .PD 0
 .ft 5
 .nf
 ..
-.de Ee         \" end example
+.de EE         \" end example
 .fi
 .ft
 .PD
@@ -47,15 +47,15 @@
 .ta 1.0i 2.0i 3.0i 4.0i 5.0i
 .TH AST 3
 .SH NAME
-astsa \- stanadlone libast support
+astsa \- standalone libast support
 .SH SYNOPSIS
-.Ex
+.EX
 #include <ast.h>
 #include <ccode.h>
 #include <error.h>
 #include <option.h>
 #include <stk.h>
-.Ee
+.EE
 .SH DESCRIPTION
 .B astsa
 is a standalone subset of
diff -r -N -u ksh93_2007_01_11/src/lib/libast/misc/error.c 
ksh93_2007_03_28/src/lib/libast/misc/error.c
--- ksh93_2007_01_11/src/lib/libast/misc/error.c        2007-01-06 
11:37:57.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/misc/error.c        2007-03-23 
03:53:27.000000000 +0100
@@ -44,21 +44,39 @@
 #include <times.h>
 #include <regex.h>
 
+/*
+ * 2007-03-19 move error_info from _error_info_ to (*_error_infop_)
+ *           to allow future Error_info_t growth
+ *            by 2009 _error_info_ can be static
+ */
+
+#if _BLD_ast && defined(__EXPORT__)
+#define extern         extern __EXPORT__
+#endif
+
+extern Error_info_t    _error_info_;
+
 Error_info_t   _error_info_ =
 {
        2, exit, write,
        0,0,0,0,0,0,0,0,
-       0,
-       0,
-       0,0,0,0,0,0,0,
-       0,0,0,0,0,0,0,
-       0,
+       0,                      /* version                      */
+       0,                      /* auxilliary                   */
+       0,0,0,0,0,0,0,          /* top of old context stack     */
+       0,0,0,0,0,0,0,          /* old empty context            */
+       0,                      /* time                         */
        translate,
-       0
+       0                       /* catalog                      */
 };
 
+#undef extern
+
 __EXTERN__(Error_info_t, _error_info_);
 
+__EXTERN__(Error_info_t*, _error_infop_);
+
+Error_info_t*  _error_infop_ = &_error_info_;
+
 /*
  * these should probably be in error_info
  */
@@ -280,11 +298,13 @@
  * print error context FIFO stack
  */
 
+#define CONTEXT(f,p)   
(((f)&ERROR_PUSH)?((Error_context_t*)&(p)->context->context):((Error_context_t*)(p)))
+
 static void
 context(register Sfio_t* sp, register Error_context_t* cp)
 {
        if (cp->context)
-               context(sp, cp->context);
+               context(sp, CONTEXT(cp->flags, cp->context));
        if (!(cp->flags & ERROR_SILENT))
        {
                if (cp->id)
@@ -431,7 +451,7 @@
                        if (level && !(flags & ERROR_NOID))
                        {
                                if (error_info.context && level > 0)
-                                       context(stkstd, error_info.context);
+                                       context(stkstd, 
CONTEXT(error_info.flags, error_info.context));
                                if (file)
                                        print(stkstd, file, (flags & 
ERROR_LIBRARY) ? " " : ": ");
                                if (flags & (ERROR_CATALOG|ERROR_LIBRARY))
@@ -459,8 +479,8 @@
 #if !_PACKAGE_astsa
                if (error_info.time)
                {
-                       if (error_info.time == 1 || (d = times(&us)) < 
error_info.time)
-                               d = error_info.time = times(&us);
+                       if ((d = times(&us)) < error_info.time || 
error_info.time == 1)
+                               error_info.time = d;
                        sfprintf(stkstd, " %05lu.%05lu.%05lu ", d - 
error_info.time, (unsigned long)us.tms_utime, (unsigned long)us.tms_stime);
                }
 #endif
@@ -594,3 +614,48 @@
        if (level >= ERROR_FATAL)
                (*error_info.exit)(level - ERROR_FATAL + 1);
 }
+
+/*
+ * error_info context control
+ */
+
+#include <error.h>
+
+static Error_info_t*   freecontext;
+
+Error_info_t*
+errorctx(Error_info_t* p, int op, int flags)
+{
+       if (op & ERROR_POP)
+       {
+               if (!(_error_infop_ = p->context))
+                       _error_infop_ = &_error_info_;
+               if (op & ERROR_FREE)
+               {
+                       p->context = freecontext;
+                       freecontext = p;
+               }
+               p = _error_infop_;
+       }
+       else
+       {
+               if (!p)
+               {
+                       if (p = freecontext)
+                               freecontext = freecontext->context;
+                       else if (!(p = newof(0, Error_info_t, 1, 0)))
+                               return 0;
+                       *p = *_error_infop_;
+                       p->errors = p->flags = p->line = p->warnings = 0;
+                       p->catalog = p->file = 0;
+               }
+               if (op & ERROR_PUSH)
+               {
+                       p->flags = flags;
+                       p->context = _error_infop_;
+                       _error_infop_ = p;
+               }
+               p->flags |= ERROR_PUSH;
+       }
+       return p;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libast/misc/errorx.c 
ksh93_2007_03_28/src/lib/libast/misc/errorx.c
--- ksh93_2007_01_11/src/lib/libast/misc/errorx.c       2001-03-16 
17:03:13.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/misc/errorx.c       2007-03-22 
05:12:20.000000000 +0100
@@ -33,16 +33,15 @@
 {
        char*   s;
 
+       error_info.translate = translate; /* 2007-03-19 OLD_Error_info_t 
workaround */
        if (ERROR_translating())
        {
                if (!loc)
                        loc = (const char*)locales[AST_LC_MESSAGES]->code;
                if (!cat)
-               {
                        cat = (const char*)error_info.catalog;
-                       if (!cmd)
-                               cmd = (const char*)error_info.id;
-               }
+               if (!cmd)
+                       cmd = (const char*)error_info.id;
                if (s = (*error_info.translate)(loc, cmd, cat, msg))
                        return s;
        }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/misc/fastfind.c 
ksh93_2007_03_28/src/lib/libast/misc/fastfind.c
--- ksh93_2007_01_11/src/lib/libast/misc/fastfind.c     2004-10-18 
19:17:44.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/misc/fastfind.c     2007-02-14 
07:46:22.000000000 +0100
@@ -772,7 +772,7 @@
                                        return 0;
                                if (fp->decode.swap >= 0)
                                {
-                                       c = (_ast_int4_t)((w[0] << 24) | (w[1] 
<< 16) | (w[2] << 8) | w[3]);
+                                       c = (int32_t)((w[0] << 24) | (w[1] << 
16) | (w[2] << 8) | w[3]);
                                        if (!fp->decode.swap)
                                        {
                                                /*
@@ -788,7 +788,7 @@
                                                m = c;
                                                if (m < 0)
                                                        m = -m;
-                                               n = (_ast_int4_t)((w[3] << 24) 
| (w[2] << 16) | (w[1] << 8) | w[0]);
+                                               n = (int32_t)((w[3] << 24) | 
(w[2] << 16) | (w[1] << 8) | w[0]);
                                                if (n < 0)
                                                        n = -n;
                                                if (m < n)
@@ -796,12 +796,12 @@
                                                else
                                                {
                                                        fp->decode.swap = -1;
-                                                       c = (_ast_int4_t)((w[3] 
<< 24) | (w[2] << 16) | (w[1] << 8) | w[0]);
+                                                       c = (int32_t)((w[3] << 
24) | (w[2] << 16) | (w[1] << 8) | w[0]);
                                                }
                                        }
                                }
                                else
-                                       c = (_ast_int4_t)((w[3] << 24) | (w[2] 
<< 16) | (w[1] << 8) | w[0]);
+                                       c = (int32_t)((w[3] << 24) | (w[2] << 
16) | (w[1] << 8) | w[0]);
                        }
                        fp->decode.count += c - FF_OFF;
                        for (p = fp->decode.path + fp->decode.count; (c = 
sfgetc(fp->fp)) > FF_ESC;)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/misc/optget.c 
ksh93_2007_03_28/src/lib/libast/misc/optget.c
--- ksh93_2007_01_11/src/lib/libast/misc/optget.c       2006-10-13 
06:41:13.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/misc/optget.c       2007-03-28 
08:13:50.000000000 +0200
@@ -45,30 +45,32 @@
 #define OPT_MARGIN     10              /* default help text margin     */
 #define OPT_USAGE      7               /* usage continuation indent    */
 
-#define OPT_flag       0001            /* flag ( 0 or 1 )              */
-#define OPT_hidden     0002            /* remaining are hidden         */
-#define OPT_ignorecase 0004            /* arg match ignores case       */
-#define OPT_invert     0010            /* flag inverts long sense      */
-#define OPT_listof     0020            /* arg is ' ' or ',' list       */
-#define OPT_number     0040            /* arg is strtonll() number     */
-#define OPT_oneof      0100            /* arg may be set once          */
-#define OPT_optional   0200            /* arg is optional              */
-#define OPT_string     0400            /* arg is string                */
+#define OPT_flag       0x001           /* flag ( 0 or 1 )              */
+#define OPT_hidden     0x002           /* remaining are hidden         */
+#define OPT_ignorecase 0x004           /* arg match ignores case       */
+#define OPT_invert     0x008           /* flag inverts long sense      */
+#define OPT_listof     0x010           /* arg is ' ' or ',' list       */
+#define OPT_minus      0x021           /* '-' is an option flag        */
+#define OPT_number     0x040           /* arg is strtonll() number     */
+#define OPT_oneof      0x080           /* arg may be set once          */
+#define OPT_optional   0x100           /* arg is optional              */
+#define OPT_string     0x200           /* arg is string                */
 
 #define OPT_preformat  0001            /* output preformat string      */
 
 #define OPT_TYPE       (OPT_flag|OPT_number|OPT_string)
 
-#define STYLE_short    0               /* [default] short usage        */
-#define STYLE_long     1               /* long usage                   */
-#define STYLE_match    2               /* long description of matches  */
-#define STYLE_options  3               /* short and long descriptions  */
-#define STYLE_man      4               /* pretty details               */
-#define STYLE_html     5               /* html details                 */
-#define STYLE_nroff    6               /* nroff details                */
-#define STYLE_api      7               /* program details              */
-#define STYLE_keys     8               /* translation key strings      */
-#define STYLE_usage    9               /* escaped usage string         */
+#define STYLE_posix    0               /* posix getopt usage           */
+#define STYLE_short    1               /* [default] short usage        */
+#define STYLE_long     2               /* long usage                   */
+#define STYLE_match    3               /* long description of matches  */
+#define STYLE_options  4               /* short and long descriptions  */
+#define STYLE_man      5               /* pretty details               */
+#define STYLE_html     6               /* html details                 */
+#define STYLE_nroff    7               /* nroff details                */
+#define STYLE_api      8               /* program details              */
+#define STYLE_keys     9               /* translation key strings      */
+#define STYLE_usage    10              /* escaped usage string         */
 
 #define FONT_BOLD      1
 #define FONT_ITALIC    2
@@ -222,6 +224,8 @@
        Z("List detailed info in nroff."),
        C("options"),   "?options",     STYLE_options,
        Z("List short and long option details."),
+       C("posix"),     "?posix",       STYLE_posix,
+       Z("List posix getopt usage."),
        C("short"),     "?short",       STYLE_short,
        Z("List short option usage."),
        C("usage"),     "?usage",       STYLE_usage,
@@ -320,10 +324,28 @@
 
 static Optstate_t      state;
 
-Opt_t                  opt_info = { 0,0,0,0,0,0,0,{0},{0},0,0,0,{0},{0},&state 
};
+/*
+ * 2007-03-19 move opt_info from _opt_info_ to (*_opt_data_)
+ *           to allow future Opt_t growth
+ *            by 2009 _opt_info_ can be static
+ */
+
+#if _BLD_ast && defined(__EXPORT__)
+#define extern         extern __EXPORT__
+#endif
+
+extern Opt_t   _opt_info_;
+
+Opt_t          _opt_info_ = { 0,0,0,0,0,0,0,{0},{0},0,0,0,{0},{0},&state };
+
+#undef extern
 
 __EXTERN__(Opt_t, _opt_info_);
 
+__EXTERN__(Opt_t*, _opt_infop_);
+
+Opt_t*         _opt_infop_ = &_opt_info_;
+
 #if _BLD_DEBUG
 
 /*
@@ -542,8 +564,8 @@
                                w = skip(t, ':', '?', 0, 1, 0, 0, version);
                                w = sfprints("%-.*s", w - t, t);
                                x = T(error_info.id, catalog, w);
-                               if (x != w)
-                                       break;
+                               if (x == w)
+                                       continue;
                        }
                        x = T(NiL, ID, t);
                        if (x == t)
@@ -809,8 +831,6 @@
                else
                        p->catalog = ID;
        }
-       if (!error_info.catalog)
-               error_info.catalog = p->catalog;
        s = p->oopts;
        if (*s == ':')
                s++;
@@ -819,6 +839,17 @@
                s++;
                p->flags |= OPT_plus;
        }
+       if (*s != '[')
+               for (t = s, a = 0; *t; t++)
+                       if (!a && *t == '-')
+                       {
+                               p->flags |= OPT_minus;
+                               break;
+                       }
+                       else if (*t == '[')
+                               a++;
+                       else if (*t == ']')
+                               a--;
        if (!p->version && (t = strchr(s, '(')) && strchr(t, ')') && 
(opt_info.state->cp || (opt_info.state->cp = sfstropen())))
        {
                /*
@@ -880,6 +911,7 @@
                return fonts[f].nroff[set];
        case STYLE_short:
        case STYLE_long:
+       case STYLE_posix:
        case STYLE_api:
                break;
        default:
@@ -2098,6 +2130,8 @@
                for (q = o; q < e; q++)
                        if (!(q->flags & OPT_ignore) && !streq(q->catalog, 
o->catalog))
                                o = q;
+               /*FALLTHROUGH*/
+       case STYLE_posix:
                sfputc(mp, '\f');
                break;
        default:
@@ -2463,7 +2497,7 @@
                                sp_body = 0;
                        }
                }
-               else if (style <= STYLE_short && prefix < 2)
+               else if (style == STYLE_short && prefix < 2)
                        style = STYLE_long;
                if (*p == ':')
                        p++;
@@ -2638,7 +2672,7 @@
                                                        f = *s;
                                        }
                                        re = p;
-                                       if (style == STYLE_short)
+                                       if (style <= STYLE_short)
                                        {
                                                if (!z && !f)
                                                        z = -1;
@@ -2720,6 +2754,12 @@
                                p++;
                                continue;
                        }
+                       else if (*p == '\\' && style==STYLE_posix)
+                       {
+                               if (*++p)
+                                       p++;
+                               continue;
+                       }
                        else
                        {
                                f = *p++;
@@ -2731,7 +2771,7 @@
                        {
                                if (style == STYLE_long || prefix < 2 || 
(q->flags & OPT_long))
                                        f = 0;
-                               else if (style == STYLE_short)
+                               else if (style <= STYLE_short)
                                        w = 0;
                                if (!f && !w)
                                        z = -1;
@@ -2786,9 +2826,9 @@
                                a |= OPT_flag;
                        if (!z)
                        {
-                               if (style == STYLE_short && !y && !mutex)
+                               if (style <= STYLE_short && !y && !mutex || 
style == STYLE_posix)
                                {
-                                       if (!sfstrtell(sp))
+                                       if (style != STYLE_posix && 
!sfstrtell(sp))
                                        {
                                                sfputc(sp, '[');
                                                if (sp == sp_plus)
@@ -2801,6 +2841,8 @@
                                                for (c = 0; c < sl; c++)
                                                        if (s[c] != '|')
                                                                sfputc(sp, 
s[c]);
+                                       if (style == STYLE_posix && y)
+                                               sfputc(sp, ':');
                                }
                                else
                                {
@@ -2906,7 +2948,14 @@
                                                        sfputc(sp_body, '-');
                                                        sfputr(sp_body, 
font(FONT_BOLD, style, 1), -1);
                                                        if (!sl)
+                                                       {
                                                                sfputc(sp_body, 
f);
+                                                               if (f == '-' && 
y)
+                                                               {
+                                                                       y = 0;
+                                                                       
sfputr(sp_body, C("long-option[=value]"), -1);
+                                                               }
+                                                       }
                                                        else
                                                                
sfwrite(sp_body, s, sl);
                                                        sfputr(sp_body, 
font(FONT_BOLD, style, 0), -1);
@@ -3050,7 +3099,7 @@
                return opt_info.msg = p;
        }
        sp = sp_text;
-       if (sfstrtell(sp))
+       if (sfstrtell(sp) && style != STYLE_posix)
                sfputc(sp, ']');
        if (style == STYLE_nroff)
        {
@@ -3189,7 +3238,7 @@
                sfclose(sp_body);
                sp_body = 0;
        }
-       if (x)
+       if (x && style != STYLE_posix)
                args(sp, x, xl, flags, style, sp_info, version, catalog);
        if (sp_info)
        {
@@ -3527,10 +3576,10 @@
  * 0x.* or <base>#* for alternate bases
  */
 
-static _ast_intmax_t     
+static intmax_t     
 optnumber(const char* s, char** t, int* e)
 {
-       _ast_intmax_t   n;
+       intmax_t        n;
        int             oerrno;
 
        while (*s == '0' && isdigit(*(s + 1)))
@@ -3707,7 +3756,21 @@
        Optcache_t*     pcache;
        Optpass_t*      pass;
 
-       opt_info.state = &state; /* not initialized in some dll's! */
+#if !_YOU_FIGURED_OUT_HOW_TO_GET_ALL_DLLS_TO_DO_THIS_
+       /*
+        * these are not initialized by all dlls!
+        */
+
+       extern Error_info_t     _error_info_;
+       extern Opt_t            _opt_info_;
+
+       if (!_error_infop_)
+               _error_infop_ = &_error_info_;
+       if (!_opt_infop_)
+               _opt_infop_ = &_opt_info_;
+       if (!opt_info.state)
+               opt_info.state = &state;
+#endif
        if (!oopts)
                return 0;
        opt_info.state->pindex = opt_info.index;
@@ -3768,6 +3831,8 @@
        version = pass->version;
        if (!(xp = opt_info.state->xp) || (catalog = pass->catalog) && 
!X(catalog))
                catalog = 0;
+       else /* if (!error_info.catalog) */
+               error_info.catalog = catalog;
  again:
        psp = 0;
 
@@ -3837,12 +3902,23 @@
                                        opt_info.index++;
                                        return 0;
                                }
+                               if (version || *s == '?' || !(pass->flags & 
OPT_minus))
+                               {
+                                       /*
+                                        * long with double prefix
+                                        */
 
-                               /*
-                                * long with double prefix
-                                */
+                                       n = 2;
+                               }
+                               else
+                               {
+                                       /*
+                                        * short option char '-'
+                                        */
 
-                               n = 2;
+                                       s--;
+                                       n = 1;
+                               }
                        }
                        else if (prefix == 1 && *s != '?')
                        {
@@ -5086,7 +5162,7 @@
                if ((c == '?' || c == ':') && (opt_info.arg[0] == '-' && 
opt_info.arg[1] == '-'))
                        opt_info.arg += 2;
                s = opt_info.name;
-               if (*s++ == '-' && *s++ == '-')
+               if (*s++ == '-' && *s++ == '-' && *s)
                {
                        e = opt_info.name;
                        while (*e++ = *s++);
diff -r -N -u ksh93_2007_01_11/src/lib/libast/misc/translate.c 
ksh93_2007_03_28/src/lib/libast/misc/translate.c
--- ksh93_2007_01_11/src/lib/libast/misc/translate.c    2006-10-17 
09:32:43.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/misc/translate.c    2007-03-21 
18:56:36.000000000 +0100
@@ -288,6 +288,7 @@
 translate(const char* loc, const char* cmd, const char* cat, const char* msg)
 {
        register char*  r;
+       char*           t;
        int             p;
        int             oerrno;
        Catalog_t*      cp;
@@ -302,6 +303,8 @@
 
        if (!cmd && !cat)
                goto done;
+       if (cmd && (t = strrchr(cmd, '/')))
+               cmd = (const char*)(t + 1);
 
        /*
         * initialize the catalogs dictionary
diff -r -N -u ksh93_2007_01_11/src/lib/libast/port/astconf.c 
ksh93_2007_03_28/src/lib/libast/port/astconf.c
--- ksh93_2007_01_11/src/lib/libast/port/astconf.c      2006-11-18 
13:08:38.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/port/astconf.c      2007-02-14 
07:47:08.000000000 +0100
@@ -589,7 +589,7 @@
                {
                        register char*  s;
                        register char*  e;
-                       _ast_intmax_t   v;
+                       intmax_t        v;
 
                        /*
                         * _PC_PATH_ATTRIBUTES is a bitmap for 'a' to 'z'
@@ -864,7 +864,8 @@
        int                     i;
        int                     olderrno;
        int                     drop;
-       _ast_intmax_t           v;
+       int                     defined;
+       intmax_t                v;
        char                    buf[PATH_MAX];
        char                    flg[16];
 
@@ -938,6 +939,7 @@
                        goto bad;
        }
        s = 0;
+       defined = 1;
        switch (i = (p->op < 0 || (flags & CONF_MINMAX) && (p->flags & 
CONF_MINMAX_DEF)) ? 0 : p->call)
        {
        case CONF_confstr:
@@ -945,6 +947,7 @@
 #if _lib_confstr
                if (!(v = confstr(p->op, buf, sizeof(buf))))
                {
+                       defined = 0;
                        v = -1;
                        errno = EINVAL;
                }
@@ -953,6 +956,8 @@
                        buf[sizeof(buf) - 1] = 0;
                        s = (const char*)buf;
                }
+               else
+                       defined = 0;
                break;
 #else
                goto predef;
@@ -960,7 +965,8 @@
        case CONF_pathconf:
                call = "pathconf";
 #if _lib_pathconf
-               v = pathconf(path, p->op);
+               if ((v = pathconf(path, p->op)) < 0)
+                       defined = 0;
                break;
 #else
                goto predef;
@@ -968,7 +974,8 @@
        case CONF_sysconf:
                call = "sysconf";
 #if _lib_sysconf
-               v = sysconf(p->op);
+               if ((v = sysconf(p->op)) < 0)
+                       defined = 0;
                break;
 #else
                goto predef;
@@ -981,6 +988,8 @@
                        buf[sizeof(buf) - 1] = 0;
                        s = (const char*)buf;
                }
+               else
+                       defined = 0;
                break;
 #else
                goto predef;
@@ -989,6 +998,7 @@
                call = "synthesis";
                errno = EINVAL;
                v = -1;
+               defined = 0;
                break;
        case 0:
                call = 0;
@@ -1007,30 +1017,28 @@
                                break;
                        }
                }
-               if (!(listflags & ASTCONF_system))
+               if (flags & CONF_MINMAX)
                {
-                       if (flags & CONF_MINMAX)
-                       {
-                               if (p->flags & CONF_MINMAX_DEF)
-                               {
-                                       v = p->minmax.number;
-                                       s = p->minmax.string;
-                                       break;
-                               }
-                       }
-                       else if (p->flags & CONF_LIMIT_DEF)
+                       if ((p->flags & CONF_MINMAX_DEF) && (!(listflags & 
ASTCONF_system) || !(p->flags & CONF_DEFER_MM)))
                        {
-                               v = p->limit.number;
-                               s = p->limit.string;
+                               v = p->minmax.number;
+                               s = p->minmax.string;
                                break;
                        }
                }
+               else if ((p->flags & CONF_LIMIT_DEF) && (!(listflags & 
ASTCONF_system) || !(p->flags & CONF_DEFER_CALL)))
+               {
+                       v = p->limit.number;
+                       s = p->limit.string;
+                       break;
+               }
                flags &= ~(CONF_LIMIT_DEF|CONF_MINMAX_DEF);
                v = -1;
                errno = EINVAL;
+               defined = 0;
                break;
        }
-       if (v == -1)
+       if (!defined)
        {
                if (!errno)
                {
@@ -1109,12 +1117,14 @@
                }
                if (flags & CONF_ERROR)
                        sfprintf(sp, "error");
-               else if (v != -1)
+               else if (defined)
                {
                        if (s)
                                sfprintf(sp, "%s", (listflags & ASTCONF_quote) 
? fmtquote(s, "\"", "\"", strlen(s), FMT_SHELL) : s);
-                       else
+                       else if (v != -1)
                                sfprintf(sp, "%I*d", sizeof(v), v);
+                       else
+                               sfprintf(sp, "%I*u", sizeof(v), v);
                }
                sfprintf(sp, "\n");
        }
@@ -1137,12 +1147,14 @@
                        }
                        if (flags & CONF_ERROR)
                                sfprintf(sp, "error");
-                       else if (v != -1)
+                       else if (defined)
                        {
                                if (s)
                                        sfprintf(sp, "%s", (listflags & 
ASTCONF_quote) ? fmtquote(s, "\"", "\"", strlen(s), FMT_SHELL) : s);
-                               else
+                               else if (v != -1)
                                        sfprintf(sp, "%I*d", sizeof(v), v);
+                               else
+                                       sfprintf(sp, "%I*u", sizeof(v), v);
                        }
                        else
                                sfprintf(sp, "undefined");
@@ -1157,16 +1169,9 @@
                        if (p->section > 1)
                                sfprintf(sp, "%d", p->section);
                        sfprintf(sp, "_%s=", (listflags & ASTCONF_lower) ? 
fmtlower(p->name) : p->name);
-                       if (p->flags & CONF_MINMAX_DEF)
-                       {
-                               if (v == -1 && (v = p->minmax.number) == -1 && 
((p->flags & CONF_FEATURE) || !(p->flags & (CONF_LIMIT|CONF_MINMAX))))
-                                       flags &= ~CONF_MINMAX_DEF;
-                               else
-                                       flags |= CONF_MINMAX_DEF;
-                       }
                        if (v != -1)
                                sfprintf(sp, "%I*d", sizeof(v), v);
-                       else if (flags & CONF_MINMAX_DEF)
+                       else if (defined)
                                sfprintf(sp, "%I*u", sizeof(v), v);
                        else
                                sfprintf(sp, "undefined");
diff -r -N -u ksh93_2007_01_11/src/lib/libast/regex/regdecomp.c 
ksh93_2007_03_28/src/lib/libast/regex/regdecomp.c
--- ksh93_2007_01_11/src/lib/libast/regex/regdecomp.c   2006-09-28 
16:00:07.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/regex/regdecomp.c   2007-03-21 
15:12:52.000000000 +0100
@@ -28,11 +28,11 @@
 #include "reglib.h"
 
 #undef ismeta
-#define ismeta(c,t,e)  (state.magic[c] && state.magic[c][(t)+(e)] >= T_META)
-#define meta(f,c,t,e)  do { if (ismeta(c,t,e)) sfputc(f, '\\'); sfputc(f, c); 
} while (0)
+#define ismeta(c,t,e,d)        (state.magic[c] && state.magic[c][(t)+(e)] >= 
T_META || (c) == (d))
+#define meta(f,c,t,e,d)        do { if (ismeta(c,t,e,d)) sfputc(f, '\\'); 
sfputc(f, c); } while (0)
 
 static void
-detrie(Trie_node_t* x, Sfio_t* sp, char* b, char* p, char* e)
+detrie(Trie_node_t* x, Sfio_t* sp, char* b, char* p, char* e, int delimiter)
 {
        register Trie_node_t*   y;
        char*                   o;
@@ -55,7 +55,7 @@
                        sfputc(sp, '<');
                        sfwrite(sp, b, p - b);
                        sfputc(sp, '>');
-                       detrie(y, sp, b, p, e);
+                       detrie(y, sp, b, p, e, delimiter);
                }
                if (x->end && x->son)
                {
@@ -69,12 +69,16 @@
 }
 
 static int
-decomp(register Rex_t* e, Sfio_t* sp, int type)
+decomp(register Rex_t* e, Sfio_t* sp, int type, int delimiter, regflags_t 
flags)
 {
        Rex_t*          q;
        unsigned char*  s;
        unsigned char*  t;
        int             c;
+       int             d;
+       int             cb;
+       int             cd;
+       int             cr;
        int             ib;
        int             ie;
        int             nb;
@@ -87,10 +91,10 @@
                switch (e->type)
                {
                case REX_ALT:
-                       if (decomp(e->re.group.expr.binary.left, sp, type))
+                       if (decomp(e->re.group.expr.binary.left, sp, type, 
delimiter, flags))
                                return 1;
                        sfputc(sp, '|');
-                       if (e->re.group.expr.binary.right && 
decomp(e->re.group.expr.binary.right, sp, type))
+                       if (e->re.group.expr.binary.right && 
decomp(e->re.group.expr.binary.right, sp, type, delimiter, flags))
                                return 1;
                        break;
                case REX_BACK:
@@ -105,10 +109,10 @@
                                sfputc(sp, '$');
                        break;
                case REX_WBEG:
-                       meta(sp, '<', type, 1);
+                       meta(sp, '<', type, 1, delimiter);
                        break;
                case REX_WEND:
-                       meta(sp, '<', type, 1);
+                       meta(sp, '<', type, 1, delimiter);
                        break;
                case REX_WORD:
                        sfprintf(sp, "\\w");
@@ -140,18 +144,25 @@
                        switch (e->type)
                        {
                        case REX_REP:
-                               if (decomp(e->re.group.expr.rex, sp, type))
+                               if (decomp(e->re.group.expr.rex, sp, type, 
delimiter, flags))
                                        return 1;
                                break;
                        case REX_CLASS:
                                sfputc(sp, '[');
                                nb = ne = ib = ie = -2;
+                               cb = cd = cr = 0;
                                s = nc;
                                t = ic;
                                for (c = 0; c <= UCHAR_MAX; c++)
                                        if (settst(e->re.charclass, c))
                                        {
-                                               if (nb < 0)
+                                               if (c == ']')
+                                                       cb = 1;
+                                               else if (c == '-')
+                                                       cr = 1;
+                                               else if (c == delimiter)
+                                                       cd = 1;
+                                               else if (nb < 0)
                                                        ne = nb = c;
                                                else if (ne == (c - 1))
                                                        ne = c;
@@ -170,7 +181,13 @@
                                        }
                                        else
                                        {
-                                               if (ib < 0)
+                                               if (c == ']')
+                                                       cb = -1;
+                                               else if (c == '-')
+                                                       cr = -1;
+                                               else if (c == delimiter)
+                                                       cd = -1;
+                                               else if (ib < 0)
                                                        ie = ib = c;
                                                else if (ie == (c - 1))
                                                        ie = c;
@@ -208,20 +225,44 @@
                                if ((t - ic + 1) < (s - nc + (nc[0] == '^')))
                                {
                                        sfputc(sp, '^');
+                                       if (cb < 0)
+                                               sfputc(sp, ']');
+                                       if (cr < 0)
+                                               sfputc(sp, '-');
+                                       if (cd < 0)
+                                       {
+                                               if (flags & REG_ESCAPE)
+                                                       sfputc(sp, '\\');
+                                               sfputc(sp, delimiter);
+                                       }
                                        sfwrite(sp, ic, t - ic);
                                }
                                else
                                {
+                                       if (cb > 0)
+                                               sfputc(sp, ']');
+                                       if (cr > 0)
+                                               sfputc(sp, '-');
+                                       if (cd > 0)
+                                       {
+                                               if (flags & REG_ESCAPE)
+                                                       sfputc(sp, '\\');
+                                               sfputc(sp, delimiter);
+                                       }
                                        if (nc[0] == '^')
-                                               sfputc(sp, '\\');
-                                       sfwrite(sp, nc, s - nc);
+                                       {
+                                               sfwrite(sp, nc + 1, s - nc - 1);
+                                               sfputc(sp, '^');
+                                       }
+                                       else
+                                               sfwrite(sp, nc, s - nc);
                                }
                                sfputc(sp, ']');
                                break;
                        case REX_COLL_CLASS:
                                break;
                        case REX_ONECHAR:
-                               meta(sp, e->re.onechar, type, 1);
+                               meta(sp, e->re.onechar, type, 0, delimiter);
                                break;
                        case REX_DOT:
                                sfputc(sp, '.');
@@ -233,33 +274,34 @@
                                {
                                        if (!e->lo)
                                                sfputc(sp, '*');
-                                       else if (e->lo == 1 && ismeta('+', 
type, 0))
-                                               meta(sp, '+', type, 1);
+                                       else if (e->lo == 1 && ismeta('+', 
type, 0, delimiter))
+                                               meta(sp, '+', type, 1, 
delimiter);
                                        else
                                        {
-                                               meta(sp, '{', type, 1);
+                                               meta(sp, '{', type, 1, 
delimiter);
                                                sfprintf(sp, "%d,", e->lo);
-                                               meta(sp, '}', type, 1);
+                                               meta(sp, '}', type, 1, 
delimiter);
                                        }
                                }
-                               else if (e->hi != 1 || e->lo == 0 && 
!ismeta('?', type, 0))
+                               else if (e->hi != 1 || e->lo == 0 && 
!ismeta('?', type, 0, delimiter))
                                {
-                                       meta(sp, '{', type, 1);
+                                       meta(sp, '{', type, 1, delimiter);
                                        sfprintf(sp, "%d,%d", e->lo, e->hi);
-                                       meta(sp, '}', type, 1);
+                                       meta(sp, '}', type, 1, delimiter);
                                }
                                else if (e->lo == 0)
-                                       meta(sp, '?', type, 1);
+                                       meta(sp, '?', type, 1, delimiter);
                        }
                        else if (c)
                                sfputc(sp, c);
                        break;
                case REX_STRING:
+               case REX_KMP:
                        t = (s = e->re.string.base) + e->re.string.size;
                        while (s < t)
                        {
                                c = *s++;
-                               meta(sp, c, type, 0);
+                               meta(sp, c, type, 0, delimiter);
                        }
                        break;
                case REX_TRIE:
@@ -273,13 +315,13 @@
                                                sfputc(sp, '|');
                                        else
                                                ib = 1;
-                                       detrie(e->re.trie.root[c], sp, pfx, 
pfx, &pfx[sizeof(pfx)]);
+                                       detrie(e->re.trie.root[c], sp, pfx, 
pfx, &pfx[sizeof(pfx)], delimiter);
                                }
                        break;
                case REX_NEG:
                        if (type >= SRE)
                                sfprintf(sp, "!(");
-                       if (decomp(e->re.group.expr.rex, sp, type))
+                       if (decomp(e->re.group.expr.rex, sp, type, delimiter, 
flags))
                                return 1;
                        if (type >= SRE)
                                sfputc(sp, ')');
@@ -287,52 +329,57 @@
                                sfputc(sp, '!');
                        break;
                case REX_CONJ:
-                       if (decomp(e->re.group.expr.binary.left, sp, type))
+                       if (decomp(e->re.group.expr.binary.left, sp, type, 
delimiter, flags))
                                return 1;
                        sfputc(sp, '&');
-                       if (decomp(e->re.group.expr.binary.right, sp, type))
+                       if (decomp(e->re.group.expr.binary.right, sp, type, 
delimiter, flags))
                                return 1;
                        break;
                case REX_GROUP:
                        if (type >= SRE)
                                sfputc(sp, '@');
-                       meta(sp, '(', type, 1);
-                       if (decomp(e->re.group.expr.rex, sp, type))
+                       meta(sp, '(', type, 1, delimiter);
+                       if (decomp(e->re.group.expr.rex, sp, type, delimiter, 
flags))
                                return 1;
-                       meta(sp, ')', type, 1);
+                       meta(sp, ')', type, 1, delimiter);
                        break;
                case REX_GROUP_AHEAD:
                case REX_GROUP_AHEAD_NOT:
                case REX_GROUP_BEHIND:
                case REX_GROUP_BEHIND_NOT:
-                       meta(sp, '(', type, 1);
+                       meta(sp, '(', type, 1, delimiter);
                        sfputc(sp, '?');
-                       if (decomp(e->re.group.expr.rex, sp, type))
+                       if (decomp(e->re.group.expr.rex, sp, type, delimiter, 
flags))
                                return 1;
-                       meta(sp, ')', type, 1);
+                       meta(sp, ')', type, 1, delimiter);
                        break;
                case REX_GROUP_COND:
-                       meta(sp, '(', type, 1);
+                       meta(sp, '(', type, 1, delimiter);
                        sfputc(sp, '?');
-                       if (e->re.group.expr.binary.left && 
decomp(e->re.group.expr.binary.left, sp, type))
+                       if (e->re.group.expr.binary.left && 
decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags))
                                return 1;
                        if (q = e->re.group.expr.binary.right)
                        {
                                sfputc(sp, ':');
-                               if (q->re.group.expr.binary.left && 
decomp(q->re.group.expr.binary.left, sp, type))
+                               if (q->re.group.expr.binary.left && 
decomp(q->re.group.expr.binary.left, sp, type, delimiter, flags))
                                        return 1;
                                sfputc(sp, ':');
-                               if (q->re.group.expr.binary.right && 
decomp(q->re.group.expr.binary.right, sp, type))
+                               if (q->re.group.expr.binary.right && 
decomp(q->re.group.expr.binary.right, sp, type, delimiter, flags))
                                        return 1;
                        }
-                       meta(sp, ')', type, 1);
+                       meta(sp, ')', type, 1, delimiter);
                        break;
                case REX_GROUP_CUT:
-                       meta(sp, '(', type, 1);
+                       meta(sp, '(', type, 1, delimiter);
                        sfputc(sp, '?');
-                       if (decomp(e->re.group.expr.rex, sp, type))
+                       if (decomp(e->re.group.expr.rex, sp, type, delimiter, 
flags))
                                return 1;
-                       meta(sp, ')', type, 1);
+                       meta(sp, ')', type, 1, delimiter);
+                       break;
+               case REX_BM:
+                       break;
+               default:
+                       sfprintf(sp, "<ERROR:REX_%d>", e->type);
                        break;
                }
        } while (e = e->next);
@@ -349,6 +396,7 @@
        Sfio_t*         sp;
        char*           s;
        int             type;
+       int             delimiter;
        size_t          r;
 
        if (!(sp = sfstropen()))
@@ -374,14 +422,26 @@
                type = KRE;
                break;
        }
-       if (decomp(p->env->rex, sp, type))
+       if (flags & REG_DELIMITED)
+       {
+               delimiter = '/';
+               sfputc(sp, delimiter);
+       }
+       else
+               delimiter = 0;
+       if (decomp(p->env->rex, sp, type, delimiter, flags))
                r = 0;
-       else if ((r = sfstrtell(sp) + 1) <= n)
+       else
        {
-               if (!(s = sfstruse(sp)))
-                       r = 0;
-               else
-                       memcpy(buf, s, r);
+               if (delimiter)
+                       sfputc(sp, delimiter);
+               if ((r = sfstrtell(sp) + 1) <= n)
+               {
+                       if (!(s = sfstruse(sp)))
+                               r = 0;
+                       else
+                               memcpy(buf, s, r);
+               }
        }
        sfstrclose(sp);
        return r;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/regex/reglib.h 
ksh93_2007_03_28/src/lib/libast/regex/reglib.h
--- ksh93_2007_01_11/src/lib/libast/regex/reglib.h      2005-05-27 
06:44:05.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/regex/reglib.h      2007-03-21 
15:01:33.000000000 +0100
@@ -72,7 +72,7 @@
 #define RE_DUP_INF     (RE_DUP_MAX+1)  /* infinity, for *              */
 #define BACK_REF_MAX   9
 
-#define REG_COMP       
(REG_DELIMITED|REG_EXTENDED|REG_FIRST|REG_ICASE|REG_NOSUB|REG_NEWLINE|REG_SHELL|REG_AUGMENTED|REG_LEFT|REG_LITERAL|REG_MINIMAL|REG_NULL|REG_RIGHT|REG_LENIENT|REG_MUSTDELIM)
+#define REG_COMP       
(REG_DELIMITED|REG_ESCAPE|REG_EXTENDED|REG_FIRST|REG_ICASE|REG_NOSUB|REG_NEWLINE|REG_SHELL|REG_AUGMENTED|REG_LEFT|REG_LITERAL|REG_MINIMAL|REG_NULL|REG_RIGHT|REG_LENIENT|REG_MUSTDELIM)
 #define REG_EXEC       
(REG_ADVANCE|REG_INVERT|REG_NOTBOL|REG_NOTEOL|REG_STARTEND)
 
 #define REX_NULL               0       /* null string (internal)       */
diff -r -N -u ksh93_2007_01_11/src/lib/libast/regex/regnexec.c 
ksh93_2007_03_28/src/lib/libast/regex/regnexec.c
--- ksh93_2007_01_11/src/lib/libast/regex/regnexec.c    2005-05-28 
17:00:57.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/regex/regnexec.c    2007-03-11 
12:41:38.000000000 +0100
@@ -811,6 +811,7 @@
        unsigned char*  t;
        unsigned char*  b;
        unsigned char*  e;
+       char*           u;
        regmatch_t*     o;
        Trie_node_t*    x;
        Rex_t*          q;
@@ -1734,8 +1735,9 @@
                                return NONE;
                        return parsetrie(env, x, rex, cont, s);
                case REX_EXEC:
-                       e = 0;
-                       r = (*env->disc->re_execf)(env->regex, 
rex->re.exec.data, rex->re.exec.text, rex->re.exec.size, (const char*)s, 
env->end - s, (char**)&e, env->disc);
+                       u = 0;
+                       r = (*env->disc->re_execf)(env->regex, 
rex->re.exec.data, rex->re.exec.text, rex->re.exec.size, (const char*)s, 
env->end - s, &u, env->disc);
+                       e = (unsigned char*)u;
                        if (e >= s && e <= env->end)
                                s = e;
                        switch (r)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/regex/ucs_names.h 
ksh93_2007_03_28/src/lib/libast/regex/ucs_names.h
--- ksh93_2007_01_11/src/lib/libast/regex/ucs_names.h   2003-05-18 
11:57:23.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/regex/ucs_names.h   2007-02-14 
07:47:28.000000000 +0100
@@ -31,8 +31,8 @@
 #define UCS_UC         1
 #define UCS_LC         2
 
-typedef unsigned _ast_int2_t Ucs_code_t;
-typedef unsigned _ast_int4_t Ucs_attr_t;
+typedef uint16_t Ucs_code_t;
+typedef uint32_t Ucs_attr_t;
 
 typedef struct Ucs_dat_s
 {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/RELEASE 
ksh93_2007_03_28/src/lib/libast/RELEASE
--- ksh93_2007_01_11/src/lib/libast/RELEASE     2007-01-11 18:13:07.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/RELEASE     2007-03-28 08:15:10.000000000 
+0200
@@ -1,3 +1,27 @@
+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 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
+07-02-27 comp/conf.sh: handle native getconf invalid numeric values
+07-02-21 comp/conf.sh,comp/conf.tab: handle SSIZE_MAX vs _POSIX_SSIZE_MAX
+07-02-20 sfio/sfvprintf.c: handle SF_WCWIDTH justification
+07-02-14 features/common: cover <stdint.h>, move to int_(bits)_t
+07-02-14 include/int.h: drop
+07-02-14 include/sfio.h: add SF_WCWIDTH
+07-02-12 comp/conf.sh: fix CONF_LIMIT bug that missed ULONG_MAX etc.
+07-02-12 comp/conf.tab: *LONGLONG* => *LLONG* to match posix
+07-02-12 features/float: *LONGLONG* => *LLONG* to match posix
+07-02-12 port/astconf.c: handle CONF_LIMITS_DEF with no deferral
+07-02-12 stdio/vasprintf.c: add trailing '\0' -- doh
+07-02-04 string/fmtelapsed.c: fix naive multi month/year logic
+07-02-02 misc/optget.c: add --??posix for getopts(1)/getopt(3)
+07-01-26 string/chresc.c: use mbchar()
+07-01-26 misc/optget.c: handle "o:-:" usage for old-style long options
+07-01-22 sfio/sfdisc.c,sfpool.c: handle push on streams with pending peek
+07-01-22 include/sfio.h: mv Sfieee_t to sfio/sfhdr.h
+07-01-17 tm/tmxfmt.c: fix terminating nil logic which clobbered size-1
 07-01-11 misc/stk.c: a 2 day marathon bug fix (can we release now dr ek?)
 07-01-05 comp/spawnveg.c: posix_spawnattr_setflags(POSIX_SPAWN_SETPGROUP)
 07-01-05 misc/error.c: fix multibyte vs. printable logic
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/sfdisc.c 
ksh93_2007_03_28/src/lib/libast/sfio/sfdisc.c
--- ksh93_2007_01_11/src/lib/libast/sfio/sfdisc.c       2004-10-29 
21:53:16.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/sfio/sfdisc.c       2007-01-26 
03:14:48.000000000 +0100
@@ -21,11 +21,88 @@
 ***********************************************************************/
 #include       "sfhdr.h"
 
-/*     Set a new discipline for a stream.
+/*     Add a new discipline to the discipline stack. Each discipline
+**     provides alternative I/O functions that are analogues of the
+**     system calls.
+**
+**     When the application fills or flushes the stream buffer, data
+**     will be processed through discipline functions. A case deserving
+**     consideration is stacking a discipline onto a read stream. Each
+**     discipline operation implies buffer synchronization so the stream
+**     buffer should be empty. However, a read stream representing an
+**     unseekable device (eg, a pipe) may not be synchronizable. In that
+**     case, any buffered data must then be fed to the new discipline
+**     to preserve data processing semantics. This is done by creating
+**     a temporary discipline to cache such buffered data and feed
+**     them to the new discipline when its readf() asks for new data.
+**     Care must then be taken to remove this temporary discipline
+**     when it runs out of cached data.
 **
 **     Written by Kiem-Phong Vo
 */
 
+typedef struct _dccache_s
+{      Sfdisc_t        disc;
+       uchar*          data;
+       uchar*          endb;
+} Dccache_t;
+
+#if __STD_C
+static int _dccaexcept(Sfio_t* f, int type, Void_t* val, Sfdisc_t* disc)
+#else
+static int _dccaexcept(f,type,val,disc)
+Sfio_t*                f;
+int            type;
+Void_t*                val;
+Sfdisc_t*      disc;
+#endif
+{
+       if(disc && type == SF_FINAL)
+               free(disc);
+       return 0;
+}
+
+#if __STD_C
+static ssize_t _dccaread(Sfio_t* f, Void_t* buf, size_t size, Sfdisc_t* disc)
+#else
+static ssize_t _dccaread(f, buf, size, disc)
+Sfio_t*                f;
+Void_t*                buf;
+size_t         size;
+Sfdisc_t*      disc;
+#endif
+{
+       ssize_t         sz;
+       Sfdisc_t        *prev;
+       Dccache_t       *dcca;
+
+       if(!f) /* bad stream */
+               return -1;
+
+       /* make sure that this is on the discipline stack */
+       for(prev = f->disc; prev; prev = prev->disc)
+               if(prev->disc == disc)
+                       break;
+       if(!prev)
+               return -1;
+
+       if(size <= 0) /* nothing to do */
+               return size;
+
+       /* read from available data */
+       dcca = (Dccache_t*)disc;
+       if((sz = dcca->endb - dcca->data) > (ssize_t)size)
+               sz = (ssize_t)size;
+       memcpy(buf, dcca->data, sz);
+
+       if((dcca->data += sz) >= dcca->endb) /* free empty cache */
+       {       prev->disc = disc->disc;
+               free(disc);
+       }
+
+       return sz;
+}
+
 #if __STD_C
 Sfdisc_t* sfdisc(reg Sfio_t* f, reg Sfdisc_t* disc)
 #else
@@ -39,6 +116,7 @@
        reg Sfwrite_f   owritef;
        reg Sfseek_f    oseekf;
        ssize_t         n;
+       reg Dccache_t   *dcca = NIL(Dccache_t*);
 
        SFMTXSTART(f, NIL(Sfdisc_t*));
 
@@ -53,34 +131,50 @@
        SFLOCK(f,0);
        rdisc = NIL(Sfdisc_t*);
 
+       /* disallow popping while there is cached data */
+       if(!disc && f->disc && f->disc->disc && f->disc->disc->readf == 
_dccaread )
+               goto done;
+
        /* synchronize before switching to a new discipline */
        if(!(f->flags&SF_STRING))
-       {       if(((f->mode&SF_WRITE) && f->next > f->data) ||
-                  (f->mode&SF_READ) || f->disc == _Sfudisc )
-               {       (void)SFSYNC(f);
-                       f->mode &= ~SF_SYNCED;
+       {       (void)SFSYNC(f); /* do a silent buffer synch */
+               if((f->mode&SF_READ) && (f->mode&SF_SYNCED) )
+               {       f->mode &= ~SF_SYNCED;
                        f->endb = f->next = f->endr = f->endw = f->data;
                }
 
+               /* if there is buffered data, ask app before proceeding */
                if(((f->mode&SF_WRITE) && (n = f->next-f->data) > 0) ||
-                  ((f->mode&SF_READ) && f->extent < 0 && (n = f->endb-f->next) 
> 0) )
-               {
-                       reg Sfexcept_f  exceptf;
-                       reg int         rv = 0;
-
-                       exceptf = disc ? disc->exceptf :
-                                 f->disc ? f->disc->exceptf : NIL(Sfexcept_f);
-
-                       /* check with application for course of action */
-                       if(exceptf)
+                  ((f->mode&SF_READ) && (n = f->endb-f->next) > 0) )
+               {       int     rv = 0;
+                       if(rv == 0 && f->disc && f->disc->exceptf) /* ask 
current discipline */
+                       {       SFOPEN(f,0);
+                               rv = (*f->disc->exceptf)(f, SF_DBUFFER, &n, 
f->disc);
+                               SFLOCK(f,0);
+                       }
+                       if(rv == 0 && disc && disc->exceptf) /* ask discipline 
being pushed */
                        {       SFOPEN(f,0);
-                               rv = (*exceptf)(f,SF_DBUFFER,&n, disc ? disc : 
f->disc);
+                               rv = (*disc->exceptf)(f, SF_DBUFFER, &n, disc);
                                SFLOCK(f,0);
                        }
+                       if(rv < 0)
+                               goto done;
+               }
 
-                       /* can't switch discipline at this time */
-                       if(rv <= 0)
+               /* trick the new discipline into processing already buffered 
data */
+               if((f->mode&SF_READ) && n > 0 && disc && disc->readf )
+               {       if(!(dcca = (Dccache_t*)malloc(sizeof(Dccache_t)+n)) )
                                goto done;
+                       memclear(dcca, sizeof(Dccache_t));
+
+                       dcca->disc.readf = _dccaread;
+                       dcca->disc.exceptf = _dccaexcept;
+
+                       /* move buffered data into the temp discipline */
+                       dcca->data = ((uchar*)dcca) + sizeof(Dccache_t);
+                       dcca->endb = dcca->data + n;
+                       memcpy(dcca->data, f->next, n);
+                       f->endb = f->next = f->endr = f->endw = f->data;
                }
        }
 
@@ -126,7 +220,11 @@
                                goto done;
 
                /* set new disc */
-               disc->disc = f->disc;
+               if(dcca) /* insert the discipline with cached data */
+               {       dcca->disc.disc = f->disc;
+                       disc->disc = &dcca->disc;
+               }
+               else    disc->disc = f->disc;
                f->disc = disc;
                rdisc = disc;
        }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/sfhdr.h 
ksh93_2007_03_28/src/lib/libast/sfio/sfhdr.h
--- ksh93_2007_01_11/src/lib/libast/sfio/sfhdr.h        2006-06-01 
08:10:58.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/sfio/sfhdr.h        2007-01-22 
06:22:15.000000000 +0100
@@ -1001,6 +1001,15 @@
 #define _Sffpow10      (_Sftable.sf_flt_pow10)
 #define _Sfdpow10      (_Sftable.sf_dbl_pow10)
 #define _Sflpow10      (_Sftable.sf_ldbl_pow10)
+typedef struct _sfieee_s       Sfieee_t;
+struct _sfieee_s
+{      float           fltnan;         /* float NAN                    */
+       float           fltinf;         /* float INF                    */
+       double          dblnan;         /* double NAN                   */
+       double          dblinf;         /* double INF                   */
+       Sfdouble_t      ldblnan;        /* Sfdouble_t NAN               */
+       Sfdouble_t      ldblinf;        /* Sfdouble_t INF               */
+};
 typedef struct _sftab_
 {      Sfdouble_t      sf_pos10[SF_MAXEXP10];  /* positive powers of 10        
*/
        Sfdouble_t      sf_neg10[SF_MAXEXP10];  /* negative powers of 10        
*/
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/sfieee.c 
ksh93_2007_03_28/src/lib/libast/sfio/sfieee.c
--- ksh93_2007_01_11/src/lib/libast/sfio/sfieee.c       2005-02-08 
22:46:31.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/sfio/sfieee.c       1970-01-01 
01:00:00.000000000 +0100
@@ -1,34 +0,0 @@
-/***********************************************************************
-*                                                                      *
-*               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>                    *
-*                                                                      *
-***********************************************************************/
-#include       "sfhdr.h"
-
-/* return IEEE constants struct */
-
-#if __STD_C
-Sfieee_t* sfieee(void)
-#else
-Sfieee_t* sfieee()
-#endif
-{
-       SFCVINIT();     /* initialize conversion tables */
-       return _Sfieee;
-}
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/_sfopen.c 
ksh93_2007_03_28/src/lib/libast/sfio/_sfopen.c
--- ksh93_2007_01_11/src/lib/libast/sfio/_sfopen.c      2005-01-20 
02:17:32.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/sfio/_sfopen.c      2007-02-21 
17:27:55.000000000 +0100
@@ -191,6 +191,10 @@
                sflags &= ~SF_MTSAFE;
                uflag = 1;
                continue;
+       case 'W' :
+               sflags |= SF_WCWIDTH;
+               uflag = 0;
+               continue;
        default :
                if(!(oflags&O_CREAT) )
                        oflags &= ~O_EXCL;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/sfpool.c 
ksh93_2007_03_28/src/lib/libast/sfio/sfpool.c
--- ksh93_2007_01_11/src/lib/libast/sfio/sfpool.c       2006-08-07 
19:07:18.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/sfio/sfpool.c       2007-01-22 
22:34:56.000000000 +0100
@@ -127,7 +127,6 @@
        else    /* shared pool of write-streams, data can be moved among 
streams */
        {       if(SFMODE(head,1) != SF_WRITE && _sfmode(head,SF_WRITE,1) < 0)
                        goto done;
-               /**/ASSERT((f->mode&(SF_WRITE|SF_POOL)) == (SF_WRITE|SF_POOL) );
                /**/ASSERT(f->next == f->data);
 
                v = head->next - head->data;    /* pending data         */
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/sfsetbuf.c 
ksh93_2007_03_28/src/lib/libast/sfio/sfsetbuf.c
--- ksh93_2007_01_11/src/lib/libast/sfio/sfsetbuf.c     2005-07-21 
02:59:13.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/sfio/sfsetbuf.c     2007-02-21 
17:28:31.000000000 +0100
@@ -60,12 +60,13 @@
 {      char*                   astsfio;
        char*                   endw;
 
-       static int              linemode = -1;
+       static int              modes = -1;
        static const char       sf_line[] = "SF_LINE";
+       static const char       sf_wcwidth[] = "SF_WCWIDTH";
 
 #define ISSEPAR(c)     ((c) == ',' || (c) == ' ' || (c) == '\t')
-       if (linemode < 0)
-       {       linemode = 0;
+       if (modes < 0)
+       {       modes = 0;
                if(astsfio = getenv("_AST_SFIO_OPTIONS"))
                {       for(; *astsfio != 0; astsfio = endw)
                        {       while(ISSEPAR(*astsfio) )
@@ -74,13 +75,18 @@
                                        ;
                                if((endw-astsfio) == (sizeof(sf_line)-1) &&
                                   strncmp(astsfio,sf_line,endw-astsfio) == 0)
-                               {       linemode = 1;
-                                       break;
+                               {       if ((modes |= SF_LINE) == 
(SF_LINE|SF_WCWIDTH))
+                                               break;
+                               }
+                               else if((endw-astsfio) == 
(sizeof(sf_wcwidth)-1) &&
+                                  strncmp(astsfio,sf_wcwidth,endw-astsfio) == 
0)
+                               {       if ((modes |= SF_WCWIDTH) == 
(SF_LINE|SF_WCWIDTH))
+                                               break;
                                }
                        }
                }
        }
-       return linemode;
+       return modes;
 }
 
 #if __STD_C
@@ -235,8 +241,8 @@
 #endif
                }
 
-               if(init && setlinemode())
-                       f->flags |= SF_LINE;
+               if(init)
+                       f->flags |= setlinemode();
 
                if(f->here >= 0)
                {       f->extent = (Sfoff_t)st.st_size;
@@ -258,8 +264,8 @@
                                        bufsize = SF_GRAIN;
 
                                        /* set line mode for terminals */
-                                       if(!(f->flags&SF_LINE) && 
isatty(f->file))
-                                               f->flags |= SF_LINE;
+                                       if(!(f->flags&(SF_LINE|SF_WCWIDTH)) && 
isatty(f->file))
+                                               f->flags |= SF_LINE|SF_WCWIDTH;
 #if _sys_stat
                                        else    /* special case /dev/null */
                                        {       reg int dev, ino;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/sfio/sfvprintf.c 
ksh93_2007_03_28/src/lib/libast/sfio/sfvprintf.c
--- ksh93_2007_01_11/src/lib/libast/sfio/sfvprintf.c    2006-12-04 
15:22:55.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/sfio/sfvprintf.c    2007-02-21 
20:27:39.000000000 +0100
@@ -30,7 +30,6 @@
 **
 **     Written by Kiem-Phong Vo.
 */
-
 #define HIGHBITI       (~((~((uint)0)) >> 1))
 #define HIGHBITL       (~((~((Sfulong_t)0)) >> 1))
 
@@ -102,7 +101,7 @@
 va_list        args;           /* arg list if !argf    */
 #endif
 {
-       int             n, v, k, n_s, base, fmt, flags;
+       int             n, v, w, k, n_s, base, fmt, flags;
        Sflong_t        lv;
        char            *sp, *ssp, *endsp, *ep, *endep;
        int             dot, width, precis, sign, decpt;
@@ -132,18 +131,22 @@
        wchar_t*        wsp;
        SFMBDCL(fmbs)                   /* state of format string       */
        SFMBDCL(mbs)                    /* state of some string         */
+#ifdef mbwidth
+       char*           osp;
+       int             n_w, sf_wcwidth;
+#endif
 #endif
 
        /* local io system */
-       int             w, n_output;
-#define SMputc(f,c)    { if((w = SFFLSBUF(f,c)) >= 0 ) n_output += 1; \
+       int             o, n_output;
+#define SMputc(f,c)    { if((o = SFFLSBUF(f,c)) >= 0 ) n_output += 1; \
                          else          { SFBUF(f); goto done; } \
                        }
-#define SMnputc(f,c,n) { if((w = SFNPUTC(f,c,n)) > 0 ) n_output += 1; \
-                         if(w != n)    { SFBUF(f); goto done; } \
+#define SMnputc(f,c,n) { if((o = SFNPUTC(f,c,n)) > 0 ) n_output += 1; \
+                         if(o != n)    { SFBUF(f); goto done; } \
                        }
-#define SMwrite(f,s,n) { if((w = SFWRITE(f,(Void_t*)s,n)) > 0 ) n_output += w; 
\
-                         if(w != n)    { SFBUF(f); goto done; } \
+#define SMwrite(f,s,n) { if((o = SFWRITE(f,(Void_t*)s,n)) > 0 ) n_output += o; 
\
+                         if(o != n)    { SFBUF(f); goto done; } \
                        }
 #if _sffmt_small /* these macros are made smaller at some performance cost */
 #define SFBUF(f)
@@ -186,6 +189,9 @@
                f->endb = f->data+sizeof(data);
        }
        SFINIT(f);
+#if _has_multibyte && defined(mbwidth)
+       sf_wcwidth = f->flags & SF_WCWIDTH;
+#endif
 
        tls[1] = NIL(char*);
 
@@ -294,10 +300,10 @@
                        }
 
                case '-' :
-                       flags = (flags & ~SFFMT_ZERO) | SFFMT_LEFT;
+                       flags = (flags & ~(SFFMT_CENTER|SFFMT_ZERO)) | 
SFFMT_LEFT;
                        goto loop_flags;
                case '0' :
-                       if(!(flags&SFFMT_LEFT) )
+                       if(!(flags&(SFFMT_LEFT|SFFMT_CENTER)) )
                                flags |= SFFMT_ZERO;
                        goto loop_flags;
                case ' ' :
@@ -307,6 +313,9 @@
                case '+' :
                        flags = (flags & ~SFFMT_BLANK) | SFFMT_SIGN;
                        goto loop_flags;
+               case '=' :
+                       flags = (flags & ~(SFFMT_LEFT|SFFMT_ZERO)) | 
SFFMT_CENTER;
+                       goto loop_flags;
                case '#' :
                        flags |= SFFMT_ALTER;
                        goto loop_flags;
@@ -391,7 +400,7 @@
                        if(dot == 0)
                        {       if((width = v) < 0)
                                {       width = -width;
-                                       flags = (flags & ~SFFMT_ZERO) | 
SFFMT_LEFT;
+                                       flags = (flags & 
~(SFFMT_CENTER|SFFMT_ZERO)) | SFFMT_LEFT;
                                }
                        }
                        else if(dot == 1)
@@ -674,10 +683,13 @@
                                ls = tls; tls[0] = sp;
                        }
                        for(sp = *ls;;)
-                       {       /* set v to the number of bytes to output */
+                       {       /* v: number of bytes  w: print width of those 
v bytes */
 #if _has_multibyte
                                if(flags & SFFMT_LONG)
                                {       v = 0;
+#ifdef mbwidth
+                                       w = 0;
+#endif
                                        SFMBCLR(&mbs);
                                        for(n = 0, wsp = (wchar_t*)sp;; ++wsp, 
++n)
                                        {       if((size >= 0 && n >= size) ||
@@ -685,28 +697,70 @@
                                                        break;
                                                if((n_s = wcrtomb(buf, *wsp, 
&mbs)) <= 0)
                                                        break;
+#ifdef mbwidth
+                                               if(sf_wcwidth )
+                                               {       n_w = mbwidth(*wsp);
+                                                       if(precis >= 0 && 
(w+n_w) > precis )
+                                                               break;
+                                                       w += n_w;
+                                               }
+                                               else
+#endif
                                                if(precis >= 0 && (v+n_s) > 
precis )
                                                        break;
                                                v += n_s;
                                        }
+#ifdef mbwidth
+                                       if(!sf_wcwidth )
+                                               w = v;
+#endif
+                               }
+#if defined(mbwide) && defined(mbchar) && defined(mbwidth)
+                               else if (mbwide())
+                               {       w = 0;
+                                       SFMBCLR(&mbs);
+                                       ssp = sp;
+                                       for(;;)
+                                       {       if((size >= 0 && w >= size) ||
+                                                  (size <  0 && *ssp == 0) )
+                                                       break;
+                                               osp = ssp;
+                                               n = mbchar(osp);
+                                               n_w = sf_wcwidth ? mbwidth(n) : 
1;
+                                               if(precis >= 0 && (w+n_w) > 
precis )
+                                                       break;
+                                               w += n_w;
+                                               ssp = osp;
+                                       }
+                                       v = ssp - sp;
                                }
+#endif
                                else
 #endif
                                {       if((v = size) < 0)
                                                for(v = 0; sp[v]; ++v)
                                                        if(v == precis)
                                                                break;
+                                       if(precis >= 0 && v > precis)
+                                               v = precis;
+                                       w = v;
                                }
 
-                               if(precis >= 0 && v > precis)
-                                       v = precis;
-
-                               if((n = width - v) > 0 && !(flags&SFFMT_LEFT) )
-                                       { SFnputc(f, ' ', n); n = 0; }
+                               if((n = width - w) > 0 && !(flags&SFFMT_LEFT) )
+                               {       if(flags&SFFMT_CENTER)
+                                       {       n -= (k = n/2);
+                                               SFnputc(f, ' ', k);
+                                       }
+                                       else
+                                       {
+                                               SFnputc(f, ' ', n);
+                                               n = 0;
+                                       }
+                               }
 #if _has_multibyte
                                if(flags & SFFMT_LONG)
                                {       SFMBCLR(&mbs);
-                                       for(wsp = (wchar_t*)sp; v > 0; ++wsp, v 
-= n_s)
+                                       for(wsp = (wchar_t*)sp; w > 0; ++wsp, 
--w)
                                        {       if((n_s = wcrtomb(buf, *wsp, 
&mbs)) <= 0)
                                                        break;
                                                sp = buf; SFwrite(f, sp, n_s);
@@ -763,6 +817,10 @@
                                {       SFMBCLR(&mbs);
                                        if((n_s = wcrtomb(buf, *wsp++, &mbs)) 
<= 0)
                                                break;
+#ifdef mbwidth
+                                       if(sf_wcwidth)
+                                               n_s = mbwidth(*(wsp - 1));
+#endif
                                        n = width - precis*n_s; /* padding 
amount */
                                }
                                else
@@ -777,7 +835,15 @@
                                }
 
                                if(n > 0 && !(flags&SFFMT_LEFT) )
-                                       { SFnputc(f,' ',n); n = 0; };
+                               {       if(flags&SFFMT_CENTER)
+                                       {       n -= (k = n/2);
+                                               SFnputc(f, ' ', k);
+                                       }
+                                       else
+                                       {       SFnputc(f, ' ', n);
+                                               n = 0;
+                                       }
+                               }
 
                                v = precis; /* need this because SFnputc may 
clear it */
 #if _has_multibyte
@@ -1249,7 +1315,7 @@
 
                        /* SFFMT_LEFT: right padding */
                        if((n = -v) > 0)
-                               SFnputc(f,' ',n);
+                               { SFnputc(f,' ',n); }
                }
        }
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/fgetpos.c 
ksh93_2007_03_28/src/lib/libast/stdio/fgetpos.c
--- ksh93_2007_01_11/src/lib/libast/stdio/fgetpos.c     2004-11-03 
16:42:36.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/stdio/fgetpos.c     2007-02-14 
07:48:15.000000000 +0100
@@ -35,7 +35,7 @@
        return (pos->_sf_offset = sfseek(f, (Sfoff_t)0, SEEK_CUR)) >= 0 ? 0 : 
-1;
 }
 
-#ifdef _ast_int8_t
+#ifdef _typ_int64_t
 
 int
 fgetpos64(Sfio_t* f, fpos64_t* pos)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/fseek.c 
ksh93_2007_03_28/src/lib/libast/stdio/fseek.c
--- ksh93_2007_01_11/src/lib/libast/stdio/fseek.c       2004-11-03 
16:42:36.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/stdio/fseek.c       2007-02-14 
07:48:33.000000000 +0100
@@ -35,12 +35,12 @@
        return sfseek(f, (Sfoff_t)off, op|SF_SHARE) >= 0 ? 0 : -1;
 }
 
-#ifdef _ast_int8_t
+#ifdef _typ_int64_t
 
 int
-fseek64(Sfio_t* f, _ast_int8_t off, int op)
+fseek64(Sfio_t* f, int64_t off, int op)
 {
-       STDIO_INT(f, "fseek64", int, (Sfio_t*, _ast_int8_t, int), (f, off, op))
+       STDIO_INT(f, "fseek64", int, (Sfio_t*, int64_t, int), (f, off, op))
 
        return sfseek(f, (Sfoff_t)off, op|SF_SHARE) >= 0 ? 0 : -1;
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/fseeko.c 
ksh93_2007_03_28/src/lib/libast/stdio/fseeko.c
--- ksh93_2007_01_11/src/lib/libast/stdio/fseeko.c      2004-11-03 
16:42:36.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/stdio/fseeko.c      2007-02-14 
07:48:52.000000000 +0100
@@ -35,12 +35,12 @@
        return sfseek(f, (Sfoff_t)off, op|SF_SHARE) >= 0 ? 0 : -1;
 }
 
-#ifdef _ast_int8_t
+#ifdef _typ_int64_t
 
 int
-fseeko64(Sfio_t* f, _ast_int8_t off, int op)
+fseeko64(Sfio_t* f, int64_t off, int op)
 {
-       STDIO_INT(f, "fseeko64", int, (Sfio_t*, _ast_int8_t, int), (f, off, op))
+       STDIO_INT(f, "fseeko64", int, (Sfio_t*, int64_t, int), (f, off, op))
 
        return sfseek(f, (Sfoff_t)off, op|SF_SHARE) >= 0 ? 0 : -1;
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/fsetpos.c 
ksh93_2007_03_28/src/lib/libast/stdio/fsetpos.c
--- ksh93_2007_01_11/src/lib/libast/stdio/fsetpos.c     2004-11-03 
16:42:36.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/stdio/fsetpos.c     2007-02-14 
07:49:06.000000000 +0100
@@ -35,7 +35,7 @@
        return sfseek(f, (Sfoff_t)pos->_sf_offset, SF_PUBLIC) == 
(Sfoff_t)pos->_sf_offset ? 0 : -1;
 }
 
-#ifdef _ast_int8_t
+#ifdef _typ_int64_t
 
 int
 fsetpos64(Sfio_t* f, const fpos64_t* pos)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/ftell.c 
ksh93_2007_03_28/src/lib/libast/stdio/ftell.c
--- ksh93_2007_01_11/src/lib/libast/stdio/ftell.c       2004-11-03 
16:42:36.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/stdio/ftell.c       2007-02-14 
08:36:36.000000000 +0100
@@ -35,14 +35,14 @@
        return (long)sfseek(f, (Sfoff_t)0, SEEK_CUR);
 }
 
-#ifdef _ast_int8_t
+#if _typ_int64_t
 
-_ast_int8_t
+int64_t
 ftell64(Sfio_t* f)
 {
-       STDIO_INT(f, "ftell64", _ast_int8_t, (Sfio_t*), (f))
+       STDIO_INT(f, "ftell64", int64_t, (Sfio_t*), (f))
 
-       return (_ast_int8_t)sfseek(f, (Sfoff_t)0, SEEK_CUR);
+       return (int64_t)sfseek(f, (Sfoff_t)0, SEEK_CUR);
 }
 
 #endif
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/ftello.c 
ksh93_2007_03_28/src/lib/libast/stdio/ftello.c
--- ksh93_2007_01_11/src/lib/libast/stdio/ftello.c      2004-11-03 
16:42:36.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/stdio/ftello.c      2007-02-14 
07:49:36.000000000 +0100
@@ -35,12 +35,12 @@
        return sfseek(f, (Sfoff_t)0, SEEK_CUR);
 }
 
-#ifdef _ast_int8_t
+#ifdef _typ_int64_t
 
-_ast_int8_t
+int64_t
 ftello64(Sfio_t* f)
 {
-       STDIO_INT(f, "ftello64", _ast_int8_t, (Sfio_t*), (f))
+       STDIO_INT(f, "ftello64", int64_t, (Sfio_t*), (f))
 
        return sfseek(f, (Sfoff_t)0, SEEK_CUR) >= 0 ? 0 : -1;
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/stdio/vasprintf.c 
ksh93_2007_03_28/src/lib/libast/stdio/vasprintf.c
--- ksh93_2007_01_11/src/lib/libast/stdio/vasprintf.c   2004-10-27 
21:43:56.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/stdio/vasprintf.c   2007-02-12 
18:51:35.000000000 +0100
@@ -32,7 +32,7 @@
        if (f = sfstropen())
        {
                v = sfvprintf(f, fmt, args);
-               if (!(*s = strdup(sfstrbase(f))))
+               if (!(*s = strdup(sfstruse(f))))
                        v = -1;
                sfstrclose(f);
        }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/chresc.c 
ksh93_2007_03_28/src/lib/libast/string/chresc.c
--- ksh93_2007_01_11/src/lib/libast/string/chresc.c     2006-07-17 
21:46:05.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/chresc.c     2007-01-26 
21:29:32.000000000 +0100
@@ -48,7 +48,7 @@
        char                    buf[64];
 #endif
 
-       switch (c = *s++)
+       switch (c = mbchar(s))
        {
        case 0:
                s--;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/fmtbase.c 
ksh93_2007_03_28/src/lib/libast/string/fmtbase.c
--- ksh93_2007_01_11/src/lib/libast/string/fmtbase.c    2002-08-13 
23:35:18.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/fmtbase.c    2007-02-14 
07:49:46.000000000 +0100
@@ -34,7 +34,7 @@
 #undef fmtbasell
 
 char*
-fmtbasell(register _ast_intmax_t n, register int b, int p)
+fmtbasell(register intmax_t n, register int b, int p)
 {
        char*   buf;
        int     z;
@@ -52,5 +52,5 @@
 char*
 fmtbase(long n, int b, int p)
 {
-       return fmtbasell((_ast_intmax_t)n, b, p);
+       return fmtbasell((intmax_t)n, b, p);
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/fmtelapsed.c 
ksh93_2007_03_28/src/lib/libast/string/fmtelapsed.c
--- ksh93_2007_01_11/src/lib/libast/string/fmtelapsed.c 2000-10-12 
14:58:39.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/fmtelapsed.c 2007-02-05 
10:14:37.000000000 +0100
@@ -21,40 +21,41 @@
 ***********************************************************************/
 #pragma prototyped
 /*
- * return pointer to formatted elapsed time for t 1/n secs
+ * return pointer to formatted elapsed time for u 1/n secs
  * compatible with strelapsed()
- * return value length is at most 6
+ * return value length is at most 7
  */
 
 #include <ast.h>
 
 char*
-fmtelapsed(register unsigned long t, register int n)
+fmtelapsed(register unsigned long u, register int n)
 {
-       register unsigned long  s;
+       register unsigned long  t;
        char*                   buf;
        int                     z;
 
-       static int              amt[] = { 1, 60, 60, 24, 7, 4, 12, 20 };
-       static char             chr[] = "smhdwMYS";
-
-       if (t == 0L)
+       if (u == 0L)
                return "0";
-       if (t == ~0L)
+       if (u == ~0L)
                return "%";
-       buf = fmtbuf(z = 7);
-       s = t / n;
-       if (s < 60)
-               sfsprintf(buf, z, "%d.%02ds", s % 100, (t * 100 / n) % 100);
+       buf = fmtbuf(z = 8);
+       t = u / n;
+       if (t < 60)
+               sfsprintf(buf, z, "%lu.%02lus", t, (u * 100 / n) % 100);
+       else if (t < 60*60)
+               sfsprintf(buf, z, "%lum%02lus", t / 60, t - (t / 60) * 60);
+       else if (t < 24*60*60)
+               sfsprintf(buf, z, "%luh%02lum", t / (60*60), (t - (t / (60*60)) 
* (60*60)) / 60);
+       else if (t < 7*24*60*60)
+               sfsprintf(buf, z, "%lud%02luh", t / (24*60*60), (t - (t / 
(24*60*60)) * (24*60*60)) / (60*60));
+       else if (t < 31*24*60*60)
+               sfsprintf(buf, z, "%luw%02lud", t / (7*24*60*60), (t - (t / 
(7*24*60*60)) * (7*24*60*60)) / (24*60*60));
+       else if (t < 365*24*60*60)
+               sfsprintf(buf, z, "%luM%02lud", (t * 12) / (365*24*60*60), ((t 
* 12) - ((t * 12) / (365*24*60*60)) * (365*24*60*60)) / (12*24*60*60));
+       else if (t < (365UL*4UL+1UL)*24UL*60UL*60UL)
+               sfsprintf(buf, z, "%luY%02luM", t / (365*24*60*60), ((t - (t / 
(365*24*60*60)) * (365*24*60*60)) * 5) / (152 * 24 * 60 * 60));
        else
-       {
-               for (n = 1; n < elementsof(amt) - 1; n++)
-               {
-                       if ((t = s / amt[n]) < amt[n + 1])
-                               break;
-                       s = t;
-               }
-               sfsprintf(buf, z, "%d%c%02d%c", (s / amt[n]) % 100, chr[n], s % 
amt[n], chr[n - 1]);
-       }
+               sfsprintf(buf, z, "%luY%02luM", (t * 4) / 
((365UL*4UL+1UL)*24UL*60UL*60UL), (((t * 4) - ((t * 4) / 
((365UL*4UL+1UL)*24UL*60UL*60UL)) * ((365UL*4UL+1UL)*24UL*60UL*60UL)) * 5) / 
((4 * 152 + 1) * 24 * 60 * 60));
        return buf;
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/fmtip4.c 
ksh93_2007_03_28/src/lib/libast/string/fmtip4.c
--- ksh93_2007_01_11/src/lib/libast/string/fmtip4.c     2000-10-12 
15:30:13.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/fmtip4.c     2007-02-14 
07:49:57.000000000 +0100
@@ -29,7 +29,7 @@
  */
 
 char*
-fmtip4(register unsigned _ast_int4_t addr, int bits)
+fmtip4(register uint32_t addr, int bits)
 {
        char*   buf;
        int     z;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strntol.c 
ksh93_2007_03_28/src/lib/libast/string/strntol.c
--- ksh93_2007_01_11/src/lib/libast/string/strntol.c    2002-11-11 
21:22:48.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/string/strntol.c    2007-02-14 
08:28:55.000000000 +0100
@@ -25,6 +25,7 @@
 
 #define S2I_function   strntol
 #define S2I_number     long
+#define S2I_unumber    unsigned long
 #define S2I_size       1
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strntoll.c 
ksh93_2007_03_28/src/lib/libast/string/strntoll.c
--- ksh93_2007_01_11/src/lib/libast/string/strntoll.c   2002-11-11 
21:23:39.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/string/strntoll.c   2007-02-14 
08:29:07.000000000 +0100
@@ -24,7 +24,8 @@
  */
 
 #define S2I_function   strntoll
-#define S2I_number     _ast_intmax_t
+#define S2I_number     intmax_t
+#define S2I_unumber    uintmax_t
 #define S2I_size       1
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strntoul.c 
ksh93_2007_03_28/src/lib/libast/string/strntoul.c
--- ksh93_2007_01_11/src/lib/libast/string/strntoul.c   2002-11-11 
21:24:44.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/string/strntoul.c   2007-02-14 
08:28:06.000000000 +0100
@@ -25,6 +25,7 @@
 
 #define S2I_function   strntoul
 #define S2I_number     long
+#define S2I_unumber    unsigned long
 #define S2I_size       1
 #define S2I_unsigned   1
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strntoull.c 
ksh93_2007_03_28/src/lib/libast/string/strntoull.c
--- ksh93_2007_01_11/src/lib/libast/string/strntoull.c  2002-11-11 
21:29:06.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/string/strntoull.c  2007-02-14 
08:29:20.000000000 +0100
@@ -24,7 +24,8 @@
  */
 
 #define S2I_function   strntoull
-#define S2I_number     _ast_intmax_t
+#define S2I_number     intmax_t
+#define S2I_unumber    uintmax_t
 #define S2I_size       1
 #define S2I_unsigned   1
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strtoi.h 
ksh93_2007_03_28/src/lib/libast/string/strtoi.h
--- ksh93_2007_01_11/src/lib/libast/string/strtoi.h     2006-10-13 
21:30:36.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/strtoi.h     2007-02-14 
08:26:52.000000000 +0100
@@ -35,6 +35,7 @@
  *
  *     S2I_function    the function name
  *     S2I_number      the signed number type
+ *     S2I_unumber     the unsigned number type
  *     S2I_unsigned    1 for unsigned, 0 for signed
  *     S2I_multiplier  1 for optional multiplier suffix, 0 otherwise
  *     S2I_size        the second argument is the input string size
@@ -94,11 +95,10 @@
 #define QL             01
 #define QU             02
 
-#define S2I_utype      unsigned S2I_number
-#define S2I_umax       (~((S2I_utype)0))
+#define S2I_umax       (~((S2I_unumber)0))
 
 #if S2I_unsigned
-#define S2I_type       S2I_utype
+#define S2I_type       S2I_unumber
 #define S2I_min                0
 #define S2I_max                S2I_umax
 #else
@@ -113,10 +113,10 @@
 #define S2I_valid(s)   1
 #endif
 
-#define ADDOVER(n,c,s) ((S2I_umax-(n))<((S2I_utype)((c)+(s))))
-#define MPYOVER(n,c)   (((S2I_utype)(n))>(S2I_umax/(c)))
+#define ADDOVER(n,c,s) ((S2I_umax-(n))<((S2I_unumber)((c)+(s))))
+#define MPYOVER(n,c)   (((S2I_unumber)(n))>(S2I_umax/(c)))
 
-static const S2I_utype mm[] =
+static const S2I_unumber       mm[] =
 {
        0,
        S2I_umax /  1,
@@ -224,15 +224,15 @@
 #if S2I_size
        register unsigned char* z = s + size;
 #endif
-       register S2I_utype      n;
-       register S2I_utype      x;
+       register S2I_unumber    n;
+       register S2I_unumber    x;
        register int            c;
        register int            shift;
        register unsigned char* p;
        register unsigned char* cv;
        unsigned char*          b;
        unsigned char*          k;
-       S2I_utype               v;
+       S2I_unumber             v;
 #if S2I_multiplier
        register int            base;
 #endif
@@ -546,7 +546,7 @@
                                        overflow = 1;
                                }
                                else
-                                       v = ((S2I_utype)1) << shift;
+                                       v = ((S2I_unumber)1) << shift;
                        }
                        if (v)
                        {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strtoip4.c 
ksh93_2007_03_28/src/lib/libast/string/strtoip4.c
--- ksh93_2007_01_11/src/lib/libast/string/strtoip4.c   2003-02-19 
09:52:17.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/string/strtoip4.c   2007-02-14 
07:50:43.000000000 +0100
@@ -43,17 +43,17 @@
  */
 
 int
-strtoip4(register const char* s, char** e, unsigned _ast_int4_t* paddr, 
unsigned char* pbits)
+strtoip4(register const char* s, char** e, uint32_t* paddr, unsigned char* 
pbits)
 {
-       register int                    c;
-       register unsigned int           n;
-       register unsigned _ast_int4_t   addr;
-       register int                    part;
-       register unsigned char          bits;
-       unsigned _ast_int4_t            z;
-       int                             old;
-       int                             r;
-       const char*                     b;
+       register int            c;
+       register unsigned int   n;
+       register uint32_t       addr;
+       register int            part;
+       register unsigned char  bits;
+       uint32_t                z;
+       int                     old;
+       int                     r;
+       const char*             b;
 
        r = -1;
        while (isspace(*s))
@@ -136,7 +136,7 @@
                else
                        bits = 24;
                if (*pbits = bits)
-                       addr &= ~((((unsigned _ast_int4_t)1)<<(32-bits))-1);
+                       addr &= ~((((uint32_t)1)<<(32-bits))-1);
                else
                        addr = 0;
        }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strton.c 
ksh93_2007_03_28/src/lib/libast/string/strton.c
--- ksh93_2007_01_11/src/lib/libast/string/strton.c     2001-03-29 
17:34:39.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/strton.c     2007-02-14 
08:25:17.000000000 +0100
@@ -25,6 +25,7 @@
 
 #define S2I_function   strton
 #define S2I_number     long
+#define S2I_unumber    unsigned long
 #define S2I_multiplier 1
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/strtonll.c 
ksh93_2007_03_28/src/lib/libast/string/strtonll.c
--- ksh93_2007_01_11/src/lib/libast/string/strtonll.c   2001-03-29 
17:34:46.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/strtonll.c   2007-02-14 
08:25:26.000000000 +0100
@@ -24,7 +24,8 @@
  */
 
 #define S2I_function   strtonll
-#define S2I_number     _ast_intmax_t
+#define S2I_number     intmax_t
+#define S2I_unumber    uintmax_t
 #define S2I_multiplier 1
 
 #include "strtoi.h"
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/swapget.c 
ksh93_2007_03_28/src/lib/libast/string/swapget.c
--- ksh93_2007_01_11/src/lib/libast/string/swapget.c    1996-04-11 
18:51:33.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/swapget.c    2007-02-14 
08:17:50.000000000 +0100
@@ -34,16 +34,16 @@
  * get int_n from b according to op
  */
 
-int_max
+intmax_t
 swapget(int op, const void* b, int n)
 {
        register unsigned char* p;
        register unsigned char* d;
-       int_max                 v;
-       unsigned char           tmp[sizeof(int_max)];
+       intmax_t                v;
+       unsigned char           tmp[sizeof(intmax_t)];
 
-       if (n > sizeof(int_max))
-               n = sizeof(int_max);
+       if (n > sizeof(intmax_t))
+               n = sizeof(intmax_t);
        if (op) swapmem(op, b, d = tmp, n);
        else d = (unsigned char*)b;
        p = d + n;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/swapop.c 
ksh93_2007_03_28/src/lib/libast/string/swapop.c
--- ksh93_2007_01_11/src/lib/libast/string/swapop.c     2004-10-28 
17:11:07.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/swapop.c     2007-02-14 
08:30:20.000000000 +0100
@@ -41,13 +41,13 @@
 {
        register int    op;
        register int    z;
-       char            tmp[sizeof(int_max)];
+       char            tmp[sizeof(intmax_t)];
 
        if ((z = size) < 0)
                z = -z;
        if (z <= 1)
                return 0;
-       if (z <= sizeof(int_max))
+       if (z <= sizeof(intmax_t))
                for (op = 0; op < z; op++)
                        if (!memcmp(internal, swapmem(op, external, tmp, z), z))
                        {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/string/swapput.c 
ksh93_2007_03_28/src/lib/libast/string/swapput.c
--- ksh93_2007_01_11/src/lib/libast/string/swapput.c    1996-04-11 
18:57:03.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/string/swapput.c    2007-02-14 
08:29:54.000000000 +0100
@@ -35,7 +35,7 @@
  */
 
 void*
-swapput(int op, void* b, int n, int_max v)
+swapput(int op, void* b, int n, intmax_t v)
 {
        register char*  p = (char*)b + n;
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tmdata.c 
ksh93_2007_03_28/src/lib/libast/tm/tmdata.c
--- ksh93_2007_01_11/src/lib/libast/tm/tmdata.c 2004-11-30 21:43:44.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tmdata.c 2007-03-22 23:10:59.000000000 
+0100
@@ -259,6 +259,24 @@
  0,    0,      0,      0,                   0
 };
 
-Tm_data_t tm_data = { format, lex, digit, days, sum, leap, zone };
+/*
+ * 2007-03-19 move tm_data from _tm_data_ to (*_tm_datap_)
+ *           to allow future Tm_data_t growth
+ *            by 2009 _tm_data_ can be static
+ */
+
+#if _BLD_ast && defined(__EXPORT__)
+#define extern         extern __EXPORT__
+#endif
+
+extern Tm_data_t       _tm_data_;
+
+#undef extern
+
+Tm_data_t _tm_data_ = { format, lex, digit, days, sum, leap, zone };
 
 __EXTERN__(Tm_data_t, _tm_data_);
+
+__EXTERN__(Tm_data_t*, _tm_datap_);
+
+Tm_data_t*             _tm_datap_ = &_tm_data_;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tminit.c 
ksh93_2007_03_28/src/lib/libast/tm/tminit.c
--- ksh93_2007_01_11/src/lib/libast/tm/tminit.c 2005-03-03 23:05:31.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tminit.c 2007-03-22 23:13:16.000000000 
+0100
@@ -63,10 +63,28 @@
        0,              0
 };
 
-Tm_info_t      _tm_info_ = { 0 };
+/*
+ * 2007-03-19 move tm_info from _tm_info_ to (*_tm_infop_)
+ *           to allow future Tm_info_t growth
+ *            by 2009 _tm_info_ can be static
+ */
+
+#if _BLD_ast && defined(__EXPORT__)
+#define extern         extern __EXPORT__
+#endif
+
+extern Tm_info_t       _tm_info_;
+
+#undef extern
+
+Tm_info_t              _tm_info_ = { 0 };
 
 __EXTERN__(Tm_info_t, _tm_info_);
 
+__EXTERN__(Tm_info_t*, _tm_infop_);
+
+Tm_info_t*             _tm_infop_ = &_tm_info_;
+
 #if _tzset_environ
 
 static char    TZ[256];
@@ -417,7 +435,7 @@
 void
 tminit(register Tm_zone_t* zp)
 {
-       static unsigned _ast_int4_t     serial = ~(unsigned _ast_int4_t)0;
+       static uint32_t         serial = ~(uint32_t)0;
 
        if (serial != ast.env_serial)
        {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tmxfmt.c 
ksh93_2007_03_28/src/lib/libast/tm/tmxfmt.c
--- ksh93_2007_01_11/src/lib/libast/tm/tmxfmt.c 2005-01-11 22:04:23.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tmxfmt.c 2007-01-17 21:36:13.000000000 
+0100
@@ -117,7 +117,7 @@
        flags = tm_info.flags;
        sp = &stack[0];
        cp = buf;
-       ep = buf + len - 1;
+       ep = buf + len;
        delimiter = 0;
        for (;;)
        {
@@ -517,9 +517,8 @@
        index:
                p = tm_info.format[n];
        string:
-               while (*cp = *p++)
-                       if (cp < ep)
-                               cp++;
+               while (cp < ep && (*cp = *p++))
+                       cp++;
                continue;
        push:
                c = 0;
@@ -535,6 +534,8 @@
                continue;
        }
        tm_info.flags = flags;
+       if (cp >= ep)
+               cp = ep - 1;
        *cp = 0;
        return cp;
 }
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tmxleap.c 
ksh93_2007_03_28/src/lib/libast/tm/tmxleap.c
--- ksh93_2007_01_11/src/lib/libast/tm/tmxleap.c        2004-12-08 
07:17:29.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tmxleap.c        2007-02-14 
07:51:16.000000000 +0100
@@ -38,7 +38,7 @@
 tmxleap(Time_t t)
 {
        register Tm_leap_t*     lp;
-       unsigned _ast_int4_t    sec;
+       uint32_t                sec;
 
        tmset(tm_info.zone);
        if (tm_info.flags & TM_ADJUST)
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tmxmake.c 
ksh93_2007_03_28/src/lib/libast/tm/tmxmake.c
--- ksh93_2007_01_11/src/lib/libast/tm/tmxmake.c        2005-03-02 
21:45:07.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tmxmake.c        2007-02-14 
07:51:38.000000000 +0100
@@ -45,11 +45,11 @@
        time_t                  now;
        int                     leapsec;
        int                     y;
-       unsigned _ast_int4_t    n;
-       _ast_int4_t             o;
+       uint32_t                n;
+       int32_t                 o;
 #if TMX_FLOAT
        Time_t                  z;
-       unsigned _ast_int4_t    i;
+       uint32_t                i;
 #endif
        Tm_t                    tm;
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tmxscan.c 
ksh93_2007_03_28/src/lib/libast/tm/tmxscan.c
--- ksh93_2007_01_11/src/lib/libast/tm/tmxscan.c        2006-10-04 
17:51:15.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/tm/tmxscan.c        2007-03-11 
12:43:11.000000000 +0100
@@ -37,7 +37,7 @@
 
 typedef struct
 {
-       _ast_int4_t     nsec;
+       int32_t         nsec;
        int             year;
        int             mon;
        int             week;
@@ -456,17 +456,19 @@
        char*           r;
        Time_t          x;
 
+       static int      initialized;
        static char**   datemask;
 
        tmlocale();
        if (!format || !*format)
        {
-               if (!datemask)
+               if (!initialized)
                {
                        register Sfio_t*        sp;
                        register int            n;
                        off_t                   m;
 
+                       initialized = 1;
                        if ((v = getenv("DATEMSK")) && *v && (sp = sfopen(NiL, 
v, "r")))
                        {
                                for (n = 1; sfgetr(sp, '\n', 0); n++);
@@ -495,10 +497,8 @@
                                        }
                                }
                        }
-                       if (!datemask)
-                               datemask = (char**)&datemask;
                }
-               if ((p = datemask) != (char**)&datemask)
+               if (p = datemask)
                        while (v = *p++)
                        {
                                x = scan(s, &q, v, &r, t, flags);
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tmxtime.c 
ksh93_2007_03_28/src/lib/libast/tm/tmxtime.c
--- ksh93_2007_01_11/src/lib/libast/tm/tmxtime.c        2005-03-02 
21:45:24.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tmxtime.c        2007-02-14 
07:52:51.000000000 +0100
@@ -47,7 +47,7 @@
 {
        register Time_t         t;
        register Tm_leap_t*     lp;
-       register _ast_int4_t    y;
+       register int32_t        y;
        int                     n;
        int                     sec;
        time_t                  now;
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tvgettime.c 
ksh93_2007_03_28/src/lib/libast/tm/tvgettime.c
--- ksh93_2007_01_11/src/lib/libast/tm/tvgettime.c      2004-12-08 
20:00:57.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tvgettime.c      2007-02-14 
07:53:05.000000000 +0100
@@ -51,7 +51,7 @@
 #else
 
        static time_t                   s;
-       static unsigned _ast_int4_t     n;
+       static uint32_t                 n;
 
        if ((tv->tv_sec = time(NiL)) != s)
        {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tvsleep.c 
ksh93_2007_03_28/src/lib/libast/tm/tvsleep.c
--- ksh93_2007_01_11/src/lib/libast/tm/tvsleep.c        2004-12-14 
16:52:55.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tvsleep.c        2007-02-14 
07:53:18.000000000 +0100
@@ -94,7 +94,7 @@
 #else
 
        unsigned int            s = tv->tv_sec;
-       unsigned _ast_int4_t    n = tv->tv_nsec;
+       uint32_t                n = tv->tv_nsec;
 
 #if _lib_usleep
 
diff -r -N -u ksh93_2007_01_11/src/lib/libast/tm/tvtouch.c 
ksh93_2007_03_28/src/lib/libast/tm/tvtouch.c
--- ksh93_2007_01_11/src/lib/libast/tm/tvtouch.c        2005-01-16 
17:06:31.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/tm/tvtouch.c        2007-02-14 
07:53:32.000000000 +0100
@@ -59,7 +59,7 @@
 #endif
 #endif
 
-#define NS(n)          (((unsigned _ast_int4_t)(n))<1000000000L?(n):0)
+#define NS(n)          (((uint32_t)(n))<1000000000L?(n):0)
 
 /*
  * touch path <atime,mtime,ctime>
diff -r -N -u ksh93_2007_01_11/src/lib/libast/uwin/crypt.c 
ksh93_2007_03_28/src/lib/libast/uwin/crypt.c
--- ksh93_2007_01_11/src/lib/libast/uwin/crypt.c        2006-10-27 
21:47:19.000000000 +0200
+++ ksh93_2007_03_28/src/lib/libast/uwin/crypt.c        2007-02-22 
21:31:40.000000000 +0100
@@ -1,26 +1,3 @@
-/***********************************************************************
-*                                                                      *
-*               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
-
 #include "FEATURE/uwin"
 
 #if !_UWIN || _lib_crypt
diff -r -N -u ksh93_2007_01_11/src/lib/libast/uwin/rint.c 
ksh93_2007_03_28/src/lib/libast/uwin/rint.c
--- ksh93_2007_01_11/src/lib/libast/uwin/rint.c 2002-08-26 23:02:52.000000000 
+0200
+++ ksh93_2007_03_28/src/lib/libast/uwin/rint.c 2007-02-22 21:32:39.000000000 
+0100
@@ -19,8 +19,6 @@
 *                   Phong Vo <kpv at research.att.com>                    *
 *                                                                      *
 ***********************************************************************/
-#include       <math.h>
-
 #include "FEATURE/uwin"
 
 #if !_UWIN || _lib_ceil && _lib_floor && _lib_rint 
@@ -29,6 +27,8 @@
  
 #else
 
+#include <math.h>
+
 extern double rint(x)
 double x;
 {
diff -r -N -u ksh93_2007_01_11/src/lib/libast/vmalloc/malloc.c 
ksh93_2007_03_28/src/lib/libast/vmalloc/malloc.c
--- ksh93_2007_01_11/src/lib/libast/vmalloc/malloc.c    2006-11-27 
23:12:09.000000000 +0100
+++ ksh93_2007_03_28/src/lib/libast/vmalloc/malloc.c    2007-03-13 
15:36:22.000000000 +0100
@@ -74,7 +74,7 @@
 #else
 #define F0(f,t0)               f()
 #define F1(f,t1,a1)            f(a1) t1 a1;
-#define F1(f,t1,a1,t2,a2)      f(a1, a2) t1 a1; t2 a2;
+#define F2(f,t1,a1,t2,a2)      f(a1, a2) t1 a1; t2 a2;
 #endif
 
 /*
@@ -215,14 +215,19 @@
 }
 
 static int             _Vmflinit = 0;
+static Vmulong_t       _Vmdbstart = 0;
 static Vmulong_t       _Vmdbcheck = 0;
 static Vmulong_t       _Vmdbtime = 0;
 static int             _Vmpffd = -1;
 #define VMFLINIT() \
        { if(!_Vmflinit)        vmflinit(); \
-         if(_Vmdbcheck && (++_Vmdbtime % _Vmdbcheck) == 0 && \
-            Vmregion->meth.meth == VM_MTDEBUG) \
+         if(_Vmdbcheck) \
+         { if(_Vmdbtime < _Vmdbstart) _Vmdbtime += 1; \
+           else if((_Vmdbtime += 1) < _Vmdbstart) _Vmdbtime = _Vmdbstart; \
+           if(_Vmdbtime >= _Vmdbstart && (_Vmdbtime % _Vmdbcheck) == 0 && \
+              Vmregion->meth.meth == VM_MTDEBUG) \
                vmdbcheck(Vmregion); \
+         } \
        }
 
 #if __STD_C
@@ -355,17 +360,19 @@
                                        if((fd = atou(&env)) >= 0 )
                                                vmdebug(fd);
                                }
-
-                               if(*env < '0' || *env > '9')
+                               else if(*env < '0' || *env > '9')
                                        env += 1;
-                               else if(env[0] == '0' &&
-                                       (env[1] == 'x' || env[1] == 'X') )
+                               else if(env[0] == '0' && (env[1] == 'x' || 
env[1] == 'X') )
                                {       if((addr = atou(&env)) != 0)
                                                vmdbwatch((Void_t*)addr);
                                }
                                else
                                {       _Vmdbcheck = atou(&env);
                                        setcheck = 1;
+                                       if(*env == ',')
+                                       {       env += 1;
+                                               _Vmdbstart = atou(&env);
+                                       }
                                }
                        }
                        if(!setcheck)
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/chmod.c 
ksh93_2007_03_28/src/lib/libcmd/chmod.c
--- ksh93_2007_01_11/src/lib/libcmd/chmod.c     2006-11-01 21:15:59.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/chmod.c     2007-01-26 23:43:33.000000000 
+0100
@@ -28,7 +28,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: chmod (AT&T Research) 2006-06-25 $\n]"
+"[-?\n@(#)$Id: chmod (AT&T Research) 2007-07-26 $\n]"
 USAGE_LICENSE
 "[+NAME?chmod - change the access permissions of files]"
 "[+DESCRIPTION?\bchmod\b changes the permission of each file "
@@ -253,7 +253,8 @@
                case FTS_SL:
                        if (chmodf == chmod)
                        {
-                               fts_set(NiL, ent, FTS_FOLLOW);
+                               if (!(flags & FTS_PHYSICAL) || (flags & 
FTS_META) && ent->fts_level == 1)
+                                       fts_set(NiL, ent, FTS_FOLLOW);
                                break;
                        }
                        /*FALLTHROUGH*/
@@ -266,7 +267,7 @@
                        if ((*chmodf)(ent->fts_accpath, mode) >= 0)
                        {
                                if (notify == 2 || notify == 1 && 
(mode&S_IPERM) != (ent->fts_statp->st_mode&S_IPERM))
-                                       sfprintf(sfstdout, "%s: mode changed to 
%0.4o (%s)\n", ent->fts_accpath, mode, fmtmode(mode, 1)+1);
+                                       sfprintf(sfstdout, "%s: mode changed to 
%0.4o (%s)\n", ent->fts_path, mode, fmtmode(mode, 1)+1);
                        }
                        else if (!force)
                                error(ERROR_system(0), "%s: cannot change 
mode", ent->fts_accpath);
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/cksum.c 
ksh93_2007_03_28/src/lib/libcmd/cksum.c
--- ksh93_2007_01_11/src/lib/libcmd/cksum.c     1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/cksum.c     2007-02-07 20:25:43.000000000 
+0100
@@ -0,0 +1,599 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1992-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>                   *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * sum -- list file checksum and size
+ */
+
+static const char usage[] =
+"[-?\n@(#)$Id: sum (AT&T Research) 2007-02-07 $\n]"
+USAGE_LICENSE
+"[+NAME?cksum,md5sum,sum - print file checksum and block count]"
+"[+DESCRIPTION?\bsum\b lists the checksum, and for most methods the block"
+"      count, for each file argument. The standard input is read if there are"
+"      no \afile\a arguments. \bgetconf UNIVERSE\b determines the default"
+"      \bsum\b method: \batt\b for the \batt\b universe, \bbsd\b otherwise."
+"      The default for the other commands is the command name itself. The"
+"      \batt\b method is a true sum, all others are order dependent.]"
+"[+?Method names consist of a leading identifier and 0 or more options"
+"      separated by -.]"
+"[+?\bgetconf PATH_RESOLVE\b determines how symbolic links are handled. This"
+"      can be explicitly overridden by the \b--logical\b, \b--metaphysical\b,"
+"      and \b--physical\b options below. \bPATH_RESOLVE\b can be one of:]{"
+"              [+logical?Follow all symbolic links.]"
+"              [+metaphysical?Follow command argument symbolic links,"
+"                      otherwise don't follow.]"
+"              [+physical?Don't follow symbolic links.]"
+"}"
+
+"[a:all?List the checksum for all files. Use with \b--total\b to list both"
+"      individual and total checksums and block counts.]"
+"[b:binary?Read files in binary mode. This is the default.]"
+"[c:check?Each \afile\a is interpreted as the output from a previous \bsum\b."
+"      If \b--header\b or \b--permissions\b was specified in the previous"
+"      \bsum\b then the checksum method is automatically determined,"
+"      otherwise \b--method\b must be specified. The listed checksum is"
+"      compared with the current value and a warning is issued for each file"
+"      that does not match. If \afile\a was generated by \b--permissions\b"
+"      then the file mode, user and group are also checked. Empty lines,"
+"      lines starting with \b#<space>\b, or the line \b#\b are ignored. Lines"
+"      containing no blanks are interpreted as [no]]\aname\a[=\avalue\a]]"
+"      options:]{"
+"              [+method=name?Checksum method to apply to subsequent lines.]"
+"              [+permissions?Subsequent lines were generated with"
+"                      \b--permissions\b.]"
+"}"
+"[h:header?Print the checksum method as the first output line. Used with"
+"      \b--check\b and \b--permissions\b.]"
+"[l:list?Each \afile\a is interpreted as a list of files, one per line,"
+"      that is checksummed.]"
+"[p:permissions?If \b--check\b is not specified then list the file"
+"      mode, user and group between the checksum and path. User and group"
+"      matching the caller are output as \b-\b. If \b--check\b is"
+"      specified then the mode, user and group for each path in \afile\a"
+"      are updated if necessary to match those in \afile\a. A warning is"
+"      printed on the standard error for each changed file.]"
+"[r:recursive?Recursively checksum the contents of directories.]"
+"[s:silent|status?No output for \b--check\b; 0 exit status means all sums"
+"      matched, non-0 means at least one sum failed to match. Ignored for"
+"      \b--permissions\b.]"
+"[t:total?List only the total checksum and block count of all files."
+"      \b--all\b \b--total\b lists each checksum and the total. The"
+"      total checksum and block count may be different from the checksum"
+"      and block count of the catenation of all files due to partial"
+"      blocks that may occur when the files are treated separately.]"
+"[T:text?Read files in text mode (i.e., treat \b\\r\\n\b as \b\\n\b).]"
+"[w!:warn?Warn about invalid \b--check\b lines.]"
+"[x:method|algorithm?Specifies the checksum \amethod\a to"
+"      apply. Parenthesized method options are readonly implementation"
+"      details.]:[method]{\fmethods\f}"
+"[L:logical|follow?Follow symbolic links when traversing directories. The"
+"      default is determined by \bgetconf PATH_RESOLVE\b.]"
+"[H:metaphysical?Follow command argument symbolic links, otherwise don't"
+"      follow symbolic links when traversing directories. The default is"
+"      determined by \bgetconf PATH_RESOLVE\b.]"
+"[P:physical?Don't follow symbolic links when traversing directories. The"
+"      default is determined by \bgetconf PATH_RESOLVE\b.]"
+
+"\n"
+"\n[ file ... ]\n"
+"\n"
+
+"[+SEE ALSO?\bgetconf\b(1), \btw\b(1), \buuencode\b(1)]"
+;
+
+#include <cmd.h>
+#include <sum.h>
+#include <ls.h>
+#include <fts.h>
+#include <error.h>
+
+typedef struct State_s                 /* program state                */
+{
+       int             all;            /* list all items               */
+       Sfio_t*         check;          /* check previous output        */
+       gid_t           gid;            /* caller gid                   */
+       int             header;         /* list method on output        */
+       int             list;           /* list file name too           */
+       Sum_t*          oldsum;         /* previous sum method          */
+       int             permissions;    /* include mode,uer,group       */
+       int             haveperm;       /* permissions in the input     */
+       int             recursive;      /* recursively descend dirs     */
+       unsigned long   size;           /* combined size of all files   */
+       int             silent;         /* silent check, 0 exit if ok   */
+       int             (*sort)(FTSENT* const*, FTSENT* const*);
+       Sum_t*          sum;            /* sum method                   */
+       int             text;           /* \r\n == \n                   */
+       int             total;          /* list totals only             */
+       uid_t           uid;            /* caller uid                   */
+       int             warn;           /* invalid check line warnings  */
+} State_t;
+
+static void    verify(State_t*, char*, char*, Sfio_t*);
+
+/*
+ * open path for read mode
+ */
+
+static Sfio_t*
+openfile(const char* path, const char* mode)
+{
+       Sfio_t*         sp;
+
+       if (!path || streq(path, "-") || streq(path, "/dev/stdin") || 
streq(path, "/dev/fd/0"))
+       {
+               sp = sfstdin;
+               sfopen(sp, NiL, mode);
+       }
+       else if (!(sp = sfopen(NiL, path, mode)))
+               error(ERROR_SYSTEM|2, "%s: cannot read", path);
+       return sp;
+}
+
+/*
+ * close an openfile() stream
+ */
+
+static int
+closefile(Sfio_t* sp)
+{
+       return sp == sfstdin ? 0 : sfclose(sp);
+}
+
+/*
+ * compute and print sum on an open file
+ */
+
+static void
+pr(State_t* state, Sfio_t* op, Sfio_t* ip, char* file, int perm, struct stat* 
st, Sfio_t* check)
+{
+       register char*  p;
+       register char*  r;
+       register char*  e;
+       register int    peek;
+       struct stat     ss;
+
+       if (check)
+       {
+               state->oldsum = state->sum;
+               while (p = sfgetr(ip, '\n', 1))
+                       verify(state, p, file, check);
+               state->sum = state->oldsum;
+               if (state->warn && !sfeof(ip))
+                       error(2, "%s: last line incomplete", file);
+               return;
+       }
+       suminit(state->sum);
+       if (state->text)
+       {
+               peek = 0;
+               while (p = sfreserve(ip, SF_UNBOUND, 0))
+               {
+                       e = p + sfvalue(ip);
+                       if (peek)
+                       {
+                               peek = 0;
+                               if (*p != '\n')
+                                       sumblock(state->sum, "\r", 1);
+                       }
+                       while (r = memchr(p, '\r', e - p))
+                       {
+                               if (++r >= e)
+                               {
+                                       e--;
+                                       peek = 1;
+                                       break;
+                               }
+                               sumblock(state->sum, p, r - p - (*r == '\n'));
+                               p = r;
+                       }
+                       sumblock(state->sum, p, e - p);
+               }
+               if (peek)
+                       sumblock(state->sum, "\r", 1);
+       }
+       else
+               while (p = sfreserve(ip, SF_UNBOUND, 0))
+                       sumblock(state->sum, p, sfvalue(ip));
+       if (sfvalue(ip))
+               error(ERROR_SYSTEM|2, "%s: read error", file);
+       sumdone(state->sum);
+       if (!state->total || state->all)
+       {
+               sumprint(state->sum, op, SUM_SIZE|SUM_SCALE);
+               if (perm >= 0)
+               {
+                       if (perm)
+                       {
+                               if (!st && fstat(sffileno(ip), st = &ss))
+                                       error(ERROR_SYSTEM|2, "%s: cannot 
stat", file);
+                               else
+                                       sfprintf(sfstdout, " %04o %s %s",
+                                               modex(st->st_mode & S_IPERM),
+                                               (st->st_uid != state->uid && 
((st->st_mode & S_ISUID) || (st->st_mode & S_IRUSR) && !(st->st_mode & 
(S_IRGRP|S_IROTH)) || (st->st_mode & S_IXUSR) && !(st->st_mode & 
(S_IXGRP|S_IXOTH)))) ? fmtuid(st->st_uid) : "-",
+                                               (st->st_gid != state->gid && 
((st->st_mode & S_ISGID) || (st->st_mode & S_IRGRP) && !(st->st_mode & S_IROTH) 
|| (st->st_mode & S_IXGRP) && !(st->st_mode & S_IXOTH))) ? fmtgid(st->st_gid) : 
"-");
+                       }
+                       if (ip != sfstdin)
+                               sfprintf(op, " %s", file);
+                       sfputc(op, '\n');
+               }
+       }
+}
+
+/*
+ * verify previous sum output
+ */
+
+static void
+verify(State_t* state, register char* s, char* check, Sfio_t* rp)
+{
+       register char*  t;
+       char*           e;
+       char*           file;
+       int             attr;
+       int             mode;
+       int             uid;
+       int             gid;
+       Sfio_t*         sp;
+       struct stat     st;
+
+       if (!*s || *s == '#' && (!*(s + 1) || *(s + 1) == ' ' || *(s + 1) == 
'\t'))
+               return;
+       if (t = strchr(s, ' '))
+       {
+               if ((t - s) > 10 || !(file = strchr(t + 1, ' ')))
+                       file = t;
+               *file++ = 0;
+               attr = 0;
+               if ((mode = strtol(file, &e, 8)) && *e == ' ' && (e - file) == 
4)
+               {
+                       mode = modei(mode);
+                       if (t = strchr(++e, ' '))
+                       {
+                               if (*e == '-' && (t - e) == 1)
+                                       uid = -1;
+                               else
+                               {
+                                       *t = 0;
+                                       uid = struid(e);
+                                       *t = ' ';
+                               }
+                               if (e = strchr(++t, ' '))
+                               {
+                                       if (*t == '-' && (e - t) == 1)
+                                               gid = -1;
+                                       else
+                                       {
+                                               *e = 0;
+                                               gid = struid(t);
+                                               *e = ' ';
+                                       }
+                                       file = e + 1;
+                                       attr = 1;
+                               }
+                       }
+               }
+               if (sp = openfile(file, "rb"))
+               {
+                       pr(state, rp, sp, file, -1, NiL, NiL);
+                       if (!(t = sfstruse(rp)))
+                               error(ERROR_SYSTEM|3, "out of space");
+                       if (!streq(s, t))
+                       {
+                               if (state->silent)
+                                       error_info.errors++;
+                               else
+                                       error(2, "%s: checksum changed", file);
+                       }
+                       else if (attr)
+                       {
+                               if (fstat(sffileno(sp), &st))
+                               {
+                                       if (state->silent)
+                                               error_info.errors++;
+                                       else
+                                               error(ERROR_SYSTEM|2, "%s: 
cannot stat", file);
+                               }
+                               else
+                               {
+                                       if (uid < 0 || uid == st.st_uid)
+                                               uid = -1;
+                                       else if (!state->permissions)
+                                       {
+                                               if (state->silent)
+                                                       error_info.errors++;
+                                               else
+                                                       error(2, "%s: uid 
should be %s", file, fmtuid(uid));
+                                       }
+                                       if (gid < 0 || gid == st.st_gid)
+                                               gid = -1;
+                                       else if (!state->permissions)
+                                       {
+                                               if (state->silent)
+                                                       error_info.errors++;
+                                               else
+                                                       error(2, "%s: gid 
should be %s", file, fmtgid(gid));
+                                       }
+                                       if (state->permissions && (uid >= 0 || 
gid >= 0))
+                                       {
+                                               if (chown(file, uid, gid) < 0)
+                                               {
+                                                       if (uid < 0)
+                                                               
error(ERROR_SYSTEM|2, "%s: cannot change group to %s", file, fmtgid(gid));
+                                                       else if (gid < 0)
+                                                               
error(ERROR_SYSTEM|2, "%s: cannot change user to %s", file, fmtuid(uid));
+                                                       else
+                                                               
error(ERROR_SYSTEM|2, "%s: cannot change user to %s and group to %s", file, 
fmtuid(uid), fmtgid(gid));
+                                               }
+                                               else
+                                               {
+                                                       if (uid < 0)
+                                                               error(1, "%s: 
changed group to %s", file, fmtgid(gid));
+                                                       else if (gid < 0)
+                                                               error(1, "%s: 
changed user to %s", file, fmtuid(uid));
+                                                       else
+                                                               error(1, "%s: 
changed user to %s and group to %s", file, fmtuid(uid), fmtgid(gid));
+                                               }
+                                       }
+                                       if ((st.st_mode & S_IPERM) ^ mode)
+                                       {
+                                               if (state->permissions)
+                                               {
+                                                       if (chmod(file, mode) < 
0)
+                                                               
error(ERROR_SYSTEM|2, "%s: cannot change mode to %s", file, fmtmode(mode, 0));
+                                                       else
+                                                               
error(ERROR_SYSTEM|1, "%s: changed mode to %s", file, fmtmode(mode, 0));
+                                               }
+                                               else if (state->silent)
+                                                       error_info.errors++;
+                                               else
+                                                       error(2, "%s: mode 
should be %s", file, fmtmode(mode, 0));
+                                       }
+                               }
+                       }
+                       closefile(sp);
+               }
+       }
+       else if (strneq(s, "method=", 7))
+       {
+               s += 7;
+               if (state->sum != state->oldsum)
+                       sumclose(state->sum);
+               if (!(state->sum = sumopen(s)))
+                       error(3, "%s: %s: unknown checksum method", check, s);
+       }
+       else if (streq(s, "permissions"))
+               state->haveperm = 1;
+       else
+               error(1, "%s: %s: unknown option", check, s);
+}
+
+/*
+ * sum the list of files in lp
+ */
+
+static void
+list(State_t* state, register Sfio_t* lp)
+{
+       register char*          file;
+       register Sfio_t*        sp;
+
+       while (file = sfgetr(lp, '\n', 1))
+               if (sp = openfile(file, state->check ? "rt" : "rb"))
+               {
+                       pr(state, sfstdout, sp, file, state->permissions, NiL, 
state->check);
+                       closefile(sp);
+               }
+}
+
+/*
+ * order child entries
+ */
+
+static int
+order(FTSENT* const* f1, FTSENT* const* f2)
+{
+       return strcoll((*f1)->fts_name, (*f2)->fts_name);
+}
+
+/*
+ * optget() info discipline function
+ */
+
+static int
+optinfo(Opt_t* op, Sfio_t* sp, const char* s, Optdisc_t* dp)
+{
+       if (streq(s, "methods"))
+               return sumusage(sp);
+       return 0;
+}
+
+int
+b_cksum(int argc, register char** argv, void* context)
+{
+       register int    flags;
+       register char*  s;
+       char*           file;
+       Sfio_t*         sp;
+       FTS*            fts;
+       FTSENT*         ent;
+       Optdisc_t       optdisc;
+       State_t         state;
+
+       cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY);
+       memset(&state, 0, sizeof(state));
+       setlocale(LC_ALL, "");
+       flags = fts_flags() | FTS_TOP | FTS_NOPOSTORDER | FTS_NOSEEDOTDIR;
+       state.warn = 1;
+       optinit(&optdisc, optinfo);
+       for (;;)
+       {
+               switch (optget(argv, usage))
+               {
+               case 'a':
+                       state.all = 1;
+                       continue;
+               case 'b':
+                       state.text = 0;
+                       continue;
+               case 'c':
+                       if (!(state.check = sfstropen()))
+                               error(3, "out of space [check]");
+                       continue;
+               case 'h':
+                       state.header = 1;
+                       continue;
+               case 'l':
+                       state.list = 1;
+                       continue;
+               case 'p':
+                       state.permissions = 1;
+                       continue;
+               case 'r':
+                       flags &= ~FTS_TOP;
+                       state.recursive = 1;
+                       state.sort = order;
+                       continue;
+               case 's':
+                       state.silent = opt_info.num;
+                       continue;
+               case 't':
+                       state.total = 1;
+                       continue;
+               case 'w':
+                       state.warn = opt_info.num;
+                       continue;
+               case 'x':
+                       if (!(state.sum = sumopen(opt_info.arg)))
+                               error(3, "%s: unknown checksum method", 
opt_info.arg);
+                       continue;
+               case 'H':
+                       flags |= FTS_META|FTS_PHYSICAL;
+                       continue;
+               case 'L':
+                       flags &= ~(FTS_META|FTS_PHYSICAL);
+                       continue;
+               case 'P':
+                       flags &= ~FTS_META;
+                       flags |= FTS_PHYSICAL;
+                       continue;
+               case 'T':
+                       state.text = 1;
+                       continue;
+               case '?':
+                       error(ERROR_USAGE|4, "%s", opt_info.arg);
+                       break;
+               case ':':
+                       error(2, "%s", opt_info.arg);
+                       break;
+               }
+               break;
+       }
+       argv += opt_info.index;
+       if (error_info.errors)
+               error(ERROR_USAGE|4, "%s", optusage(NiL));
+
+       /*
+        * check the method
+        */
+
+       if (!state.sum && !(state.sum = sumopen(error_info.id)) && !(state.sum 
= sumopen(astconf("UNIVERSE", NiL, NiL))))
+               state.sum = sumopen(NiL);
+
+       /*
+        * do it
+        */
+
+       if (state.permissions)
+       {
+               state.uid = geteuid();
+               state.gid = getegid();
+               state.silent = 0;
+       }
+       if (!state.check && (state.header || state.permissions))
+       {
+               sfprintf(sfstdout, "method=%s\n", state.sum->name);
+               if (state.permissions)
+                       sfprintf(sfstdout, "permissions\n");
+       }
+       if (state.list)
+       {
+               if (*argv)
+               {
+                       while (file = *argv++)
+                               if (sp = openfile(file, "rt"))
+                               {
+                                       list(&state, sp);
+                                       closefile(sp);
+                               }
+               }
+               else if (sp = openfile(NiL, "rt"))
+               {
+                       list(&state, sp);
+                       closefile(sp);
+               }
+       }
+       else if (!*argv && !state.recursive)
+               pr(&state, sfstdout, sfstdin, "/dev/stdin", state.permissions, 
NiL, state.check);
+       else if (!(fts = fts_open(argv, flags, state.sort)))
+               error(ERROR_system(1), "%s: not found", *argv);
+       else
+       {
+               while (!cmdquit() && (ent = fts_read(fts)))
+                       switch (ent->fts_info)
+                       {
+                       case FTS_SL:
+                               if (!(flags & FTS_PHYSICAL) || (flags & 
FTS_META) && ent->fts_level == 1)
+                                       fts_set(NiL, ent, FTS_FOLLOW);
+                               break;
+                       case FTS_F:
+                               if (sp = openfile(ent->fts_accpath, "rb"))
+                               {
+                                       pr(&state, sfstdout, sp, ent->fts_path, 
state.permissions, ent->fts_statp, state.check);
+                                       closefile(sp);
+                               }
+                               break;
+                       case FTS_DC:
+                               error(ERROR_warn(0), "%s: directory causes 
cycle", ent->fts_accpath);
+                               break;
+                       case FTS_DNR:
+                               error(ERROR_system(0), "%s: cannot read 
directory", ent->fts_accpath);
+                               break;
+                       case FTS_DNX:
+                               error(ERROR_system(0), "%s: cannot search 
directory", ent->fts_accpath);
+                               break;
+                       case FTS_NS:
+                               error(ERROR_system(0), "%s: not found", 
ent->fts_accpath);
+                               break;
+                       }
+               fts_close(fts);
+       }
+       if (state.total)
+       {
+               sumprint(state.sum, sfstdout, SUM_TOTAL|SUM_SIZE|SUM_SCALE);
+               sfputc(sfstdout, '\n');
+       }
+       sumclose(state.sum);
+       return error_info.errors != 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/cut.c 
ksh93_2007_03_28/src/lib/libcmd/cut.c
--- ksh93_2007_01_11/src/lib/libcmd/cut.c       2006-11-01 22:23:18.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/cut.c       2007-01-23 18:31:39.000000000 
+0100
@@ -29,7 +29,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: cut (AT&T Research) 2006-07-17 $\n]"
+"[-?\n@(#)$Id: cut (AT&T Research) 2007-01-23 $\n]"
 USAGE_LICENSE
 "[+NAME?cut - cut out selected columns or fields of each line of a file]"
 "[+DESCRIPTION?\bcut\b bytes, characters, or character-delimited fields "
@@ -97,9 +97,9 @@
        int             ldelim;
        int             seqno;
        int             reclen;
-       int             list[2];
        signed char     space[UCHAR_MAX];
        Last_t          last;
+       int             list[2];        /* NOTE: must be last member */
 } Cut_t;
 
 #define HUGE           (1<<14)
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/date.c 
ksh93_2007_03_28/src/lib/libcmd/date.c
--- ksh93_2007_01_11/src/lib/libcmd/date.c      2006-11-01 21:16:22.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/date.c      2007-03-29 18:52:51.000000000 
+0200
@@ -27,7 +27,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: date (AT&T Research) 2006-09-08 $\n]"
+"[-?\n@(#)$Id: date (AT&T Research) 2007-03-28 $\n]"
 USAGE_LICENSE
 "[+NAME?date - set/list/convert dates]"
 "[+DESCRIPTION?\bdate\b sets the current date and time (with appropriate"
@@ -169,6 +169,8 @@
 "}"
 "[s:show?Show the date without setting the system time.]"
 "[u:utc|gmt|zulu?Output dates in \acoordinated universal time\a (UTC).]"
+"[U:unelapsed?Interpret each argument as \bfmtelapsed\b(3) elapsed"
+"      time and list the \bstrelapsed\b(3) 1/\ascale\a seconds.]#[scale]"
 "[z:list-zones?List the known time zone table and exit. The table columns"
 "      are: country code, standard zone name, savings time zone name,"
 "      minutes west of \bUTC\b, and savings time minutes offset. Blank"
@@ -268,6 +270,7 @@
        register char*  s;
        register Fmt_t* f;
        char*           t;
+       unsigned long   u;
        Time_t          now;
        Time_t          ts;
        Time_t          te;
@@ -287,8 +290,8 @@
        Tm_zone_t*      listzones = 0;  /* known time zone table        */
        int             network = 0;    /* don't set network time       */
        int             show = 0;       /* show date and don't set      */
+       int             unelapsed = 0;  /* fmtelapsed() => strelapsed   */
 
-       NoP(argc);
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
        setlocale(LC_ALL, "");
        tm_info.flags = TM_DATESTYLE;
@@ -342,6 +345,9 @@
                case 'u':
                        tm_info.flags |= TM_UTC;
                        continue;
+               case 'U':
+                       unelapsed = (int)opt_info.num;
+                       continue;
                case 'z':
                        listzones = tm_data.zone;
                        continue;
@@ -390,6 +396,17 @@
                sfputr(sfstdout, fmtelapsed((unsigned long)tmxsec(e), 1), '\n');
                show = 1;
        }
+       else if (unelapsed)
+       {
+               while (s = *argv++)
+               {
+                       u = strelapsed(s, &t, unelapsed);
+                       if (*t)
+                               error(3, "%s: invalid elapsed time", s);
+                       sfprintf(sfstdout, "%lu\n", u);
+               }
+               show = 1;
+       }
        else if (filetime)
        {
                if (!*argv)
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/getconf.c 
ksh93_2007_03_28/src/lib/libcmd/getconf.c
--- ksh93_2007_01_11/src/lib/libcmd/getconf.c   2006-11-14 22:36:15.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/getconf.c   2007-02-07 21:08:17.000000000 
+0100
@@ -27,7 +27,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: getconf (AT&T Research) 2006-11-11 $\n]"
+"[-?\n@(#)$Id: getconf (AT&T Research) 2007-02-07 $\n]"
 USAGE_LICENSE
 "[+NAME?getconf - get configuration values]"
 "[+DESCRIPTION?\bgetconf\b displays the system configuration value for"
@@ -117,6 +117,7 @@
 
 #include <cmd.h>
 #include <proc.h>
+#include <ls.h>
 
 typedef struct Path_s
 {
@@ -134,15 +135,22 @@
        register char*          t;
        char*                   pattern;
        char*                   native;
+       char*                   cmd;
        Path_t*                 e;
        Path_t*                 p;
        int                     flags;
        int                     n;
+       int                     i;
+       int                     m;
+       int                     q;
        char**                  oargv;
-       char                    cmd[PATH_MAX];
+       char                    buf[PATH_MAX];
        Path_t                  std[64];
+       struct stat             st0;
+       struct stat             st1;
 
        static const char       empty[] = "-";
+       static const Path_t     equiv[] = { { "/bin", 4 }, { "/usr/bin", 8 } };
 
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
        oargv = argv;
@@ -268,19 +276,53 @@
  defer:
 
        /*
+        * defer to argv[0] if absolute and it exists
+        */
+
+       if ((cmd = oargv[0]) && *cmd == '/' && !access(cmd, X_OK))
+               goto found;
+
+       /*
         * defer to the first getconf on $PATH that is also on the standard PATH
         */
 
        e = std;
        s = astconf("PATH", NiL, NiL); 
+       q = !stat(equiv[0].path, &st0) && !stat(equiv[1].path, &st1) && 
st0.st_ino == st1.st_ino && st0.st_dev == st1.st_dev;
+       m = 0;
        do
        {
                for (t = s; *s && *s != ':'; s++);
                if ((n = s - t) && *t == '/')
                {
-                       e->path = t;
-                       e->len = n;
-                       e++;
+                       if (q)
+                               for (i = 0; i < 2; i++)
+                                       if (n == equiv[i].len && !strncmp(t, 
equiv[i].path, n))
+                                       {
+                                               if (m & (i+1))
+                                                       t = 0;
+                                               else
+                                               {
+                                                       m |= (i+1);
+                                                       if (!(m & (!i+1)))
+                                                       {
+                                                               m |= (!i+1);
+                                                               e->path = t;
+                                                               e->len = n;
+                                                               e++;
+                                                               if (e >= 
&std[elementsof(std)])
+                                                                       break;
+                                                               t = 
equiv[!i].path;
+                                                               n = 
equiv[!i].len;
+                                                       }
+                                               }
+                                       }
+                       if (t)
+                       {
+                               e->path = t;
+                               e->len = n;
+                               e++;
+                       }
                }
                while (*s == ':')
                        s++;
@@ -303,9 +345,12 @@
                                for (p = std; p < e; p++)
                                        if (p->len == n && !strncmp(t, p->path, 
n))
                                        {
-                                               sfsprintf(cmd, sizeof(cmd), 
"%-*.*s/%s", n, n, t, error_info.id);
-                                               if (!access(cmd, X_OK))
+                                               sfsprintf(buf, sizeof(buf), 
"%-*.*s/%s", n, n, t, error_info.id);
+                                               if (!access(buf, X_OK))
+                                               {
+                                                       cmd = buf;
                                                        goto found;
+                                               }
                                        }
                        }
                        while (*s == ':')
@@ -318,9 +363,12 @@
 
        for (p = std; p < e; p++)
        {
-               sfsprintf(cmd, sizeof(cmd), "%-*.*s/%s", p->len, p->len, 
p->path, error_info.id);
-               if (!access(cmd, X_OK))
+               sfsprintf(buf, sizeof(buf), "%-*.*s/%s", p->len, p->len, 
p->path, error_info.id);
+               if (!access(buf, X_OK))
+               {
+                       cmd = buf;
                        goto found;
+               }
        }
 
        /*
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/Makefile 
ksh93_2007_03_28/src/lib/libcmd/Makefile
--- ksh93_2007_01_11/src/lib/libcmd/Makefile    2006-11-01 21:25:14.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/Makefile    2007-02-26 17:32:20.000000000 
+0100
@@ -15,19 +15,24 @@
 
 cmd 1.2 :LIBRARY: RELEASE cmdinit.c \
        cmd.h rev.h wc.h \
-       basename.c cat.c chgrp.c chmod.c chown.c cmp.c comm.c \
-       cp.c cut.c dirname.c date.c expr.c fds.c fmt.c fold.c \
-       getconf.c head.c id.c join.c ln.c logname.c mkdir.c \
-       mkfifo.c mv.c paste.c pathchk.c rev.c rm.c rmdir.c \
-       stty.c sync.c tail.c tee.c tty.c uname.c uniq.c wc.c \
-       revlib.c wclib.c \
+       basename.c cat.c chgrp.c chmod.c chown.c cksum.c cmp.c \
+       comm.c cp.c cut.c dirname.c date.c expr.c fds.c fmt.c \
+       fold.c getconf.c head.c id.c join.c ln.c logname.c md5sum.c \
+       mkdir.c mkfifo.c mv.c paste.c pathchk.c rev.c rm.c rmdir.c \
+       stty.c sum.c sync.c tail.c tee.c tty.c uname.c uniq.c wc.c \
+       revlib.c wclib.c sumlib.o \
        -lfsg
 
+sumlib.o : +lsum
+       $(AR) x $(*:O=1) $(<)
+
 $(INCLUDEDIR) :INSTALLPROTO: cmd.h cmdext.h cmdlist.h
 
 "win32*" :NOOPTIMIZE: id.c
 
-cmdext.h : $(*$(*$(*cmd)):N=*.c)
+src = $(*$(*$(*cmd)):N=*.c)
+
+cmdext.h : (src) $$(--mam:+$$(src))
        {
        cat <<!
        $("#")pragma prototyped
@@ -37,11 +42,11 @@
        
        !
        $(SED) \
-               -e '/^b_[a-z_]*(/!d' \
+               -e '/^b_[a-z_][a-z_0-9]*(/!d' \
                -e 's/^b_//' \
                -e 's/(.*//' \
                -e 's/.*/extern int     b_&(int, char**, void*);/' \
-               $(*) |
+               $($(~:O=1):T=F) |
        $(SORT) -u
        } > 1.$(tmp).h
        if      $(CMP) $(CMPFLAGS) 1.$(tmp).h $(<)
@@ -49,7 +54,7 @@
        else    $(MV) 1.$(tmp).h $(<)
        fi
 
-cmdlist.h : $(*$(*$(*cmd)):N=*.c)
+cmdlist.h : (src)
        {
        cat <<!
        $("#")pragma prototyped
@@ -59,11 +64,11 @@
        
        !
        $(SED) \
-               -e '/^b_[a-z_]*(/!d' \
+               -e '/^b_[a-z_][a-z_0-9]*(/!d' \
                -e 's/^b_//' \
                -e 's/(.*//' \
                -e 's/.*/CMDLIST(&)/' \
-               $(*) |
+               $($(~):T=F) |
        $(SORT) -u
        } > 1.$(tmp).h
        if      $(CMP) $(CMPFLAGS) 1.$(tmp).h $(<)
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/Mamfile 
ksh93_2007_03_28/src/lib/libcmd/Mamfile
--- ksh93_2007_01_11/src/lib/libcmd/Mamfile     2007-01-12 10:54:52.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/Mamfile     2007-03-29 19:07:13.000000000 
+0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-01-11
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
@@ -156,16 +156,9 @@
 make chown.c
 prev cmd.h implicit
 done chown.c
-make cmp.c
-prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
-prev cmd.h implicit
-done cmp.c
-make comm.c
-prev cmd.h implicit
-done comm.c
-make cp.c
-make ${PACKAGE_ast_INCLUDE}/tmx.h implicit
-make ${PACKAGE_ast_INCLUDE}/tv.h implicit
+make cksum.c
+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
@@ -183,6 +176,30 @@
 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
+prev ${PACKAGE_ast_INCLUDE}/fts.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
+make ${PACKAGE_ast_INCLUDE}/sum.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/sum.h
+prev cmd.h implicit
+done cksum.c
+make cmp.c
+prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
+prev cmd.h implicit
+done cmp.c
+make comm.c
+prev cmd.h implicit
+done comm.c
+make cp.c
+make ${PACKAGE_ast_INCLUDE}/tmx.h implicit
+make ${PACKAGE_ast_INCLUDE}/tv.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done ${PACKAGE_ast_INCLUDE}/tv.h dontcare
 make ${PACKAGE_ast_INCLUDE}/tm.h implicit
 make ${PACKAGE_ast_INCLUDE}/times.h implicit
@@ -250,6 +267,7 @@
 prev cmd.h implicit
 done fold.c
 make getconf.c
+prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
 prev ${PACKAGE_ast_INCLUDE}/proc.h implicit
 prev cmd.h implicit
 done getconf.c
@@ -288,6 +306,9 @@
 make logname.c
 prev cmd.h implicit
 done logname.c
+make md5sum.c
+prev cmd.h implicit
+done md5sum.c
 make mkdir.c
 prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
 prev cmd.h implicit
@@ -331,6 +352,9 @@
 done ${PACKAGE_ast_INCLUDE}/ccode.h
 prev cmd.h implicit
 done stty.c
+make sum.c
+prev cmd.h implicit
+done sum.c
 make sync.c
 prev ${PACKAGE_ast_INCLUDE}/ls.h implicit
 prev cmd.h implicit
@@ -376,9 +400,9 @@
 prev cmd.h implicit
 done revlib.c
 make wclib.c
+prev ${PACKAGE_ast_INCLUDE}/endian.h implicit
 make ${PACKAGE_ast_INCLUDE}/wchar.h implicit
 make ${PACKAGE_ast_INCLUDE}/ast_wchar.h implicit
-prev ${PACKAGE_ast_INCLUDE}/endian.h implicit
 prev ${PACKAGE_ast_INCLUDE}/stdio.h implicit
 prev ${PACKAGE_ast_INCLUDE}/stdio.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
@@ -396,11 +420,11 @@
 exec -
 exec - !
 exec - sed \
-exec -         -e '/^b_[a-z_]*(/!d' \
+exec -         -e '/^b_[a-z_][a-z_0-9]*(/!d' \
 exec -         -e 's/^b_//' \
 exec -         -e 's/(.*//' \
 exec -         -e 's/.*/extern int     b_&(int, char**, void*);/' \
-exec -         cmdinit.c basename.c cat.c chgrp.c chmod.c chown.c cmp.c comm.c 
cp.c cut.c dirname.c date.c expr.c fds.c fmt.c fold.c getconf.c head.c id.c 
join.c ln.c logname.c mkdir.c mkfifo.c mv.c paste.c pathchk.c rev.c rm.c 
rmdir.c stty.c sync.c tail.c tee.c tty.c uname.c uniq.c wc.c revlib.c wclib.c |
+exec -         cmdinit.c basename.c cat.c chgrp.c chmod.c chown.c cksum.c 
cmp.c comm.c cp.c cut.c dirname.c date.c expr.c fds.c fmt.c fold.c getconf.c 
head.c id.c join.c ln.c logname.c md5sum.c mkdir.c mkfifo.c mv.c paste.c 
pathchk.c rev.c rm.c rmdir.c stty.c sum.c sync.c tail.c tee.c tty.c uname.c 
uniq.c wc.c revlib.c wclib.c |
 exec - sort -u
 exec - } > 1.${COTEMP}.h
 exec - if      cmp 2>/dev/null -s 1.${COTEMP}.h cmdext.h
@@ -412,14 +436,7 @@
 prev ${PACKAGE_ast_INCLUDE}/stk.h implicit
 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}/error.h implicit
 prev ${PACKAGE_ast_INCLUDE}/ast.h implicit
 done cmd.h
 done cmdinit.c
@@ -457,6 +474,12 @@
 prev chown.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-D_BLD_cmd -D_PACKAGE_ast -c chown.c
 done chown.o generated
+make cksum.o
+prev cksum.c
+meta cksum.o %.c>%.o cksum.c cksum
+prev cksum.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-DERROR_CATALOG=\""libcmd"\" -D_PACKAGE_ast -D_BLD_cmd 
-DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf at 
research.att.com>][-author?David Korn <dgk at 
research.att.com>][-copyright?Copyright (c) 1992-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libcmd]"\";
 -c cksum.c
+done cksum.o generated
 make cmp.o
 prev cmp.c
 meta cmp.o %.c>%.o cmp.c cmp
@@ -553,6 +576,12 @@
 prev logname.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-DERROR_CATALOG=\""libcmd"\" -D_BLD_cmd -D_PACKAGE_ast 
-DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf at 
research.att.com>][-author?David Korn <dgk at 
research.att.com>][-copyright?Copyright (c) 1992-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libcmd]"\";
 -c logname.c
 done logname.o generated
+make md5sum.o
+prev md5sum.c
+meta md5sum.o %.c>%.o md5sum.c md5sum
+prev md5sum.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-D_BLD_cmd -D_PACKAGE_ast -c md5sum.c
+done md5sum.o generated
 make mkdir.o
 prev mkdir.c
 meta mkdir.o %.c>%.o mkdir.c mkdir
@@ -607,6 +636,12 @@
 prev stty.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-DERROR_CATALOG=\""libcmd"\" -D_PACKAGE_ast -D_BLD_cmd 
-DUSAGE_LICENSE=\""[-author?Glenn Fowler <gsf at 
research.att.com>][-author?David Korn <dgk at 
research.att.com>][-copyright?Copyright (c) 1992-2007 AT&T Knowledge 
Ventures][-license?http://www.opensource.org/licenses/cpl1.0.txt][--catalog?libcmd]"\";
 -c stty.c
 done stty.o generated
+make sum.o
+prev sum.c
+meta sum.o %.c>%.o sum.c sum
+prev sum.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-D_BLD_cmd -D_PACKAGE_ast -c sum.c
+done sum.o generated
 make sync.o
 prev sync.c
 meta sync.o %.c>%.o sync.c sync
@@ -661,8 +696,12 @@
 prev wclib.c
 exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -D_BLD_cmd -c wclib.c
 done wclib.o generated
-exec - ${AR} cr libcmd.a cmdinit.o basename.o cat.o chgrp.o chmod.o chown.o 
cmp.o comm.o cp.o cut.o dirname.o date.o expr.o fds.o fmt.o fold.o getconf.o 
head.o id.o join.o ln.o logname.o mkdir.o mkfifo.o mv.o paste.o pathchk.o rev.o 
rm.o rmdir.o
-exec - ${AR} cr libcmd.a stty.o sync.o tail.o tee.o tty.o uname.o uniq.o wc.o 
revlib.o wclib.o
+make sumlib.o
+bind -lsum
+exec - ${AR} x ${mam_libsum} sumlib.o
+done sumlib.o generated
+exec - ${AR} cr libcmd.a cmdinit.o basename.o cat.o chgrp.o chmod.o chown.o 
cksum.o cmp.o comm.o cp.o cut.o dirname.o date.o expr.o fds.o fmt.o fold.o 
getconf.o head.o id.o join.o ln.o logname.o md5sum.o mkdir.o mkfifo.o mv.o 
paste.o pathchk.o rev.o
+exec - ${AR} cr libcmd.a rm.o rmdir.o stty.o sum.o sync.o tail.o tee.o tty.o 
uname.o uniq.o wc.o revlib.o wclib.o sumlib.o
 exec - (ranlib libcmd.a) >/dev/null 2>&1 || true
 done libcmd.a generated
 done cmd virtual
@@ -712,46 +751,6 @@
 done ${PACKAGE_ast_INCLUDE}/cmdext.h generated
 make ${PACKAGE_ast_INCLUDE}/cmdlist.h
 make cmdlist.h
-prev cmdinit.c
-prev basename.c
-prev cat.c
-prev chgrp.c
-prev chmod.c
-prev chown.c
-prev cmp.c
-prev comm.c
-prev cp.c
-prev cut.c
-prev dirname.c
-prev date.c
-prev expr.c
-prev fds.c
-prev fmt.c
-prev fold.c
-prev getconf.c
-prev head.c
-prev id.c
-prev join.c
-prev ln.c
-prev logname.c
-prev mkdir.c
-prev mkfifo.c
-prev mv.c
-prev paste.c
-prev pathchk.c
-prev rev.c
-prev rm.c
-prev rmdir.c
-prev stty.c
-prev sync.c
-prev tail.c
-prev tee.c
-prev tty.c
-prev uname.c
-prev uniq.c
-prev wc.c
-prev revlib.c
-prev wclib.c
 exec - {
 exec - cat <<!
 exec - #pragma prototyped
@@ -761,11 +760,11 @@
 exec -
 exec - !
 exec - sed \
-exec -         -e '/^b_[a-z_]*(/!d' \
+exec -         -e '/^b_[a-z_][a-z_0-9]*(/!d' \
 exec -         -e 's/^b_//' \
 exec -         -e 's/(.*//' \
 exec -         -e 's/.*/CMDLIST(&)/' \
-exec -         cmdinit.c basename.c cat.c chgrp.c chmod.c chown.c cmp.c comm.c 
cp.c cut.c dirname.c date.c expr.c fds.c fmt.c fold.c getconf.c head.c id.c 
join.c ln.c logname.c mkdir.c mkfifo.c mv.c paste.c pathchk.c rev.c rm.c 
rmdir.c stty.c sync.c tail.c tee.c tty.c uname.c uniq.c wc.c revlib.c wclib.c |
+exec -         cmdinit.c basename.c cat.c chgrp.c chmod.c chown.c cksum.c 
cmp.c comm.c cp.c cut.c dirname.c date.c expr.c fds.c fmt.c fold.c getconf.c 
head.c id.c join.c ln.c logname.c md5sum.c mkdir.c mkfifo.c mv.c paste.c 
pathchk.c rev.c rm.c rmdir.c stty.c sum.c sync.c tail.c tee.c tty.c uname.c 
uniq.c wc.c revlib.c wclib.c |
 exec - sort -u
 exec - } > 1.${COTEMP}.h
 exec - if      cmp 2>/dev/null -s 1.${COTEMP}.h cmdlist.h
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/md5sum.c 
ksh93_2007_03_28/src/lib/libcmd/md5sum.c
--- ksh93_2007_01_11/src/lib/libcmd/md5sum.c    1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/md5sum.c    2007-02-07 21:55:50.000000000 
+0100
@@ -0,0 +1,35 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1992-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>                   *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * md5sum -- implemented by cksum
+ */
+
+#include <cmd.h>
+
+int
+b_md5sum(int argc, register char** argv, void* context)
+{
+       return b_cksum(argc, argv, context);
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/RELEASE 
ksh93_2007_03_28/src/lib/libcmd/RELEASE
--- ksh93_2007_01_11/src/lib/libcmd/RELEASE     2007-01-03 22:39:38.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/RELEASE     2007-03-29 18:54:35.000000000 
+0200
@@ -1,3 +1,15 @@
+07-03-28 date.c: add --unelepsed=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)
+07-02-24 Makefile: tweak cmdext.h action for --mam bootstrap
+07-02-09 Makefile: { cmdext.h cmdlist.h } depend on *.c list!
+07-02-09 Makefile: +lsum to bring in static -lsum (no dynamic right now)
+07-02-07 cksum.c: move from src/cmd/std with ftwalk => fts
+07-02-07 getconf.c: handle /bin == /usr/bin in defer logic
+07-01-26 chmod.c: don't FTS_FOLLOW if !FTS_PHYSICAL
+07-01-23 cut.c: Cut_t variable dimension list[] must be last member
+07-01-22 uname.c: fix -h typo that clobbered astconf() state -- ouch
 07-01-02 fmt.c: fix buffer splice off by one bug -- what else
 06-11-23 cmd.h: because of proto cmdinit cannot be a function like macro
 06-11-21 cp.c: fix 06-10-31 const dot[] readonly assignment
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/sum.c 
ksh93_2007_03_28/src/lib/libcmd/sum.c
--- ksh93_2007_01_11/src/lib/libcmd/sum.c       1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/sum.c       2007-02-09 20:21:37.000000000 
+0100
@@ -0,0 +1,35 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1992-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>                   *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * sum -- implemented by cksum
+ */
+
+#include <cmd.h>
+
+int
+b_sum(int argc, register char** argv, void* context)
+{
+       return b_cksum(argc, argv, context);
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/tail.c 
ksh93_2007_03_28/src/lib/libcmd/tail.c
--- ksh93_2007_01_11/src/lib/libcmd/tail.c      2006-11-01 21:25:35.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/tail.c      2007-02-14 18:59:50.000000000 
+0100
@@ -303,10 +303,10 @@
  * convert number with validity diagnostics
  */
 
-static _ast_intmax_t
+static intmax_t
 num(register const char* s, char** e, int* f, int o)
 {
-       _ast_intmax_t   number;
+       intmax_t        number;
        char*           t;
        int             c;
 
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/tty.c 
ksh93_2007_03_28/src/lib/libcmd/tty.c
--- ksh93_2007_01_11/src/lib/libcmd/tty.c       2006-11-01 21:17:23.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/tty.c       2007-03-11 19:18:53.000000000 
+0100
@@ -27,14 +27,17 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: tty (AT&T Research) 1999-04-10 $\n]"
+"[-?\n@(#)$Id: tty (AT&T Research) 2007-03-11 $\n]"
 USAGE_LICENSE
 "[+NAME?tty - write the name of the terminal to standard output]"
 "[+DESCRIPTION?\btty\b writes the name of the terminal that is connected "
-       "to standard input onto standard output.  If standard input is not "
+       "to standard input onto standard output.  If the standard input is not "
        "a terminal, \"\bnot a tty\b\" will be written to standard output.]"
-"[s:silent|quiet?Don't write anything, just return exit status.  This option "
-       "is obsolete.]"
+"[l:line-number?Write the synchronous line number of the terminal on a "
+       "separate line following the terminal name line. If the standard "
+       "input is not a synchronous  terminal then "
+       "\"\bnot on an active synchronous line\b\" is written.]"
+"[s:silent|quiet?Disable the terminal name line. Use \b[[ -t 0 ]]]]\b 
instead.]"
 "[+EXIT STATUS?]{"
         "[+0?Standard input is a tty.]"
         "[+1?Standard input is not a tty.]"
@@ -46,15 +49,22 @@
 
 #include <cmd.h>
 
+#if _mac_STWLINE
+#include <sys/stermio.h>
+#endif
+
 int
 b_tty(int argc, char *argv[], void* context)
 {
-       register int n,sflag=0;
+       register int n,sflag=0,lflag=0;
        register char *tty;
 
        cmdinit(argc, argv, context, ERROR_CATALOG, 0);
        while (n = optget(argv, usage)) switch (n)
        {
+       case 'l':
+               lflag++;
+               break;
        case 's':
                sflag++;
                break;
@@ -69,11 +79,16 @@
                error(ERROR_usage(2), "%s", optusage(NiL));
        if(!(tty=ttyname(0)))
        {
-               tty = "not a tty";
+               tty = ERROR_translate(0, 0, 0, "not a tty");
                error_info.errors++;
        }
        if(!sflag)
                sfputr(sfstdout,tty,'\n');
+#if _mac_STWLINE
+       if(lflag && (n = ioctl(0, STWLINE, 0)) >= 0)
+               error(ERROR_OUTPUT, 1, "synchronous line %d", n);
+       else
+#endif
+               error(ERROR_OUTPUT, 1, "not on an active synchronous line");
        return(error_info.errors);
 }
-
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/uname.c 
ksh93_2007_03_28/src/lib/libcmd/uname.c
--- ksh93_2007_01_11/src/lib/libcmd/uname.c     2006-11-01 21:17:27.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/uname.c     2007-01-22 21:49:20.000000000 
+0100
@@ -28,7 +28,7 @@
  */
 
 static const char usage[] =
-"[-?\n@(#)$Id: uname (AT&T Research) 2006-05-09 $\n]"
+"[-?\n@(#)$Id: uname (AT&T Research) 2007-01-22 $\n]"
 USAGE_LICENSE
 "[+NAME?uname - identify the current system ]"
 "[+DESCRIPTION?By default \buname\b writes the operating system name to"
@@ -431,7 +431,7 @@
                {
                        if (!*(s = astconf("HW_SERIAL", NiL, NiL)))
 #if _lib_gethostid
-                               sfsprintf(s, sizeof(buf), "%08x", gethostid());
+                               sfsprintf(s = buf, sizeof(buf), "%08x", 
gethostid());
 #else
                                /*NOP*/;
 #endif
diff -r -N -u ksh93_2007_01_11/src/lib/libcmd/wclib.c 
ksh93_2007_03_28/src/lib/libcmd/wclib.c
--- ksh93_2007_01_11/src/lib/libcmd/wclib.c     2006-11-01 21:17:33.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libcmd/wclib.c     2007-03-26 06:05:52.000000000 
+0200
@@ -30,14 +30,19 @@
 #include <wc.h>
 #include <ctype.h>
 
-#if _hdr_wchar
+#if _hdr_wchar && _hdr_wctype
+
 #include <wchar.h>
-#endif
+#include <wctype.h>
+
+#else
 
 #ifndef iswspace
 #define iswspace(x)    isspace(x)
 #endif
 
+#endif
+
 #define endline(c)     (((signed char)-1)<0?(c)<0:(c)==((char)-1))
 #define mbok(p,n)      
(((n)<1)?0:mbwide()?((*ast.mb_towc)(NiL,(char*)(p),n)>=0):1)
 
diff -r -N -u ksh93_2007_01_11/src/lib/libdll/Mamfile 
ksh93_2007_03_28/src/lib/libdll/Mamfile
--- ksh93_2007_01_11/src/lib/libdll/Mamfile     2007-01-12 10:54:54.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libdll/Mamfile     2007-03-29 19:07:14.000000000 
+0200
@@ -1,4 +1,4 @@
-info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-01-11
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
 setv INSTALLROOT ../../..
 setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
 setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/Makefile 
ksh93_2007_03_28/src/lib/libsum/Makefile
--- ksh93_2007_01_11/src/lib/libsum/Makefile    1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/Makefile    2007-02-07 20:21:56.000000000 
+0100
@@ -0,0 +1,11 @@
+:PACKAGE: ast
+
+LICENSE = since=1996,author=gsf
+
+CCFLAGS = $(CC.OPTIMIZE) $(CC.PIC)
+
+sum 1.0 :LIBRARY: sum.h sumlib.c
+
+$(INCLUDEDIR) :INSTALLPROTO: sum.h
+
+:: RELEASE
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/Mamfile 
ksh93_2007_03_28/src/lib/libsum/Mamfile
--- ksh93_2007_01_11/src/lib/libsum/Mamfile     1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/Mamfile     2007-03-29 19:07:14.000000000 
+0200
@@ -0,0 +1,207 @@
+info mam static 00000 1994-07-17 make (AT&T Research) 5.2 2007-03-26
+setv INSTALLROOT ../../..
+setv PACKAGE_ast_INCLUDE ${INSTALLROOT}/include/ast
+setv PACKAGE_ast_LIB ${INSTALLROOT}/lib
+setv PACKAGEROOT ../../../../..
+setv AR ar
+setv ARFLAGS cr
+setv AS as
+setv ASFLAGS
+setv CC cc
+setv mam_cc_FLAGS ${mam_cc_PIC}
+setv CCFLAGS ${-debug-symbols?1?${mam_cc_DEBUG} 
-D_BLD_DEBUG?${mam_cc_OPTIMIZE}?}
+setv CCLDFLAGS  ${-strip-symbols?1?${mam_cc_LD_STRIP}??}
+setv COTEMP $$
+setv CPIO cpio
+setv CPIOFLAGS
+setv CPP "${CC} -E"
+setv F77 f77
+setv HOSTCC ${CC}
+setv IGNORE
+setv LD ld
+setv LDFLAGS
+setv LEX lex
+setv LEXFLAGS
+setv LPR lpr
+setv LPRFLAGS
+setv M4FLAGS
+setv NMAKE nmake
+setv NMAKEFLAGS
+setv PR pr
+setv PRFLAGS
+setv SHELL /bin/sh
+setv SILENT
+setv TAR tar
+setv YACC yacc
+setv YACCFLAGS -d
+make ${PACKAGEROOT}/lib/package/ast.lic
+done ${PACKAGEROOT}/lib/package/ast.lic
+make install
+make sum
+make libsum.a archive
+make sum.req
+exec - set -
+exec - echo 'int main(){return 0;}' > 1.${COTEMP}.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS}   -c 1.${COTEMP}.c &&
+exec - x=`${CC} ${mam_cc_FLAGS} ${CCFLAGS}   ${LDFLAGS}  -o 1.${COTEMP}.x 
1.${COTEMP}.o -l'*' 2>&1 | sed -e 's/[][()+...@?]/#/g' || :` &&
+exec - {
+exec - case "" in
+exec - *?)     echo " " ;;
+exec - esac
+exec - for i in sum ast
+exec - do      case $i in
+exec -         "sum"|sum)
+exec -                 ;;
+exec -         *)      if      test ! -f ${INSTALLROOT}/lib/lib$i.a
+exec -                 then    case `{ ${CC} ${mam_cc_FLAGS} ${CCFLAGS}   
-L${INSTALLROOT}/lib ${LDFLAGS}  -o 1.${COTEMP}.x 1.${COTEMP}.o  -l$i 2>&1 || 
echo '' $x ;} | sed -e 's/[][()+...@?]/#/g' || :` in
+exec -                         *$x*)   case `{ ${CC} ${mam_cc_FLAGS} 
${CCFLAGS}   ${LDFLAGS}  -o 1.${COTEMP}.x 1.${COTEMP}.o  -l$i 2>&1 || echo '' 
$x ;} | sed -e 's/[][()+...@?]/#/g' || :` in
+exec -                                 *$x*) continue ;;
+exec -                                 esac
+exec -                                 ;;
+exec -                         esac
+exec -                 fi
+exec -                 ;;
+exec -         esac
+exec -         echo " -l$i"
+exec - done
+exec - } > sum.req
+exec - rm -f 1.${COTEMP}.*
+done sum.req generated
+make sumlib.o
+make sumlib.c
+make sum-sha2.c implicit
+make ${PACKAGE_ast_INCLUDE}/endian.h implicit
+make ${PACKAGE_ast_INCLUDE}/bytesex.h implicit
+make ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
+make ${PACKAGE_ast_INCLUDE}/ast_map.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_map.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/endian.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_common.h dontcare
+done ${PACKAGE_ast_INCLUDE}/bytesex.h dontcare
+done ${PACKAGE_ast_INCLUDE}/endian.h dontcare
+done sum-sha2.c
+make sum-sha1.c implicit
+done sum-sha1.c
+make sum-prng.c implicit
+make ${PACKAGE_ast_INCLUDE}/fnv.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
+done ${PACKAGE_ast_INCLUDE}/fnv.h
+done sum-prng.c
+make sum-md5.c implicit
+done sum-md5.c
+make sum-crc.c implicit
+done sum-crc.c
+make sum-bsd.c implicit
+done sum-bsd.c
+make sum-ast4.c implicit
+done sum-ast4.c
+make sum-att.c implicit
+done sum-att.c
+make ${PACKAGE_ast_INCLUDE}/hashpart.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/hashpart.h
+make ${PACKAGE_ast_INCLUDE}/swap.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/swap.h
+prev ${PACKAGE_ast_INCLUDE}/endian.h implicit
+make sum.h implicit
+make ${PACKAGE_ast_INCLUDE}/ast.h implicit
+make ${PACKAGE_ast_INCLUDE}/vmalloc.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
+make ${PACKAGE_ast_INCLUDE}/ast_std.h implicit
+make ${PACKAGE_ast_INCLUDE}/regex.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit
+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
+done ${PACKAGE_ast_INCLUDE}/ast_botch.h dontcare
+make ${PACKAGE_ast_INCLUDE}/ast_limits.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_limits.h dontcare
+make ${PACKAGE_ast_INCLUDE}/ast_fcntl.h implicit
+make ${PACKAGE_ast_INCLUDE}/ast_fs.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_fs.h dontcare
+done ${PACKAGE_ast_INCLUDE}/ast_fcntl.h dontcare
+make ${PACKAGE_ast_INCLUDE}/ast_getopt.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_getopt.h dontcare
+make ${PACKAGE_ast_INCLUDE}/ast_sys.h implicit
+make ${PACKAGE_ast_INCLUDE}/getopt.h implicit
+prev ${PACKAGE_ast_INCLUDE}/ast_getopt.h implicit
+prev ${PACKAGE_ast_INCLUDE}/prototyped.h implicit
+done ${PACKAGE_ast_INCLUDE}/getopt.h dontcare
+prev ${PACKAGE_ast_INCLUDE}/endian.h implicit
+prev ${PACKAGE_ast_INCLUDE}/endian.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_sys.h dontcare
+make ${PACKAGE_ast_INCLUDE}/ast_lib.h implicit
+done ${PACKAGE_ast_INCLUDE}/ast_lib.h dontcare
+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}/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}/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
+done sum.h
+done sumlib.c
+meta sumlib.o %.c>%.o sumlib.c sumlib
+prev sumlib.c
+exec - ${CC} ${mam_cc_FLAGS} ${CCFLAGS} -I. -I${PACKAGE_ast_INCLUDE} 
-D_PACKAGE_ast -c sumlib.c
+done sumlib.o generated
+exec - ${AR} cr libsum.a sumlib.o
+exec - (ranlib libsum.a) >/dev/null 2>&1 || true
+done libsum.a generated
+done sum virtual
+prev libsum.a archive
+make ${INSTALLROOT}/lib
+exec - if      silent test ! -d ${INSTALLROOT}/lib
+exec - then    mkdir -p ${INSTALLROOT}/lib
+exec - fi
+done ${INSTALLROOT}/lib generated
+make ${INSTALLROOT}/lib/libsum.a archive
+prev ${INSTALLROOT}/lib
+prev libsum.a archive
+exec - test '' = 'libsum.a' || ${STDCMP} 2>/dev/null -s libsum.a 
${INSTALLROOT}/lib/libsum.a || { ${STDMV} ${INSTALLROOT}/lib/libsum.a 
${INSTALLROOT}/lib/libsum.a.old 2>/dev/null || true; ${STDCP} libsum.a 
${INSTALLROOT}/lib/libsum.a                                  ;}
+exec - (ranlib ${INSTALLROOT}/lib/libsum.a) >/dev/null 2>&1 || true
+done ${INSTALLROOT}/lib/libsum.a generated
+make ${INSTALLROOT}/lib/lib
+exec - if      silent test ! -d ${INSTALLROOT}/lib/lib
+exec - then    mkdir -p ${INSTALLROOT}/lib/lib
+exec - fi
+done ${INSTALLROOT}/lib/lib generated
+make ${INSTALLROOT}/lib/lib/sum
+prev ${INSTALLROOT}/lib/lib
+prev sum.req
+exec - test '' = 'sum.req' || ${STDCMP} 2>/dev/null -s sum.req 
${INSTALLROOT}/lib/lib/sum || { ${STDMV} ${INSTALLROOT}/lib/lib/sum 
${INSTALLROOT}/lib/lib/sum.old 2>/dev/null || true; ${STDCP} sum.req 
${INSTALLROOT}/lib/lib/sum                                 ;}
+done ${INSTALLROOT}/lib/lib/sum generated
+make ${PACKAGE_ast_INCLUDE}
+exec - if      silent test ! -d ${PACKAGE_ast_INCLUDE}
+exec - then    mkdir -p ${PACKAGE_ast_INCLUDE}
+exec - fi
+done ${PACKAGE_ast_INCLUDE} generated
+make ${PACKAGE_ast_INCLUDE}/sum.h
+prev ${PACKAGE_ast_INCLUDE}
+prev sum.h
+exec - proto -p -s -l ${PACKAGEROOT}/lib/package/ast.lic '-o 
since=1996,author=gsf'  sum.h  > 1.${COTEMP}.x
+exec - if      cmp 2>/dev/null -s ${PACKAGE_ast_INCLUDE}/sum.h 1.${COTEMP}.x
+exec - then    rm -f 1.${COTEMP}.x
+exec - else    mv 1.${COTEMP}.x ${PACKAGE_ast_INCLUDE}/sum.h
+exec - fi
+done ${PACKAGE_ast_INCLUDE}/sum.h generated
+done install virtual
+make test
+done test dontcare virtual
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/RELEASE 
ksh93_2007_03_28/src/lib/libsum/RELEASE
--- ksh93_2007_01_11/src/lib/libsum/RELEASE     1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/RELEASE     2007-02-23 19:21:06.000000000 
+0100
@@ -0,0 +1,8 @@
+05-02-14 sumlib.c: split into sum-*.c
+        sum-sha2.c: add SHA { 256 384 512 }
+04-02-29 Makefile: compile with $(CC.PIC) for codexlib/sum $(CC.DLL)
+03-12-16 add { crc prng } generic methods and maps[] to these methods
+03-12-16 sum.h,sumlib.c: add sumdata()
+03-09-29 sumlib.c: fix FNV to use ^ instead of +
+03-04-28 sumlib.c: drop md5 `zeroize' for performance
+        sumlib.c: add FIPS 180-1 SHA-1
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-ast4.c 
ksh93_2007_03_28/src/lib/libsum/sum-ast4.c
--- ksh93_2007_01_11/src/lib/libsum/sum-ast4.c  1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-ast4.c  2007-02-23 19:08:59.000000000 
+0100
@@ -0,0 +1,120 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * ast4
+ */
+
+#define ast4_description \
+       "The \bast\b 128 bit PRNG hash generated by catenating 4 separate 32 \
+       bit PNRG hashes. The block count is not printed."
+#define ast4_options   0
+#define ast4_match     "ast4|32x4|tw"
+#define ast4_done      long_done
+#define ast4_scale     0
+
+typedef struct Ast4_sum_s
+{
+       uint32_t        sum0;
+       uint32_t        sum1;
+       uint32_t        sum2;
+       uint32_t        sum3;
+} Ast4_sum_t;
+
+typedef struct Ast4_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       Ast4_sum_t      cur;
+       Ast4_sum_t      tot;
+       unsigned char   buf[sizeof(Ast4_sum_t)];
+} Ast4_t;
+
+static int
+ast4_init(Sum_t* p)
+{
+       register Ast4_t*        a = (Ast4_t*)p;
+
+       a->tot.sum0 ^= a->cur.sum0;
+       a->cur.sum0 = 0;
+       a->tot.sum1 ^= a->cur.sum1;
+       a->cur.sum1 = 0;
+       a->tot.sum2 ^= a->cur.sum2;
+       a->cur.sum2 = 0;
+       a->tot.sum3 ^= a->cur.sum3;
+       a->cur.sum3 = 0;
+       return 0;
+}
+
+static Sum_t*
+ast4_open(const Method_t* method, const char* name)
+{
+       Ast4_t* p;
+
+       if (p = newof(0, Ast4_t, 1, 0))
+       {
+               p->method = (Method_t*)method;
+               p->name = name;
+       }
+       return (Sum_t*)p;
+}
+
+static int
+ast4_block(Sum_t* p, const void* s, size_t n)
+{
+       register Ast4_sum_t*    a = &((Ast4_t*)p)->cur;
+       register unsigned char* b = (unsigned char*)s;
+       register unsigned char* e = b + n;
+       register int            c;
+
+       while (b < e)
+       {
+               c = *b++;
+               a->sum0 = a->sum0 * 0x63c63cd9 + 0x9c39c33d + c;
+               a->sum1 = a->sum1 * 0x00000011 + 0x00017cfb + c;
+               a->sum2 = a->sum2 * 0x12345679 + 0x3ade68b1 + c;
+               a->sum3 = a->sum3 * 0xf1eac01d + 0xcafe10af + c;
+       }
+       return 0;
+}
+
+static int
+ast4_print(Sum_t* p, Sfio_t* sp, int flags)
+{
+       register Ast4_sum_t*    a;
+
+       a = (flags & SUM_TOTAL) ? &((Ast4_t*)p)->tot : &((Ast4_t*)p)->cur;
+       sfprintf(sp, "%06..64u%06..64u%06..64u%06..64u", a->sum0, a->sum1, 
a->sum2, a->sum3);
+       return 0;
+}
+
+static int
+ast4_data(Sum_t* p, Sumdata_t* data)
+{
+       data->size = sizeof(((Ast4_t*)p)->cur);
+       data->num = 0;
+#if _ast_intswap
+       swapmem(_ast_intswap, data->buf = ((Ast4_t*)p)->buf, 
&((Ast4_t*)p)->cur, sizeof(((Ast4_t*)p)->cur));
+#else
+       data->buf = &((Ast4_t*)p)->cur;
+#endif
+       return 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-att.c 
ksh93_2007_03_28/src/lib/libsum/sum-att.c
--- ksh93_2007_01_11/src/lib/libsum/sum-att.c   1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-att.c   2007-02-14 19:03:52.000000000 
+0100
@@ -0,0 +1,60 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * att
+ */
+
+#define att_description        \
+       "The system 5 release 4 checksum. This is the default for \bsum\b \
+       when \bgetconf UNIVERSE\b is \batt\b. This is the only true sum; \
+       all of the other methods are order dependent."
+#define att_options    0
+#define att_match      "att|sys5|s5|default"
+#define att_open       long_open
+#define att_init       long_init
+#define att_print      long_print
+#define att_data       long_data
+#define att_scale      512
+
+static int
+att_block(register Sum_t* p, const void* s, size_t n)
+{
+       register uint32_t       c = ((Integral_t*)p)->sum;
+       register unsigned char* b = (unsigned char*)s;
+       register unsigned char* e = b + n;
+
+       while (b < e)
+               c += *b++;
+       ((Integral_t*)p)->sum = c;
+       return 0;
+}
+
+static int
+att_done(Sum_t* p)
+{
+       register uint32_t       c = ((Integral_t*)p)->sum;
+
+       c = (c & 0xffff) + ((c >> 16) & 0xffff);
+       c = (c & 0xffff) + (c >> 16);
+       ((Integral_t*)p)->sum = c & 0xffff;
+       return short_done(p);
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-bsd.c 
ksh93_2007_03_28/src/lib/libsum/sum-bsd.c
--- ksh93_2007_01_11/src/lib/libsum/sum-bsd.c   1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-bsd.c   2007-02-14 19:04:08.000000000 
+0100
@@ -0,0 +1,48 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * bsd
+ */
+
+#define bsd_description \
+       "The BSD checksum."
+#define bsd_options    0
+#define bsd_match      "bsd|ucb"
+#define bsd_open       long_open
+#define bsd_init       long_init
+#define bsd_done       short_done
+#define bsd_print      long_print
+#define bsd_data       long_data
+#define bsd_scale      1024
+
+static int
+bsd_block(register Sum_t* p, const void* s, size_t n)
+{
+       register uint32_t       c = ((Integral_t*)p)->sum;
+       register unsigned char* b = (unsigned char*)s;
+       register unsigned char* e = b + n;
+
+       while (b < e)
+               c = ((c >> 1) + *b++ + ((c & 01) ? 0x8000 : 0)) & 0xffff;
+       ((Integral_t*)p)->sum = c;
+       return 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-crc.c 
ksh93_2007_03_28/src/lib/libsum/sum-crc.c
--- ksh93_2007_01_11/src/lib/libsum/sum-crc.c   1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-crc.c   2007-02-14 19:04:26.000000000 
+0100
@@ -0,0 +1,191 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * crc
+ */
+
+#define crc_description \
+       "32 bit CRC (cyclic redundancy check)."
+#define crc_options    "\
+[+polynomial?The 32 bit crc polynomial bitmask with implicit bit 
32.]:[mask:=0xedb88320]\
+[+done?XOR the final crc value with \anumber\a. 0xffffffff is used if 
\anumber\a is omitted.]:?[number:=0]\
+[+init?The initial crc value. 0xffffffff is used if \anumber\a is 
omitted.]:?[number:=0]\
+[+rotate?XOR each input character with the high order crc byte (instead of the 
low order).]\
+[+size?Include the total number of bytes in the crc. \anumber\a, if specified, 
is first XOR'd into the size.]:?[number:=0]\
+"
+#define crc_match      "crc"
+#define crc_open       crc_open
+#define crc_print      long_print
+#define crc_data       long_data
+#define crc_scale      0
+
+typedef uint32_t Crcnum_t;
+
+typedef struct Crc_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       _INTEGRAL_PRIVATE_
+       Crcnum_t                init;
+       Crcnum_t                done;
+       Crcnum_t                xorsize;
+       Crcnum_t                tab[256];
+       unsigned int            addsize;
+       unsigned int            rotate;
+} Crc_t;
+
+#define CRC(p,s,c)             (s = (s >> 8) ^ (p)->tab[(s ^ (c)) & 0xff])
+#define CRCROTATE(p,s,c)       (s = (s << 8) ^ (p)->tab[((s >> 24) ^ (c)) & 
0xff])
+
+static Sum_t*
+crc_open(const Method_t* method, const char* name)
+{
+       register Crc_t*         sum;
+       register const char*    s;
+       register const char*    t;
+       register const char*    v;
+       register int            i;
+       register int            j;
+       Crcnum_t                polynomial;
+       Crcnum_t                x;
+
+       if (sum = newof(0, Crc_t, 1, 0))
+       {
+               sum->method = (Method_t*)method;
+               sum->name = name;
+       }
+       polynomial = 0xedb88320;
+       s = name;
+       while (*(t = s))
+       {
+               for (t = s, v = 0; *s && *s != '-'; s++)
+                       if (*s == '=' && !v)
+                               v = s;
+               i = (v ? v : s) - t;
+               if (isdigit(*t) || v && i >= 4 && strneq(t, "poly", 4) && (t = 
v + 1))
+                       polynomial = strtoul(t, NiL, 0);
+               else if (strneq(t, "done", i))
+                       sum->done = v ? strtoul(v + 1, NiL, 0) : ~sum->done;
+               else if (strneq(t, "init", i))
+                       sum->init = v ? strtoul(v + 1, NiL, 0) : ~sum->init;
+               else if (strneq(t, "rotate", i))
+                       sum->rotate = 1;
+               else if (strneq(t, "size", i))
+               {
+                       sum->addsize = 1;
+                       if (v)
+                               sum->xorsize = strtoul(v + 1, NiL, 0);
+               }
+               if (*s == '-')
+                       s++;
+       }
+       if (sum->rotate)
+       {
+               Crcnum_t        t;
+               Crcnum_t        p[8];
+
+               p[0] = polynomial;
+               for (i = 1; i < 8; i++)
+                       p[i] = (p[i-1] << 1) ^ ((p[i-1] & 0x80000000) ? 
polynomial : 0);
+               for (i = 0; i < elementsof(sum->tab); i++)
+               {
+                       t = 0;
+                       x = i;
+                       for (j = 0; j < 8; j++)
+                       {
+                               if (x & 1)
+                                       t ^= p[j];
+                               x >>= 1;
+                       }
+                       sum->tab[i] = t;
+               }
+       }
+       else
+       {
+               for (i = 0; i < elementsof(sum->tab); i++)
+               {
+                       x = i;
+                       for (j = 0; j < 8; j++)
+                               x = (x>>1) ^ ((x & 1) ? polynomial : 0);
+                       sum->tab[i] = x;
+               }
+       }
+       return (Sum_t*)sum;
+}
+
+static int
+crc_init(Sum_t* p)
+{
+       Crc_t*          sum = (Crc_t*)p;
+
+       sum->sum = sum->init;
+       return 0;
+}
+
+static int
+crc_block(Sum_t* p, const void* s, size_t n)
+{
+       Crc_t*                  sum = (Crc_t*)p;
+       register Crcnum_t       c = sum->sum;
+       register unsigned char* b = (unsigned char*)s;
+       register unsigned char* e = b + n;
+
+       if (sum->rotate)
+               while (b < e)
+                       CRCROTATE(sum, c, *b++);
+       else
+               while (b < e)
+                       CRC(sum, c, *b++);
+       sum->sum = c;
+       return 0;
+}
+
+static int
+crc_done(Sum_t* p)
+{
+       register Crc_t*         sum = (Crc_t*)p;
+       register Crcnum_t       c;
+       register uintmax_t      n;
+       int                     i;
+       int                     j;
+
+       c = sum->sum;
+       if (sum->addsize)
+       {
+               n = sum->size ^ sum->xorsize;
+               if (sum->rotate)
+                       while (n)
+                       {
+                               CRCROTATE(sum, c, n);
+                               n >>= 8;
+                       }
+               else
+                       for (i = 0, j = 32; i < 4; i++)
+                       {
+                               j -= 8;
+                               CRC(sum, c, n >> j);
+                       }
+       }
+       sum->sum = c ^ sum->done;
+       sum->total_sum ^= (sum->sum &= 0xffffffff);
+       return 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum.h 
ksh93_2007_03_28/src/lib/libsum/sum.h
--- ksh93_2007_01_11/src/lib/libsum/sum.h       1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum.h       2007-02-14 19:02:49.000000000 
+0100
@@ -0,0 +1,64 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * checksum library interface
+ */
+
+#ifndef _SUM_H
+#define _SUM_H
+
+#include <ast.h>
+
+#define SUM_SIZE       (1<<0)          /* print size too               */
+#define SUM_SCALE      (1<<1)          /* traditional size scale       */
+#define SUM_TOTAL      (1<<2)          /* print totals since sumopen   */
+
+#define _SUM_PUBLIC_   const char*     name;
+
+typedef struct Sumdata_s
+{
+       uint32_t        size;
+       uint32_t        num;
+       void*           buf;
+} Sumdata_t;
+
+typedef struct Sum_s
+{
+       _SUM_PUBLIC_
+#ifdef _SUM_PRIVATE_
+       _SUM_PRIVATE_
+#endif
+} Sum_t;
+
+extern Sum_t*  sumopen(const char*);
+extern int     suminit(Sum_t*);
+extern int     sumblock(Sum_t*, const void*, size_t);
+extern int     sumdone(Sum_t*);
+extern int     sumdata(Sum_t*, Sumdata_t*);
+extern int     sumprint(Sum_t*, Sfio_t*, int);
+extern int     sumusage(Sfio_t*);
+extern int     sumclose(Sum_t*);
+
+#endif
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sumlib.c 
ksh93_2007_03_28/src/lib/libsum/sumlib.c
--- ksh93_2007_01_11/src/lib/libsum/sumlib.c    1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sumlib.c    2007-03-12 05:14:21.000000000 
+0100
@@ -0,0 +1,333 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * man this is sum library
+ */
+
+static const char id[] = "\n@(#)$Id: sumlib (AT&T Research) 2007-03-11 $\0\n";
+
+#define _SUM_PRIVATE_  \
+                       struct Method_s*        method; \
+                       uintmax_t               total_count;    \
+                       uintmax_t               total_size;     \
+                       uintmax_t               size;
+
+#include <sum.h>
+#include <ctype.h>
+#include <swap.h>
+#include <hashpart.h>
+
+#define SCALE(n,m)     (((n)+(m)-1)/(m))
+
+typedef struct Method_s
+{
+       const char*     match;
+       const char*     description;
+       const char*     options;
+       Sum_t*          (*open)(const struct Method_s*, const char*);
+       int             (*init)(Sum_t*);
+       int             (*block)(Sum_t*, const void*, size_t);
+       int             (*data)(Sum_t*, Sumdata_t*);
+       int             (*print)(Sum_t*, Sfio_t*, int);
+       int             (*done)(Sum_t*);
+       int             scale;
+} Method_t;
+
+typedef struct Map_s
+{
+       const char*     match;
+       const char*     description;
+       const char*     map;
+} Map_t;
+
+/*
+ * 16 and 32 bit common code
+ */
+
+#define _INTEGRAL_PRIVATE_ \
+       uint32_t        sum; \
+       uint32_t        total_sum;
+       
+typedef struct Integral_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       _INTEGRAL_PRIVATE_
+} Integral_t;
+
+static Sum_t*
+long_open(const Method_t* method, const char* name)
+{
+       Integral_t*     p;
+
+       if (p = newof(0, Integral_t, 1, 0))
+       {
+               p->method = (Method_t*)method;
+               p->name = name;
+       }
+       return (Sum_t*)p;
+}
+
+static int
+long_init(Sum_t* p)
+{
+       ((Integral_t*)p)->sum = 0;
+       return 0;
+}
+
+static int
+long_done(Sum_t* p)
+{
+       register Integral_t*    x = (Integral_t*)p;
+
+       x->total_sum ^= (x->sum &= 0xffffffff);
+       return 0;
+}
+
+static int
+short_done(Sum_t* p)
+{
+       register Integral_t*    x = (Integral_t*)p;
+
+       x->total_sum ^= (x->sum &= 0xffff);
+       return 0;
+}
+
+static int
+long_print(Sum_t* p, Sfio_t* sp, register int flags)
+{
+       register Integral_t*    x = (Integral_t*)p;
+       register uint32_t       c;
+       register uintmax_t      z;
+       register size_t         n;
+
+       c = (flags & SUM_TOTAL) ? x->total_sum : x->sum;
+       sfprintf(sp, "%I*u", sizeof(c), c);
+       if (flags & SUM_SIZE)
+       {
+               z = (flags & SUM_TOTAL) ? x->total_size : x->size;
+               if ((flags & SUM_SCALE) && (n = x->method->scale))
+                       z = SCALE(z, n);
+               sfprintf(sp, " %I*u", sizeof(z), z);
+       }
+       if (flags & SUM_TOTAL)
+               sfprintf(sp, " %I*u", sizeof(x->total_count), x->total_count);
+       return 0;
+}
+
+static int
+long_data(Sum_t* p, Sumdata_t* data)
+{
+       register Integral_t*    x = (Integral_t*)p;
+
+       data->size = sizeof(data->num);
+       data->num = x->sum;
+       data->buf = 0;
+       return 0;
+}
+
+#include "sum-att.c"
+#include "sum-ast4.c"
+#include "sum-bsd.c"
+#include "sum-crc.c"
+#include "sum-md5.c"
+#include "sum-prng.c"
+#include "sum-sha1.c"
+#include "sum-sha2.c"
+
+/*
+ * now the library interface
+ */
+
+#undef METHOD          /* solaris <sys/localedef.h>! */
+#define METHOD(x)      
x##_match,x##_description,x##_options,x##_open,x##_init,x##_block,x##_data,x##_print,x##_done,x##_scale
+
+static const Method_t  methods[] =
+{
+       METHOD(att),
+       METHOD(ast4),
+       METHOD(bsd),
+       METHOD(crc),
+       METHOD(md5),
+       METHOD(prng),
+#ifdef sha1_description
+       METHOD(sha1),
+#endif
+#ifdef sha256_description
+       METHOD(sha256),
+#endif
+#ifdef sha384_description
+       METHOD(sha384),
+#endif
+#ifdef sha512_description
+       METHOD(sha512),
+#endif
+};
+
+static const Map_t     maps[] =
+{
+       {
+               "posix|cksum|std|standard",
+               "The posix 1003.2-1992 32 bit crc checksum. This is the"
+               " default \bcksum\b(1)  method.",
+               "crc-0x04c11db7-rotate-done-size"
+       },
+       {
+               "zip",
+               "The \bzip\b(1) crc.",
+               "crc-0xedb88320-init-done"
+       },
+       {
+               "fddi",
+               "The FDDI crc.",
+               "crc-0xedb88320-size=0xcc55cc55"
+       },
+       {
+               "fnv|fnv1",
+               "The Fowler-Noll-Vo 32 bit PRNG hash with non-zero"
+               " initializer (FNV-1).",
+               "prng-0x01000193-init=0x811c9dc5"
+       },
+       {
+               "ast|strsum",
+               "The \bast\b \bstrsum\b(3) PRNG hash.",
+               "prng-0x63c63cd9-add=0x9c39c33d"
+       },
+};
+
+/*
+ * open sum method name
+ */
+
+Sum_t*
+sumopen(register const char* name)
+{
+       register int    n;
+       char            pat[256];
+
+       if (!name || !name[0] || name[0] == '-' && !name[1])
+               name = "default";
+       for (n = 0; n < elementsof(maps); n++)
+       {
+               sfsprintf(pat, sizeof(pat), "*@(%s)*", maps[n].match);
+               if (strmatch(name, pat))
+               {
+                       name = maps[n].map;
+                       break;
+               }
+       }
+       for (n = 0; n < elementsof(methods); n++)
+       {
+               sfsprintf(pat, sizeof(pat), "*@(%s)*", methods[n].match);
+               if (strmatch(name, pat))
+                       return (*methods[n].open)(&methods[n], name);
+       }
+       return 0;
+}
+
+/*
+ * initialize for a new run of blocks
+ */
+
+int
+suminit(Sum_t* p)
+{
+       p->size = 0;
+       return (*p->method->init)(p);
+}
+
+/*
+ * compute the running sum on buf
+ */
+
+int
+sumblock(Sum_t* p, const void* buf, size_t siz)
+{
+       p->size += siz;
+       return (*p->method->block)(p, buf, siz);
+}
+
+/*
+ * done with this run of blocks
+ */
+
+int
+sumdone(Sum_t* p)
+{
+       p->total_count++;
+       p->total_size += p->size;
+       return (*p->method->done)(p);
+}
+
+/*
+ * print the sum [size] on sp
+ */
+
+int
+sumprint(Sum_t* p, Sfio_t* sp, int flags)
+{
+       return (*p->method->print)(p, sp, flags);
+}
+
+/*
+ * return the current sum (internal) data
+ */
+
+int
+sumdata(Sum_t* p, Sumdata_t* d)
+{
+       return (*p->method->data)(p, d);
+}
+
+/*
+ * close an open sum handle
+ */
+
+int
+sumclose(Sum_t* p)
+{
+       free(p);
+       return 0;
+}
+
+/*
+ * print the checksum method optget(3) usage on sp and return the length
+ */
+
+int
+sumusage(Sfio_t* sp)
+{
+       register int    i;
+       register int    n;
+
+       for (i = n = 0; i < elementsof(methods); i++)
+       {
+               n += sfprintf(sp, "[+%s?%s]", methods[i].match, 
methods[i].description);
+               if (methods[i].options)
+                       n += sfprintf(sp, "{\n%s\n}", methods[i].options);
+       }
+       for (i = 0; i < elementsof(maps); i++)
+               n += sfprintf(sp, "[+%s?%s Shorthand for \b%s\b.]", 
maps[i].match, maps[i].description, maps[i].map);
+       return n;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-md5.c 
ksh93_2007_03_28/src/lib/libsum/sum-md5.c
--- ksh93_2007_01_11/src/lib/libsum/sum-md5.c   1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-md5.c   2007-02-23 19:09:12.000000000 
+0100
@@ -0,0 +1,374 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * md5
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+   rights reserved.
+
+   License to copy and use this software is granted provided that it
+   is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+   Method" in all material mentioning or referencing this software
+   or this function.
+
+   License is also granted to make and use derivative works provided
+   that such works are identified as "derived from the RSA Data
+   Security, Inc. MD5 Message-Digest Method" in all material
+   mentioning or referencing the derived work.
+
+   RSA Data Security, Inc. makes no representations concerning either
+   the merchantability of this software or the suitability of this
+   software for any particular purpose. It is provided "as is"
+   without express or implied warranty of any kind.
+
+   These notices must be retained in any copies of any part of this
+   documentation and/or software.
+ */
+
+#define md5_description \
+       "The RSA Data Security, Inc. MD5 Message-Digest Method, 1991-2, \
+       used with permission. The block count is not printed."
+#define md5_options    "[+(version)?md5 (RSA Data Security, Inc. MD5 
Message-Digest, 1991-2) 1996-02-29]"
+#define md5_match      "md5|MD5"
+#define md5_scale      0
+
+typedef uint32_t UINT4;
+
+typedef struct Md5_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       UINT4           state[4];       /* state (ABCD)                 */
+       UINT4           count[2];       /* # bits handled mod 2^64 (lsb)*/
+       unsigned char   buffer[64];     /* input buffer                 */
+       unsigned char   digest[16];     /* final digest                 */
+       unsigned char   digest_sum[16]; /* sum of all digests           */
+} Md5_t;
+
+static unsigned char   md5_pad[] =
+{
+       0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/*
+ * encode input into output
+ * len must be a multiple of 4
+ */
+
+static void
+md5_encode(register unsigned char* output, register UINT4* input, unsigned int 
len)
+{
+       register unsigned int   i;
+       register unsigned int   j;
+
+       for (i = j = 0; j < len; i++, j += 4)
+       {
+               output[j] = (unsigned char)(input[i] & 0xff);
+               output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
+               output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
+               output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
+       }
+}
+
+/*
+ * decode input into output
+ * len must be a multiple of 4
+ */
+
+static void
+md5_decode(register UINT4* output, register unsigned char* input, unsigned int 
len)
+{
+       unsigned int    i;
+       unsigned int    j;
+
+       for (i = j = 0; j < len; i++, j += 4)
+               output[i] = ((UINT4)input[j]) |
+                           (((UINT4)input[j+1]) << 8) |
+                           (((UINT4)input[j+2]) << 16) |
+                           (((UINT4)input[j+3]) << 24);
+}
+
+static int
+md5_init(Sum_t* p)
+{
+       register Md5_t* context = (Md5_t*)p;
+
+       context->count[0] = context->count[1] = 0;
+       context->state[0] = 0x67452301;
+       context->state[1] = 0xefcdab89;
+       context->state[2] = 0x98badcfe;
+       context->state[3] = 0x10325476;
+       return 0;
+}
+
+static Sum_t*
+md5_open(const Method_t* method, const char* name)
+{
+       Md5_t*  p;
+
+       if (p = newof(0, Md5_t, 1, 0))
+       {
+               p->method = (Method_t*)method;
+               p->name = name;
+               md5_init((Sum_t*)p);
+       }
+       return (Sum_t*)p;
+}
+
+/*
+ * basic MD5 step -- transforms buf based on in
+ */
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+/* F, G, H and I are basic MD5 functions */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
+/* Rotation is separate from addition to prevent recomputation */
+#define FF(a, b, c, d, x, s, ac) { \
+    (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
+    (a) = ROTATE_LEFT ((a), (s)); \
+    (a) += (b); \
+  }
+#define GG(a, b, c, d, x, s, ac) { \
+    (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
+    (a) = ROTATE_LEFT ((a), (s)); \
+    (a) += (b); \
+  }
+#define HH(a, b, c, d, x, s, ac) { \
+    (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
+    (a) = ROTATE_LEFT ((a), (s)); \
+    (a) += (b); \
+  }
+#define II(a, b, c, d, x, s, ac) { \
+    (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
+    (a) = ROTATE_LEFT ((a), (s)); \
+    (a) += (b); \
+  }
+
+static void
+md5_transform(UINT4 state[4], unsigned char block[64])
+{
+       UINT4   a = state[0];
+       UINT4   b = state[1];
+       UINT4   c = state[2];
+       UINT4   d = state[3];
+       UINT4   x[16];
+
+       md5_decode(x, block, 64);
+
+       /* round 1 */
+       FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
+       FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
+       FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
+       FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
+       FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
+       FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
+       FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
+       FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
+       FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
+       FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
+       FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+       FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+       FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+       FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+       FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+       FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+       /* round 2 */
+       GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
+       GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
+       GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+       GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
+       GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
+       GG (d, a, b, c, x[10], S22, 0x02441453); /* 22 */
+       GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+       GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
+       GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
+       GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+       GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
+       GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
+       GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+       GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
+       GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
+       GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+       /* round 3 */
+       HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
+       HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
+       HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+       HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+       HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
+       HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
+       HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
+       HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+       HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+       HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
+       HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
+       HH (b, c, d, a, x[ 6], S34, 0x04881d05); /* 44 */
+       HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
+       HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+       HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+       HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
+
+       /* round 4 */
+       II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
+       II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
+       II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+       II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
+       II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+       II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
+       II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+       II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
+       II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
+       II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+       II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
+       II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+       II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
+       II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+       II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
+       II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
+
+       state[0] += a;
+       state[1] += b;
+       state[2] += c;
+       state[3] += d;
+}
+
+static int
+md5_block(Sum_t* p, const void* s, size_t inputLen)
+{
+       register Md5_t* context = (Md5_t*)p;
+       unsigned char*  input = (unsigned char*)s;
+       unsigned int    i;
+       unsigned int    index;
+       unsigned int    partLen;
+
+       /* compute number of bytes mod 64 */
+       index = (unsigned int)((context->count[0] >> 3) & 0x3f);
+
+       /* update number of bits */
+       if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 
3))
+               context->count[1]++;
+       context->count[1] += ((UINT4)inputLen >> 29);
+       partLen = 64 - index;
+
+       /* transform as many times as possible */
+       if (inputLen >= partLen)
+       {
+               memcpy(&context->buffer[index], input, partLen);
+               md5_transform(context->state, context->buffer);
+               for (i = partLen; i + 63 < inputLen; i += 64)
+                       md5_transform(context->state, &input[i]);
+               index = 0;
+       }
+       else
+               i = 0;
+
+       /* buffer remaining input */
+       memcpy(&context->buffer[index], &input[i], inputLen - i);
+
+       return 0;
+}
+
+static int
+md5_done(Sum_t* p)
+{
+       register Md5_t* context = (Md5_t*)p;
+       unsigned char   bits[8];
+       unsigned int    index;
+       unsigned int    padLen;
+
+       /* save number of bits */
+       md5_encode(bits, context->count, sizeof(bits));
+
+       /* pad out to 56 mod 64 */
+       index = (unsigned int)((context->count[0] >> 3) & 0x3f);
+       padLen = (index < 56) ? (56 - index) : (120 - index);
+       md5_block(p, md5_pad, padLen);
+
+       /* append length (before padding) */
+       md5_block(p, bits, sizeof(bits));
+
+       /* store state in digest */
+       md5_encode(context->digest, context->state, sizeof(context->digest));
+
+       /* accumulate the digests */
+       for (index = 0; index < elementsof(context->digest); index++)
+               context->digest_sum[index] ^= context->digest[index];
+
+       return 0;
+}
+
+static int
+md5_print(Sum_t* p, Sfio_t* sp, register int flags)
+{
+       register Md5_t*         x = (Md5_t*)p;
+       register unsigned char* d;
+       register int            n;
+
+       d = (flags & SUM_TOTAL) ? x->digest_sum : x->digest;
+       for (n = 0; n < elementsof(x->digest); n++)
+               sfprintf(sp, "%02x", d[n]);
+       return 0;
+}
+
+static int
+md5_data(Sum_t* p, Sumdata_t* data)
+{
+       register Md5_t*         x = (Md5_t*)p;
+
+       data->size = elementsof(x->digest);
+       data->num = 0;
+       data->buf = x->digest;
+       return 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-prng.c 
ksh93_2007_03_28/src/lib/libsum/sum-prng.c
--- ksh93_2007_01_11/src/lib/libsum/sum-prng.c  1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-prng.c  2007-02-14 19:04:42.000000000 
+0100
@@ -0,0 +1,113 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * prng
+ */
+
+#include <fnv.h>
+
+#define prng_description \
+       "32 bit PRNG (pseudo random number generator) hash."
+#define prng_options   "\
+[+mpy?The 32 bit PRNG multiplier.]:[number:=0x01000193]\
+[+add?The 32 bit PRNG addend.]:[number:=0]\
+[+init?The PRNG initial value. 0xffffffff is used if \anumber\a is 
omitted.]:?[number:=0x811c9dc5]\
+"
+#define prng_match     "prng"
+#define prng_done      long_done
+#define prng_print     long_print
+#define prng_data      long_data
+#define prng_scale     0
+
+typedef uint32_t Prngnum_t;
+
+typedef struct Prng_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       _INTEGRAL_PRIVATE_
+       Prngnum_t               init;
+       Prngnum_t               mpy;
+       Prngnum_t               add;
+} Prng_t;
+
+static Sum_t*
+prng_open(const Method_t* method, const char* name)
+{
+       register Prng_t*        sum;
+       register const char*    s;
+       register const char*    t;
+       register const char*    v;
+       register int            i;
+
+       if (sum = newof(0, Prng_t, 1, 0))
+       {
+               sum->method = (Method_t*)method;
+               sum->name = name;
+       }
+       s = name;
+       while (*(t = s))
+       {
+               for (t = s, v = 0; *s && *s != '-'; s++)
+                       if (*s == '=' && !v)
+                               v = s;
+               i = (v ? v : s) - t;
+               if (isdigit(*t) || v && strneq(t, "mpy", i) && (t = v + 1))
+                       sum->mpy = strtoul(t, NiL, 0);
+               else if (strneq(t, "add", i))
+                       sum->add = v ? strtoul(v + 1, NiL, 0) : ~sum->add;
+               else if (strneq(t, "init", i))
+                       sum->init = v ? strtoul(v + 1, NiL, 0) : ~sum->init;
+               if (*s == '-')
+                       s++;
+       }
+       if (!sum->mpy)
+       {
+               sum->mpy = FNV_MULT;
+               if (!sum->init)
+                       sum->init = FNV_INIT;
+       }
+       return (Sum_t*)sum;
+}
+
+static int
+prng_init(Sum_t* p)
+{
+       Prng_t*         sum = (Prng_t*)p;
+
+       sum->sum = sum->init;
+       return 0;
+}
+
+static int
+prng_block(Sum_t* p, const void* s, size_t n)
+{
+       Prng_t*                 sum = (Prng_t*)p;
+       register Prngnum_t      c = sum->sum;
+       register unsigned char* b = (unsigned char*)s;
+       register unsigned char* e = b + n;
+
+       while (b < e)
+               c = c * sum->mpy + sum->add + *b++;
+       sum->sum = c;
+       return 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-sha1.c 
ksh93_2007_03_28/src/lib/libsum/sum-sha1.c
--- ksh93_2007_01_11/src/lib/libsum/sum-sha1.c  1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-sha1.c  2007-02-14 19:05:02.000000000 
+0100
@@ -0,0 +1,344 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+/*
+ * FIPS 180-1 compliant SHA-1 implementation,
+ * by Christophe Devine <devine at cr0.net>;
+ * this program is licensed under the GPL.
+ */
+
+#define sha1_description "FIPS 180-1 SHA-1 secure hash algorithm 1."
+#define sha1_options   "[+(version)?sha1 (FIPS 180-1) 1993-05-11]\
+                        [+(author)?Christophe Devine <devine at cr0.net>]"
+#define sha1_match     "sha1|SHA1|sha-1|SHA-1"
+#define sha1_scale     0
+
+#define uint8          uint8_t
+#define uint32         uint32_t
+
+#define sha1_padding   md5_pad
+
+typedef struct Sha1_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       uint32  total[2];
+       uint32  state[5];
+       uint8   buffer[64];
+       uint8   digest[20];
+       uint8   digest_sum[20];
+} Sha1_t;
+
+#define GET_UINT32(n,b,i)                                       \
+{                                                               \
+    (n) = (uint32) ((uint8 *) b)[(i)+3]                         \
+      | (((uint32) ((uint8 *) b)[(i)+2]) <<  8)                 \
+      | (((uint32) ((uint8 *) b)[(i)+1]) << 16)                 \
+      | (((uint32) ((uint8 *) b)[(i)]  ) << 24);                \
+}
+
+#define PUT_UINT32(n,b,i)                                       \
+{                                                               \
+    (((uint8 *) b)[(i)+3]) = (uint8) (((n)      ) & 0xFF);      \
+    (((uint8 *) b)[(i)+2]) = (uint8) (((n) >>  8) & 0xFF);      \
+    (((uint8 *) b)[(i)+1]) = (uint8) (((n) >> 16) & 0xFF);      \
+    (((uint8 *) b)[(i)]  ) = (uint8) (((n) >> 24) & 0xFF);      \
+}
+
+static void
+sha1_process(Sha1_t* sha, uint8 data[64] )
+{
+    uint32 temp, A, B, C, D, E, W[16];
+
+    GET_UINT32( W[0],  data,  0 );
+    GET_UINT32( W[1],  data,  4 );
+    GET_UINT32( W[2],  data,  8 );
+    GET_UINT32( W[3],  data, 12 );
+    GET_UINT32( W[4],  data, 16 );
+    GET_UINT32( W[5],  data, 20 );
+    GET_UINT32( W[6],  data, 24 );
+    GET_UINT32( W[7],  data, 28 );
+    GET_UINT32( W[8],  data, 32 );
+    GET_UINT32( W[9],  data, 36 );
+    GET_UINT32( W[10], data, 40 );
+    GET_UINT32( W[11], data, 44 );
+    GET_UINT32( W[12], data, 48 );
+    GET_UINT32( W[13], data, 52 );
+    GET_UINT32( W[14], data, 56 );
+    GET_UINT32( W[15], data, 60 );
+
+#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
+
+#define R(t)                                            \
+(                                                       \
+    temp = W[(t -  3) & 0x0F] ^ W[(t - 8) & 0x0F] ^     \
+           W[(t - 14) & 0x0F] ^ W[ t      & 0x0F],      \
+    ( W[t & 0x0F] = S(temp,1) )                         \
+)
+
+#define P(a,b,c,d,e,x)                                  \
+{                                                       \
+    e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);        \
+}
+
+    A = sha->state[0];
+    B = sha->state[1];
+    C = sha->state[2];
+    D = sha->state[3];
+    E = sha->state[4];
+
+#undef F
+
+#define F(x,y,z) (z ^ (x & (y ^ z)))
+#define K 0x5A827999
+
+    P( A, B, C, D, E, W[0]  );
+    P( E, A, B, C, D, W[1]  );
+    P( D, E, A, B, C, W[2]  );
+    P( C, D, E, A, B, W[3]  );
+    P( B, C, D, E, A, W[4]  );
+    P( A, B, C, D, E, W[5]  );
+    P( E, A, B, C, D, W[6]  );
+    P( D, E, A, B, C, W[7]  );
+    P( C, D, E, A, B, W[8]  );
+    P( B, C, D, E, A, W[9]  );
+    P( A, B, C, D, E, W[10] );
+    P( E, A, B, C, D, W[11] );
+    P( D, E, A, B, C, W[12] );
+    P( C, D, E, A, B, W[13] );
+    P( B, C, D, E, A, W[14] );
+    P( A, B, C, D, E, W[15] );
+    P( E, A, B, C, D, R(16) );
+    P( D, E, A, B, C, R(17) );
+    P( C, D, E, A, B, R(18) );
+    P( B, C, D, E, A, R(19) );
+
+#undef K
+#undef F
+
+#define F(x,y,z) (x ^ y ^ z)
+#define K 0x6ED9EBA1
+
+    P( A, B, C, D, E, R(20) );
+    P( E, A, B, C, D, R(21) );
+    P( D, E, A, B, C, R(22) );
+    P( C, D, E, A, B, R(23) );
+    P( B, C, D, E, A, R(24) );
+    P( A, B, C, D, E, R(25) );
+    P( E, A, B, C, D, R(26) );
+    P( D, E, A, B, C, R(27) );
+    P( C, D, E, A, B, R(28) );
+    P( B, C, D, E, A, R(29) );
+    P( A, B, C, D, E, R(30) );
+    P( E, A, B, C, D, R(31) );
+    P( D, E, A, B, C, R(32) );
+    P( C, D, E, A, B, R(33) );
+    P( B, C, D, E, A, R(34) );
+    P( A, B, C, D, E, R(35) );
+    P( E, A, B, C, D, R(36) );
+    P( D, E, A, B, C, R(37) );
+    P( C, D, E, A, B, R(38) );
+    P( B, C, D, E, A, R(39) );
+
+#undef K
+#undef F
+
+#define F(x,y,z) ((x & y) | (z & (x | y)))
+#define K 0x8F1BBCDC
+
+    P( A, B, C, D, E, R(40) );
+    P( E, A, B, C, D, R(41) );
+    P( D, E, A, B, C, R(42) );
+    P( C, D, E, A, B, R(43) );
+    P( B, C, D, E, A, R(44) );
+    P( A, B, C, D, E, R(45) );
+    P( E, A, B, C, D, R(46) );
+    P( D, E, A, B, C, R(47) );
+    P( C, D, E, A, B, R(48) );
+    P( B, C, D, E, A, R(49) );
+    P( A, B, C, D, E, R(50) );
+    P( E, A, B, C, D, R(51) );
+    P( D, E, A, B, C, R(52) );
+    P( C, D, E, A, B, R(53) );
+    P( B, C, D, E, A, R(54) );
+    P( A, B, C, D, E, R(55) );
+    P( E, A, B, C, D, R(56) );
+    P( D, E, A, B, C, R(57) );
+    P( C, D, E, A, B, R(58) );
+    P( B, C, D, E, A, R(59) );
+
+#undef K
+#undef F
+
+#define F(x,y,z) (x ^ y ^ z)
+#define K 0xCA62C1D6
+
+    P( A, B, C, D, E, R(60) );
+    P( E, A, B, C, D, R(61) );
+    P( D, E, A, B, C, R(62) );
+    P( C, D, E, A, B, R(63) );
+    P( B, C, D, E, A, R(64) );
+    P( A, B, C, D, E, R(65) );
+    P( E, A, B, C, D, R(66) );
+    P( D, E, A, B, C, R(67) );
+    P( C, D, E, A, B, R(68) );
+    P( B, C, D, E, A, R(69) );
+    P( A, B, C, D, E, R(70) );
+    P( E, A, B, C, D, R(71) );
+    P( D, E, A, B, C, R(72) );
+    P( C, D, E, A, B, R(73) );
+    P( B, C, D, E, A, R(74) );
+    P( A, B, C, D, E, R(75) );
+    P( E, A, B, C, D, R(76) );
+    P( D, E, A, B, C, R(77) );
+    P( C, D, E, A, B, R(78) );
+    P( B, C, D, E, A, R(79) );
+
+#undef K
+#undef F
+
+    sha->state[0] += A;
+    sha->state[1] += B;
+    sha->state[2] += C;
+    sha->state[3] += D;
+    sha->state[4] += E;
+}
+
+static int
+sha1_block(register Sum_t* p, const void* s, size_t length)
+{
+    Sha1_t*    sha = (Sha1_t*)p;
+    uint8*     input = (uint8*)s;
+    uint32     left, fill;
+
+    if( ! length ) return 0;
+
+    left = ( sha->total[0] >> 3 ) & 0x3F;
+    fill = 64 - left;
+
+    sha->total[0] += length <<  3;
+    sha->total[1] += length >> 29;
+
+    sha->total[0] &= 0xFFFFFFFF;
+    sha->total[1] += sha->total[0] < length << 3;
+
+    if( left && length >= fill )
+    {
+        memcpy( (void *) (sha->buffer + left), (void *) input, fill );
+        sha1_process( sha, sha->buffer );
+        length -= fill;
+        input  += fill;
+        left = 0;
+    }
+
+    while( length >= 64 )
+    {
+        sha1_process( sha, input );
+        length -= 64;
+        input  += 64;
+    }
+
+    if( length )
+        memcpy( (void *) (sha->buffer + left), (void *) input, length );
+
+    return 0;
+}
+
+static int
+sha1_init(Sum_t* p)
+{
+       register Sha1_t*        sha = (Sha1_t*)p;
+
+       sha->total[0] = sha->total[1] = 0;
+       sha->state[0] = 0x67452301;
+       sha->state[1] = 0xEFCDAB89;
+       sha->state[2] = 0x98BADCFE;
+       sha->state[3] = 0x10325476;
+       sha->state[4] = 0xC3D2E1F0;
+
+       return 0;
+}
+
+static Sum_t*
+sha1_open(const Method_t* method, const char* name)
+{
+       Sha1_t* sha;
+
+       if (sha = newof(0, Sha1_t, 1, 0))
+       {
+               sha->method = (Method_t*)method;
+               sha->name = name;
+               sha1_init((Sum_t*)sha);
+       }
+       return (Sum_t*)sha;
+}
+
+static int
+sha1_done(Sum_t* p)
+{
+    Sha1_t*    sha = (Sha1_t*)p;
+    uint32     last, padn;
+    uint8      msglen[8];
+
+    PUT_UINT32( sha->total[1], msglen, 0 );
+    PUT_UINT32( sha->total[0], msglen, 4 );
+
+    last = ( sha->total[0] >> 3 ) & 0x3F;
+    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
+
+    sha1_block( p, sha1_padding, padn );
+    sha1_block( p, msglen, 8 );
+
+    PUT_UINT32( sha->state[0], sha->digest,  0 );
+    PUT_UINT32( sha->state[1], sha->digest,  4 );
+    PUT_UINT32( sha->state[2], sha->digest,  8 );
+    PUT_UINT32( sha->state[3], sha->digest, 12 );
+    PUT_UINT32( sha->state[4], sha->digest, 16 );
+
+    /* accumulate the digests */
+    for (last = 0; last < elementsof(sha->digest); last++)
+       sha->digest_sum[last] ^= sha->digest[last];
+    return 0;
+}
+
+static int
+sha1_print(Sum_t* p, Sfio_t* sp, register int flags)
+{
+       register Sha1_t*        sha = (Sha1_t*)p;
+       register unsigned char* d;
+       register int            n;
+
+       d = (flags & SUM_TOTAL) ? sha->digest_sum : sha->digest;
+       for (n = 0; n < elementsof(sha->digest); n++)
+               sfprintf(sp, "%02x", d[n]);
+       return 0;
+}
+
+static int
+sha1_data(Sum_t* p, Sumdata_t* data)
+{
+       register Sha1_t*        sha = (Sha1_t*)p;
+
+       data->size = elementsof(sha->digest);
+       data->num = 0;
+       data->buf = sha->digest;
+       return 0;
+}
diff -r -N -u ksh93_2007_01_11/src/lib/libsum/sum-sha2.c 
ksh93_2007_03_28/src/lib/libsum/sum-sha2.c
--- ksh93_2007_01_11/src/lib/libsum/sum-sha2.c  1970-01-01 01:00:00.000000000 
+0100
+++ ksh93_2007_03_28/src/lib/libsum/sum-sha2.c  2007-02-14 19:05:50.000000000 
+0100
@@ -0,0 +1,1248 @@
+/***********************************************************************
+*                                                                      *
+*               This software is part of the ast package               *
+*           Copyright (c) 1996-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>                  *
+*                                                                      *
+***********************************************************************/
+#pragma prototyped
+
+#if _typ_int64_t
+
+/*
+ * Aaron D. Gifford's SHA {256,384,512} code transcribed into a -lsum method
+ */
+
+/*
+ * Copyright (c) 2000-2001, Aaron D. Gifford
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * ASSERT NOTE:
+ * Some sanity checking code is included using assert().  On my FreeBSD
+ * system, this additional code can be removed by compiling with NDEBUG
+ * defined.  Check your own systems manpage on assert() to see how to
+ * compile WITHOUT the sanity checking code on your system.
+ *
+ * UNROLLED TRANSFORM LOOP NOTE:
+ * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
+ * loop version for the hash transform rounds (defined using macros
+ * later in this file).  Either define on the command line, for example:
+ *
+ *   cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
+ *
+ * or define below:
+ *
+ *   #define SHA2_UNROLL_TRANSFORM
+ *
+ */
+
+/*** SHA-256/384/512 Machine Architecture Definitions *****************/
+
+#if _PACKAGE_ast
+
+#ifndef __USE_BSD
+#define __undef__USE_BSD
+#define __USE_BSD
+#endif
+#include <endian.h>
+#ifdef __undef__USE_BSD
+#undef __undef__USE_BSD
+#undef __USE_BSD
+#endif
+
+typedef  uint8_t sha2_byte;    /* Exactly 1 byte */
+typedef uint32_t sha2_word32;  /* Exactly 4 bytes */
+typedef uint64_t sha2_word64;  /* Exactly 8 bytes */
+
+#define assert(x)
+
+#undef R
+#undef S32
+#undef S64
+
+#else /* _PACKAGE_ast */
+
+/*
+ * BYTE_ORDER NOTE:
+ *
+ * Please make sure that your system defines BYTE_ORDER.  If your
+ * architecture is little-endian, make sure it also defines
+ * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
+ * equivilent.
+ *
+ * If your system does not define the above, then you can do so by
+ * hand like this:
+ *
+ *   #define LITTLE_ENDIAN 1234
+ *   #define BIG_ENDIAN    4321
+ *
+ * And for little-endian machines, add:
+ *
+ *   #define BYTE_ORDER LITTLE_ENDIAN 
+ *
+ * Or for big-endian machines:
+ *
+ *   #define BYTE_ORDER BIG_ENDIAN
+ *
+ * The FreeBSD machine this was written on defines BYTE_ORDER
+ * appropriately by including <sys/types.h> (which in turn includes
+ * <machine/endian.h> where the appropriate definitions are actually
+ * made).
+ */
+
+#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != 
BIG_ENDIAN)
+#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
+#endif
+
+/*
+ * Define the following sha2_* types to types of the correct length on
+ * the native archtecture.   Most BSD systems and Linux define u_intXX_t
+ * types.  Machines with very recent ANSI C headers, can use the
+ * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H
+ * during compile or in the sha.h header file.
+ *
+ * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t
+ * will need to define these three typedefs below (and the appropriate
+ * ones in sha.h too) by hand according to their system architecture.
+ *
+ * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t
+ * types and pointing out recent ANSI C support for uintXX_t in inttypes.h.
+ */
+
+#ifdef SHA2_USE_INTTYPES_H
+
+typedef uint8_t  sha2_byte;    /* Exactly 1 byte */
+typedef uint32_t sha2_word32;  /* Exactly 4 bytes */
+typedef uint64_t sha2_word64;  /* Exactly 8 bytes */
+
+#else /* SHA2_USE_INTTYPES_H */
+
+typedef u_int8_t  sha2_byte;   /* Exactly 1 byte */
+typedef u_int32_t sha2_word32; /* Exactly 4 bytes */
+typedef u_int64_t sha2_word64; /* Exactly 8 bytes */
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+#endif /* _PACKAGE_ast */
+
+/*** SHA-256/384/512 Various Length Definitions ***********************/
+
+#define SHA256_BLOCK_LENGTH            64
+#define SHA256_DIGEST_LENGTH           32
+#define SHA384_BLOCK_LENGTH            128
+#define SHA384_DIGEST_LENGTH           48
+#define SHA512_BLOCK_LENGTH            128
+#define SHA512_DIGEST_LENGTH           64
+
+#define SHA256_SHORT_BLOCK_LENGTH      (SHA256_BLOCK_LENGTH - 8)
+#define SHA384_SHORT_BLOCK_LENGTH      (SHA384_BLOCK_LENGTH - 16)
+#define SHA512_SHORT_BLOCK_LENGTH      (SHA512_BLOCK_LENGTH - 16)
+
+/*** ENDIAN REVERSAL MACROS *******************************************/
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define REVERSE32(w,x) { \
+       sha2_word32 tmp = (w); \
+       tmp = (tmp >> 16) | (tmp << 16); \
+       (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
+}
+#if _ast_LL
+#define REVERSE64(w,x) { \
+       sha2_word64 tmp = (w); \
+       tmp = (tmp >> 32) | (tmp << 32); \
+       tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
+             ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
+       (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
+             ((tmp & 0x0000ffff0000ffffULL) << 16); \
+}
+#else
+#define REVERSE64(w,x) { \
+       sha2_word64 tmp = (w); \
+       tmp = (tmp >> 32) | (tmp << 32); \
+       tmp = ((tmp & ((sha2_word64)0xff00ff00ff00ff00)) >> 8) | \
+             ((tmp & ((sha2_word64)0x00ff00ff00ff00ff)) << 8); \
+       (x) = ((tmp & ((sha2_word64)0xffff0000ffff0000)) >> 16) | \
+             ((tmp & ((sha2_word64)0x0000ffff0000ffff)) << 16); \
+}
+#endif
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+/*
+ * Macro for incrementally adding the unsigned 64-bit integer n to the
+ * unsigned 128-bit integer (represented using a two-element array of
+ * 64-bit words):
+ */
+
+#define ADDINC128(w,n) { \
+       (w)[0] += (sha2_word64)(n); \
+       if ((w)[0] < (n)) { \
+               (w)[1]++; \
+       } \
+}
+
+/*
+ * Macros for copying blocks of memory and for zeroing out ranges
+ * of memory.  Using these macros makes it easy to switch from
+ * using memset()/memcpy() and using bzero()/bcopy().
+ *
+ * Please define either SHA2_USE_MEMSET_MEMCPY or define
+ * SHA2_USE_BZERO_BCOPY depending on which function set you
+ * choose to use:
+ */
+
+#if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY)
+/* Default to memset()/memcpy() if no option is specified */
+#define        SHA2_USE_MEMSET_MEMCPY  1
+#endif
+#if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY)
+/* Abort with an error if BOTH options are defined */
+#error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both!
+#endif
+
+#ifdef SHA2_USE_MEMSET_MEMCPY
+#define MEMSET_BZERO(p,l)      memset((p), 0, (l))
+#define MEMCPY_BCOPY(d,s,l)    memcpy((d), (s), (l))
+#endif
+#ifdef SHA2_USE_BZERO_BCOPY
+#define MEMSET_BZERO(p,l)      bzero((p), (l))
+#define MEMCPY_BCOPY(d,s,l)    bcopy((s), (d), (l))
+#endif
+
+
+/*** THE SIX LOGICAL FUNCTIONS ****************************************/
+/*
+ * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
+ *
+ *   NOTE:  The naming of R and S appears backwards here (R is a SHIFT and
+ *   S is a ROTATION) because the SHA-256/384/512 description document
+ *   (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
+ *   same "backwards" definition.
+ */
+
+/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
+#define R(b,x)                 ((x) >> (b))
+/* 32-bit Rotate-right (used in SHA-256): */
+#define S32(b,x)       (((x) >> (b)) | ((x) << (32 - (b))))
+/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
+#define S64(b,x)       (((x) >> (b)) | ((x) << (64 - (b))))
+
+/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
+#define Ch(x,y,z)      (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z)     (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+/* Four of six logical functions used in SHA-256: */
+#define Sigma0_256(x)  (S32(2,  (x)) ^ S32(13, (x)) ^ S32(22, (x)))
+#define Sigma1_256(x)  (S32(6,  (x)) ^ S32(11, (x)) ^ S32(25, (x)))
+#define sigma0_256(x)  (S32(7,  (x)) ^ S32(18, (x)) ^ R(3 ,   (x)))
+#define sigma1_256(x)  (S32(17, (x)) ^ S32(19, (x)) ^ R(10,   (x)))
+
+/* Four of six logical functions used in SHA-384 and SHA-512: */
+#define Sigma0_512(x)  (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
+#define Sigma1_512(x)  (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
+#define sigma0_512(x)  (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7,   (x)))
+#define sigma1_512(x)  (S64(19, (x)) ^ S64(61, (x)) ^ R( 6,   (x)))
+
+/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
+/* Hash constant words K for SHA-256: */
+static const sha2_word32 K256[64] = {
+       0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+       0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+       0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+       0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+       0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+       0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+       0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+       0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+       0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+       0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+       0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+       0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+       0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+       0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+       0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+       0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+
+/* Initial hash value H for SHA-256: */
+static const sha2_word32 sha256_initial_hash_value[8] = {
+       0x6a09e667UL,
+       0xbb67ae85UL,
+       0x3c6ef372UL,
+       0xa54ff53aUL,
+       0x510e527fUL,
+       0x9b05688cUL,
+       0x1f83d9abUL,
+       0x5be0cd19UL
+};
+
+/* Hash constant words K for SHA-384 and SHA-512: */
+static const sha2_word64 K512[80] = {
+#if _ast_LL
+       0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
+       0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
+       0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
+       0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
+       0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
+       0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
+       0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
+       0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
+       0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
+       0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
+       0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
+       0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
+       0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
+       0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
+       0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
+       0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
+       0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
+       0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
+       0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
+       0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
+       0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
+       0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
+       0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
+       0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
+       0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
+       0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
+       0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
+       0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
+       0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
+       0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
+       0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
+       0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
+       0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
+       0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
+       0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
+       0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
+       0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
+       0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
+       0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
+       0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
+#else
+       ((sha2_word64)0x428a2f98d728ae22), ((sha2_word64)0x7137449123ef65cd),
+       ((sha2_word64)0xb5c0fbcfec4d3b2f), ((sha2_word64)0xe9b5dba58189dbbc),
+       ((sha2_word64)0x3956c25bf348b538), ((sha2_word64)0x59f111f1b605d019),
+       ((sha2_word64)0x923f82a4af194f9b), ((sha2_word64)0xab1c5ed5da6d8118),
+       ((sha2_word64)0xd807aa98a3030242), ((sha2_word64)0x12835b0145706fbe),
+       ((sha2_word64)0x243185be4ee4b28c), ((sha2_word64)0x550c7dc3d5ffb4e2),
+       ((sha2_word64)0x72be5d74f27b896f), ((sha2_word64)0x80deb1fe3b1696b1),
+       ((sha2_word64)0x9bdc06a725c71235), ((sha2_word64)0xc19bf174cf692694),
+       ((sha2_word64)0xe49b69c19ef14ad2), ((sha2_word64)0xefbe4786384f25e3),
+       ((sha2_word64)0x0fc19dc68b8cd5b5), ((sha2_word64)0x240ca1cc77ac9c65),
+       ((sha2_word64)0x2de92c6f592b0275), ((sha2_word64)0x4a7484aa6ea6e483),
+       ((sha2_word64)0x5cb0a9dcbd41fbd4), ((sha2_word64)0x76f988da831153b5),
+       ((sha2_word64)0x983e5152ee66dfab), ((sha2_word64)0xa831c66d2db43210),
+       ((sha2_word64)0xb00327c898fb213f), ((sha2_word64)0xbf597fc7beef0ee4),
+       ((sha2_word64)0xc6e00bf33da88fc2), ((sha2_word64)0xd5a79147930aa725),
+       ((sha2_word64)0x06ca6351e003826f), ((sha2_word64)0x142929670a0e6e70),
+       ((sha2_word64)0x27b70a8546d22ffc), ((sha2_word64)0x2e1b21385c26c926),
+       ((sha2_word64)0x4d2c6dfc5ac42aed), ((sha2_word64)0x53380d139d95b3df),
+       ((sha2_word64)0x650a73548baf63de), ((sha2_word64)0x766a0abb3c77b2a8),
+       ((sha2_word64)0x81c2c92e47edaee6), ((sha2_word64)0x92722c851482353b),
+       ((sha2_word64)0xa2bfe8a14cf10364), ((sha2_word64)0xa81a664bbc423001),
+       ((sha2_word64)0xc24b8b70d0f89791), ((sha2_word64)0xc76c51a30654be30),
+       ((sha2_word64)0xd192e819d6ef5218), ((sha2_word64)0xd69906245565a910),
+       ((sha2_word64)0xf40e35855771202a), ((sha2_word64)0x106aa07032bbd1b8),
+       ((sha2_word64)0x19a4c116b8d2d0c8), ((sha2_word64)0x1e376c085141ab53),
+       ((sha2_word64)0x2748774cdf8eeb99), ((sha2_word64)0x34b0bcb5e19b48a8),
+       ((sha2_word64)0x391c0cb3c5c95a63), ((sha2_word64)0x4ed8aa4ae3418acb),
+       ((sha2_word64)0x5b9cca4f7763e373), ((sha2_word64)0x682e6ff3d6b2b8a3),
+       ((sha2_word64)0x748f82ee5defb2fc), ((sha2_word64)0x78a5636f43172f60),
+       ((sha2_word64)0x84c87814a1f0ab72), ((sha2_word64)0x8cc702081a6439ec),
+       ((sha2_word64)0x90befffa23631e28), ((sha2_word64)0xa4506cebde82bde9),
+       ((sha2_word64)0xbef9a3f7b2c67915), ((sha2_word64)0xc67178f2e372532b),
+       ((sha2_word64)0xca273eceea26619c), ((sha2_word64)0xd186b8c721c0c207),
+       ((sha2_word64)0xeada7dd6cde0eb1e), ((sha2_word64)0xf57d4f7fee6ed178),
+       ((sha2_word64)0x06f067aa72176fba), ((sha2_word64)0x0a637dc5a2c898a6),
+       ((sha2_word64)0x113f9804bef90dae), ((sha2_word64)0x1b710b35131c471b),
+       ((sha2_word64)0x28db77f523047d84), ((sha2_word64)0x32caab7b40c72493),
+       ((sha2_word64)0x3c9ebe0a15c9bebc), ((sha2_word64)0x431d67c49c100d4c),
+       ((sha2_word64)0x4cc5d4becb3e42b6), ((sha2_word64)0x597f299cfc657e2a),
+       ((sha2_word64)0x5fcb6fab3ad6faec), ((sha2_word64)0x6c44198c4a475817)
+#endif
+};
+
+/* Initial hash value H for SHA-384 */
+static const sha2_word64 sha384_initial_hash_value[8] = {
+#if _ast_LL
+       0xcbbb9d5dc1059ed8ULL,
+       0x629a292a367cd507ULL,
+       0x9159015a3070dd17ULL,
+       0x152fecd8f70e5939ULL,
+       0x67332667ffc00b31ULL,
+       0x8eb44a8768581511ULL,
+       0xdb0c2e0d64f98fa7ULL,
+       0x47b5481dbefa4fa4ULL
+#else
+       ((sha2_word64)0xcbbb9d5dc1059ed8),
+       ((sha2_word64)0x629a292a367cd507),
+       ((sha2_word64)0x9159015a3070dd17),
+       ((sha2_word64)0x152fecd8f70e5939),
+       ((sha2_word64)0x67332667ffc00b31),
+       ((sha2_word64)0x8eb44a8768581511),
+       ((sha2_word64)0xdb0c2e0d64f98fa7),
+       ((sha2_word64)0x47b5481dbefa4fa4)
+#endif
+};
+
+/* Initial hash value H for SHA-512 */
+static const sha2_word64 sha512_initial_hash_value[8] = {
+#if _ast_LL
+       0x6a09e667f3bcc908ULL,
+       0xbb67ae8584caa73bULL,
+       0x3c6ef372fe94f82bULL,
+       0xa54ff53a5f1d36f1ULL,
+       0x510e527fade682d1ULL,
+       0x9b05688c2b3e6c1fULL,
+       0x1f83d9abfb41bd6bULL,
+       0x5be0cd19137e2179ULL
+#else
+       ((sha2_word64)0x6a09e667f3bcc908),
+       ((sha2_word64)0xbb67ae8584caa73b),
+       ((sha2_word64)0x3c6ef372fe94f82b),
+       ((sha2_word64)0xa54ff53a5f1d36f1),
+       ((sha2_word64)0x510e527fade682d1),
+       ((sha2_word64)0x9b05688c2b3e6c1f),
+       ((sha2_word64)0x1f83d9abfb41bd6b),
+       ((sha2_word64)0x5be0cd19137e2179)
+#endif
+};
+
+/*** SHA-256: *********************************************************/
+
+#define sha256_description "FIPS SHA-256 secure hash algorithm."
+#define sha256_options "\
+[+(version)?sha-256 (FIPS) 2000-01-01]\
+[+(author)?Aaron D. Gifford]\
+"
+#define sha256_match   "sha256|sha-256|SHA256|SHA-256"
+#define sha256_scale   0
+
+#define sha256_padding md5_pad
+
+#define SHA256_CTX     Sha256_t
+
+typedef struct Sha256_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       sha2_byte       digest[SHA256_DIGEST_LENGTH];
+       sha2_byte       digest_sum[SHA256_DIGEST_LENGTH];
+       sha2_word32     state[8];
+       sha2_word64     bitcount;
+       sha2_byte       buffer[SHA256_BLOCK_LENGTH];
+} Sha256_t;
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-256 round macros: */
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h)      \
+       REVERSE32(*data++, W256[j]); \
+       T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+             K256[j] + W256[j]; \
+       (d) += T1; \
+       (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+       j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h)      \
+       T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+            K256[j] + (W256[j] = *data++); \
+       (d) += T1; \
+       (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+       j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256(a,b,c,d,e,f,g,h)      \
+       s0 = W256[(j+1)&0x0f]; \
+       s0 = sigma0_256(s0); \
+       s1 = W256[(j+14)&0x0f]; \
+       s1 = sigma1_256(s1); \
+       T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
+            (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
+       (d) += T1; \
+       (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+       j++
+
+static void SHA256_Transform(SHA256_CTX* sha, const sha2_word32* data) {
+       sha2_word32     a, b, c, d, e, f, g, h, s0, s1;
+       sha2_word32     T1, *W256;
+       int             j;
+
+       W256 = (sha2_word32*)sha->buffer;
+
+       /* Initialize registers with the prev. intermediate value */
+       a = sha->state[0];
+       b = sha->state[1];
+       c = sha->state[2];
+       d = sha->state[3];
+       e = sha->state[4];
+       f = sha->state[5];
+       g = sha->state[6];
+       h = sha->state[7];
+
+       j = 0;
+       do {
+               /* Rounds 0 to 15 (unrolled): */
+               ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
+               ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
+               ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
+               ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
+               ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
+               ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
+               ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
+               ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
+       } while (j < 16);
+
+       /* Now for the remaining rounds to 64: */
+       do {
+               ROUND256(a,b,c,d,e,f,g,h);
+               ROUND256(h,a,b,c,d,e,f,g);
+               ROUND256(g,h,a,b,c,d,e,f);
+               ROUND256(f,g,h,a,b,c,d,e);
+               ROUND256(e,f,g,h,a,b,c,d);
+               ROUND256(d,e,f,g,h,a,b,c);
+               ROUND256(c,d,e,f,g,h,a,b);
+               ROUND256(b,c,d,e,f,g,h,a);
+       } while (j < 64);
+
+       /* Compute the current intermediate hash value */
+       sha->state[0] += a;
+       sha->state[1] += b;
+       sha->state[2] += c;
+       sha->state[3] += d;
+       sha->state[4] += e;
+       sha->state[5] += f;
+       sha->state[6] += g;
+       sha->state[7] += h;
+
+       /* Clean up */
+       a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+static void SHA256_Transform(SHA256_CTX* sha, const sha2_word32* data) {
+       sha2_word32     a, b, c, d, e, f, g, h, s0, s1;
+       sha2_word32     T1, T2, *W256;
+       int             j;
+
+       W256 = (sha2_word32*)sha->buffer;
+
+       /* Initialize registers with the prev. intermediate value */
+       a = sha->state[0];
+       b = sha->state[1];
+       c = sha->state[2];
+       d = sha->state[3];
+       e = sha->state[4];
+       f = sha->state[5];
+       g = sha->state[6];
+       h = sha->state[7];
+
+       j = 0;
+       do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+               /* Copy data while converting to host byte order */
+               REVERSE32(*data++,W256[j]);
+               /* Apply the SHA-256 compression function to update a..h */
+               T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+               /* Apply the SHA-256 compression function to update a..h with 
copy */
+               T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = 
*data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+               T2 = Sigma0_256(a) + Maj(a, b, c);
+               h = g;
+               g = f;
+               f = e;
+               e = d + T1;
+               d = c;
+               c = b;
+               b = a;
+               a = T1 + T2;
+
+               j++;
+       } while (j < 16);
+
+       do {
+               /* Part of the message block expansion: */
+               s0 = W256[(j+1)&0x0f];
+               s0 = sigma0_256(s0);
+               s1 = W256[(j+14)&0x0f]; 
+               s1 = sigma1_256(s1);
+
+               /* Apply the SHA-256 compression function to update a..h */
+               T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + 
+                    (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
+               T2 = Sigma0_256(a) + Maj(a, b, c);
+               h = g;
+               g = f;
+               f = e;
+               e = d + T1;
+               d = c;
+               c = b;
+               b = a;
+               a = T1 + T2;
+
+               j++;
+       } while (j < 64);
+
+       /* Compute the current intermediate hash value */
+       sha->state[0] += a;
+       sha->state[1] += b;
+       sha->state[2] += c;
+       sha->state[3] += d;
+       sha->state[4] += e;
+       sha->state[5] += f;
+       sha->state[6] += g;
+       sha->state[7] += h;
+
+       /* Clean up */
+       a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+static int
+sha256_block(register Sum_t* p, const void* s, size_t len)
+{
+       Sha256_t*       sha = (Sha256_t*)p;
+       sha2_byte*      data = (sha2_byte*)s;
+       unsigned int    freespace, usedspace;
+
+       if (!len)
+               return 0;
+       usedspace = (sha->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+       if (usedspace > 0) {
+               /* Calculate how much free space is available in the buffer */
+               freespace = SHA256_BLOCK_LENGTH - usedspace;
+
+               if (len >= freespace) {
+                       /* Fill the buffer completely and process it */
+                       MEMCPY_BCOPY(&sha->buffer[usedspace], data, freespace);
+                       sha->bitcount += freespace << 3;
+                       len -= freespace;
+                       data += freespace;
+                       SHA256_Transform(sha, (sha2_word32*)sha->buffer);
+               } else {
+                       /* The buffer is not yet full */
+                       MEMCPY_BCOPY(&sha->buffer[usedspace], data, len);
+                       sha->bitcount += len << 3;
+                       /* Clean up: */
+                       usedspace = freespace = 0;
+                       return 0;
+               }
+       }
+       while (len >= SHA256_BLOCK_LENGTH) {
+               /* Process as many complete blocks as we can */
+               SHA256_Transform(sha, (sha2_word32*)data);
+               sha->bitcount += SHA256_BLOCK_LENGTH << 3;
+               len -= SHA256_BLOCK_LENGTH;
+               data += SHA256_BLOCK_LENGTH;
+       }
+       if (len > 0) {
+               /* There's left-overs, so save 'em */
+               MEMCPY_BCOPY(sha->buffer, data, len);
+               sha->bitcount += len << 3;
+       }
+       /* Clean up: */
+       usedspace = freespace = 0;
+
+       return 0;
+}
+
+static int
+sha256_init(Sum_t* p)
+{
+       register Sha256_t*      sha = (Sha256_t*)p;
+
+       MEMCPY_BCOPY(sha->state, sha256_initial_hash_value, 
SHA256_DIGEST_LENGTH);
+       MEMSET_BZERO(sha->buffer, SHA256_BLOCK_LENGTH);
+       sha->bitcount = 0;
+
+       return 0;
+}
+
+static Sum_t*
+sha256_open(const Method_t* method, const char* name)
+{
+       Sha256_t*       sha;
+
+       if (sha = newof(0, Sha256_t, 1, 0))
+       {
+               sha->method = (Method_t*)method;
+               sha->name = name;
+               sha256_init((Sum_t*)sha);
+       }
+       return (Sum_t*)sha;
+}
+
+static int
+sha256_done(Sum_t* p)
+{
+       Sha256_t*       sha = (Sha256_t*)p;
+       unsigned int    usedspace;
+       register int    i;
+
+       /* Sanity check: */
+       assert(sha != (SHA256_CTX*)0);
+
+       usedspace = (sha->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+       /* Convert FROM host byte order */
+       REVERSE64(sha->bitcount,sha->bitcount);
+#endif
+       if (usedspace > 0) {
+               /* Begin padding with a 1 bit: */
+               sha->buffer[usedspace++] = 0x80;
+
+               if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
+                       /* Set-up for the last transform: */
+                       MEMSET_BZERO(&sha->buffer[usedspace], 
SHA256_SHORT_BLOCK_LENGTH - usedspace);
+               } else {
+                       if (usedspace < SHA256_BLOCK_LENGTH) {
+                               MEMSET_BZERO(&sha->buffer[usedspace], 
SHA256_BLOCK_LENGTH - usedspace);
+                       }
+                       /* Do second-to-last transform: */
+                       SHA256_Transform(sha, (sha2_word32*)sha->buffer);
+
+                       /* And set-up for the last transform: */
+                       MEMSET_BZERO(sha->buffer, SHA256_SHORT_BLOCK_LENGTH);
+               }
+       } else {
+               /* Set-up for the last transform: */
+               MEMSET_BZERO(sha->buffer, SHA256_SHORT_BLOCK_LENGTH);
+
+               /* Begin padding with a 1 bit: */
+               *sha->buffer = 0x80;
+       }
+       /* Set the bit count: */
+       *(sha2_word64*)&sha->buffer[SHA256_SHORT_BLOCK_LENGTH] = sha->bitcount;
+
+       /* Final transform: */
+       SHA256_Transform(sha, (sha2_word32*)sha->buffer);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+       {
+               /* Convert TO host byte order */
+               int             j;
+               sha2_word32*    d = (sha2_word32*)sha->digest;
+               for (j = 0; j < 8; j++) {
+                       REVERSE32(sha->state[j],sha->state[j]);
+                       *d++ = sha->state[j];
+               }
+       }
+#else
+       MEMCPY_BCOPY(sha->digest, sha->state, SHA256_DIGEST_LENGTH);
+#endif
+
+       /* accumulate the digests */
+       for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
+               sha->digest_sum[i] ^= sha->digest[i];
+
+       /* Clean up state data: */
+       MEMSET_BZERO(&sha->state, sizeof(*sha) - offsetof(Sha256_t, state));
+       usedspace = 0;
+
+       return 0;
+}
+
+static int
+sha256_print(Sum_t* p, Sfio_t* sp, register int flags)
+{
+       register Sha256_t*      sha = (Sha256_t*)p;
+       register sha2_byte*     d;
+       register sha2_byte*     e;
+
+       d = (flags & SUM_TOTAL) ? sha->digest_sum : sha->digest;
+       e = d + SHA256_DIGEST_LENGTH;
+       while (d < e)
+               sfprintf(sp, "%02x", *d++);
+       return 0;
+}
+
+static int
+sha256_data(Sum_t* p, Sumdata_t* data)
+{
+       register Sha256_t*      sha = (Sha256_t*)p;
+
+       data->size = SHA256_DIGEST_LENGTH;
+       data->num = 0;
+       data->buf = sha->digest;
+       return 0;
+}
+
+/*** SHA-512: *********************************************************/
+
+#define sha512_description "FIPS SHA-512 secure hash algorithm."
+#define sha512_options "\
+[+(version)?sha-512 (FIPS) 2000-01-01]\
+[+(author)?Aaron D. Gifford]\
+"
+#define sha512_match   "sha512|sha-512|SHA512|SHA-512"
+#define sha512_scale   0
+
+#define sha512_padding md5_pad
+
+#define SHA512_CTX     Sha512_t
+
+typedef struct Sha512_s
+{
+       _SUM_PUBLIC_
+       _SUM_PRIVATE_
+       sha2_byte       digest[SHA512_DIGEST_LENGTH];
+       sha2_byte       digest_sum[SHA512_DIGEST_LENGTH];
+       sha2_word64     state[8];
+       sha2_word64     bitcount[2];
+       sha2_byte       buffer[SHA512_BLOCK_LENGTH];
+} Sha512_t;
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-512 round macros: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h)      \
+       REVERSE64(*data++, W512[j]); \
+       T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+             K512[j] + W512[j]; \
+       (d) += T1, \
+       (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
+       j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h)      \
+       T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+             K512[j] + (W512[j] = *data++); \
+       (d) += T1; \
+       (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+       j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512(a,b,c,d,e,f,g,h)      \
+       s0 = W512[(j+1)&0x0f]; \
+       s0 = sigma0_512(s0); \
+       s1 = W512[(j+14)&0x0f]; \
+       s1 = sigma1_512(s1); \
+       T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
+             (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
+       (d) += T1; \
+       (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+       j++
+
+static void SHA512_Transform(SHA512_CTX* sha, const sha2_word64* data) {
+       sha2_word64     a, b, c, d, e, f, g, h, s0, s1;
+       sha2_word64     T1, *W512 = (sha2_word64*)sha->buffer;
+       int             j;
+
+       /* Initialize registers with the prev. intermediate value */
+       a = sha->state[0];
+       b = sha->state[1];
+       c = sha->state[2];
+       d = sha->state[3];
+       e = sha->state[4];
+       f = sha->state[5];
+       g = sha->state[6];
+       h = sha->state[7];
+
+       j = 0;
+       do {
+               ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
+               ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
+               ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
+               ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
+               ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
+               ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
+               ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
+               ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
+       } while (j < 16);
+
+       /* Now for the remaining rounds up to 79: */
+       do {
+               ROUND512(a,b,c,d,e,f,g,h);
+               ROUND512(h,a,b,c,d,e,f,g);
+               ROUND512(g,h,a,b,c,d,e,f);
+               ROUND512(f,g,h,a,b,c,d,e);
+               ROUND512(e,f,g,h,a,b,c,d);
+               ROUND512(d,e,f,g,h,a,b,c);
+               ROUND512(c,d,e,f,g,h,a,b);
+               ROUND512(b,c,d,e,f,g,h,a);
+       } while (j < 80);
+
+       /* Compute the current intermediate hash value */
+       sha->state[0] += a;
+       sha->state[1] += b;
+       sha->state[2] += c;
+       sha->state[3] += d;
+       sha->state[4] += e;
+       sha->state[5] += f;
+       sha->state[6] += g;
+       sha->state[7] += h;
+
+       /* Clean up */
+       a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+static void SHA512_Transform(SHA512_CTX* sha, const sha2_word64* data) {
+       sha2_word64     a, b, c, d, e, f, g, h, s0, s1;
+       sha2_word64     T1, T2, *W512 = (sha2_word64*)sha->buffer;
+       int             j;
+
+       /* Initialize registers with the prev. intermediate value */
+       a = sha->state[0];
+       b = sha->state[1];
+       c = sha->state[2];
+       d = sha->state[3];
+       e = sha->state[4];
+       f = sha->state[5];
+       g = sha->state[6];
+       h = sha->state[7];
+
+       j = 0;
+       do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+               /* Convert TO host byte order */
+               REVERSE64(*data++, W512[j]);
+               /* Apply the SHA-512 compression function to update a..h */
+               T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+               /* Apply the SHA-512 compression function to update a..h with 
copy */
+               T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = 
*data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+               T2 = Sigma0_512(a) + Maj(a, b, c);
+               h = g;
+               g = f;
+               f = e;
+               e = d + T1;
+               d = c;
+               c = b;
+               b = a;
+               a = T1 + T2;
+
+               j++;
+       } while (j < 16);
+
+       do {
+               /* Part of the message block expansion: */
+               s0 = W512[(j+1)&0x0f];
+               s0 = sigma0_512(s0);
+               s1 = W512[(j+14)&0x0f];
+               s1 =  sigma1_512(s1);
+
+               /* Apply the SHA-512 compression function to update a..h */
+               T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
+                    (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
+               T2 = Sigma0_512(a) + Maj(a, b, c);
+               h = g;
+               g = f;
+               f = e;
+               e = d + T1;
+               d = c;
+               c = b;
+               b = a;
+               a = T1 + T2;
+
+               j++;
+       } while (j < 80);
+
+       /* Compute the current intermediate hash value */
+       sha->state[0] += a;
+       sha->state[1] += b;
+       sha->state[2] += c;
+       sha->state[3] += d;
+       sha->state[4] += e;
+       sha->state[5] += f;
+       sha->state[6] += g;
+       sha->state[7] += h;
+
+       /* Clean up */
+       a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+static int
+sha512_block(register Sum_t* p, const void* s, size_t len)
+{
+       Sha512_t*       sha = (Sha512_t*)p;
+       sha2_byte*      data = (sha2_byte*)s;
+       unsigned int    freespace, usedspace;
+
+       if (!len)
+               return 0;
+       usedspace = (sha->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
+       if (usedspace > 0) {
+               /* Calculate how much free space is available in the buffer */
+               freespace = SHA512_BLOCK_LENGTH - usedspace;
+
+               if (len >= freespace) {
+                       /* Fill the buffer completely and process it */
+                       MEMCPY_BCOPY(&sha->buffer[usedspace], data, freespace);
+                       ADDINC128(sha->bitcount, freespace << 3);
+                       len -= freespace;
+                       data += freespace;
+                       SHA512_Transform(sha, (sha2_word64*)sha->buffer);
+               } else {
+                       /* The buffer is not yet full */
+                       MEMCPY_BCOPY(&sha->buffer[usedspace], data, len);
+                       ADDINC128(sha->bitcount, len << 3);
+                       /* Clean up: */
+                       usedspace = freespace = 0;
+                       return 0;
+               }
+       }
+       while (len >= SHA512_BLOCK_LENGTH) {
+               /* Process as many complete blocks as we can */
+               SHA512_Transform(sha, (sha2_word64*)data);
+               ADDINC128(sha->bitcount, SHA512_BLOCK_LENGTH << 3);
+               len -= SHA512_BLOCK_LENGTH;
+               data += SHA512_BLOCK_LENGTH;
+       }
+       if (len > 0) {
+               /* There's left-overs, so save 'em */
+               MEMCPY_BCOPY(sha->buffer, data, len);
+               ADDINC128(sha->bitcount, len << 3);
+       }
+       /* Clean up: */
+       usedspace = freespace = 0;
+
+       return 0;
+}
+
+static int
+sha512_init(Sum_t* p)
+{
+       register Sha512_t*      sha = (Sha512_t*)p;
+
+       MEMCPY_BCOPY(sha->state, sha512_initial_hash_value, 
SHA512_DIGEST_LENGTH);
+       MEMSET_BZERO(sha->buffer, SHA512_BLOCK_LENGTH);
+       sha->bitcount[0] = sha->bitcount[1] =  0;
+
+       return 0;
+}
+
+static Sum_t*
+sha512_open(const Method_t* method, const char* name)
+{
+       Sha512_t*       sha;
+
+       if (sha = newof(0, Sha512_t, 1, 0))
+       {
+               sha->method = (Method_t*)method;
+               sha->name = name;
+               sha512_init((Sum_t*)sha);
+       }
+       return (Sum_t*)sha;
+}
+
+static int
+sha512_done(Sum_t* p)
+{
+       Sha512_t*       sha = (Sha512_t*)p;
+       unsigned int    usedspace;
+       register int    i;
+
+       usedspace = (sha->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+       /* Convert FROM host byte order */
+       REVERSE64(sha->bitcount[0],sha->bitcount[0]);
+       REVERSE64(sha->bitcount[1],sha->bitcount[1]);
+#endif
+       if (usedspace > 0) {
+               /* Begin padding with a 1 bit: */
+               sha->buffer[usedspace++] = 0x80;
+
+               if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
+                       /* Set-up for the last transform: */
+                       MEMSET_BZERO(&sha->buffer[usedspace], 
SHA512_SHORT_BLOCK_LENGTH - usedspace);
+               } else {
+                       if (usedspace < SHA512_BLOCK_LENGTH) {
+                               MEMSET_BZERO(&sha->buffer[usedspace], 
SHA512_BLOCK_LENGTH - usedspace);
+                       }
+                       /* Do second-to-last transform: */
+                       SHA512_Transform(sha, (sha2_word64*)sha->buffer);
+
+                       /* And set-up for the last transform: */
+                       MEMSET_BZERO(sha->buffer, SHA512_BLOCK_LENGTH - 2);
+               }
+       } else {
+               /* Prepare for final transform: */
+               MEMSET_BZERO(sha->buffer, SHA512_SHORT_BLOCK_LENGTH);
+
+               /* Begin padding with a 1 bit: */
+               *sha->buffer = 0x80;
+       }
+       /* Store the length of input data (in bits): */
+       *(sha2_word64*)&sha->buffer[SHA512_SHORT_BLOCK_LENGTH] = 
sha->bitcount[1];
+       *(sha2_word64*)&sha->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = 
sha->bitcount[0];
+
+       /* Final transform: */
+       SHA512_Transform(sha, (sha2_word64*)sha->buffer);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+       {
+               /* Convert TO host byte order */
+               sha2_word64*    d = (sha2_word64*)sha->digest;
+               int             j;
+               for (j = 0; j < 8; j++) {
+                       REVERSE64(sha->state[j],sha->state[j]);
+                       *d++ = sha->state[j];
+               }
+       }
+#else
+       MEMCPY_BCOPY(sha->digest, sha->state, SHA512_DIGEST_LENGTH);
+#endif
+
+       /* accumulate the digests */
+       for (i = 0; i < SHA512_DIGEST_LENGTH; i++)
+               sha->digest_sum[i] ^= sha->digest[i];
+
+       /* Clean up state data: */
+       MEMSET_BZERO(&sha->state, sizeof(*sha) - offsetof(Sha512_t, state));
+       usedspace = 0;
+
+       return 0;
+}
+
+static int
+sha512_print(Sum_t* p, Sfio_t* sp, register int flags)
+{
+       register Sha512_t*      sha = (Sha512_t*)p;
+       register sha2_byte*     d;
+       register sha2_byte*     e;
+
+       d = (flags & SUM_TOTAL) ? sha->digest_sum : sha->digest;
+       e = d + SHA512_DIGEST_LENGTH;
+       while (d < e)
+               sfprintf(sp, "%02x", *d++);
+       return 0;
+}
+
+static int
+sha512_data(Sum_t* p, Sumdata_t* data)
+{
+       register Sha512_t*      sha = (Sha512_t*)p;
+
+       data->size = SHA512_DIGEST_LENGTH;
+       data->num = 0;
+       data->buf = sha->digest;
+       return 0;
+}
+
+/*** SHA-384: *********************************************************/
+
+#define sha384_description "FIPS SHA-384 secure hash algorithm."
+#define sha384_options "\
+[+(version)?sha-384 (FIPS) 2000-01-01]\
+[+(author)?Aaron D. Gifford]\
+"
+#define sha384_match   "sha384|sha-384|SHA384|SHA-384"
+#define sha384_scale   0
+#define sha384_block   sha512_block
+#define sha384_done    sha512_done
+
+#define sha384_padding md5_pad
+
+#define Sha384_t               Sha512_t
+#define SHA384_CTX             Sha384_t
+#define SHA384_DIGEST_LENGTH   48
+
+static int
+sha384_init(Sum_t* p)
+{
+       register Sha384_t*      sha = (Sha384_t*)p;
+
+       MEMCPY_BCOPY(sha->state, sha384_initial_hash_value, 
SHA512_DIGEST_LENGTH);
+       MEMSET_BZERO(sha->buffer, SHA384_BLOCK_LENGTH);
+       sha->bitcount[0] = sha->bitcount[1] = 0;
+
+       return 0;
+}
+
+static Sum_t*
+sha384_open(const Method_t* method, const char* name)
+{
+       Sha384_t*       sha;
+
+       if (sha = newof(0, Sha384_t, 1, 0))
+       {
+               sha->method = (Method_t*)method;
+               sha->name = name;
+               sha384_init((Sum_t*)sha);
+       }
+       return (Sum_t*)sha;
+}
+
+static int
+sha384_print(Sum_t* p, Sfio_t* sp, register int flags)
+{
+       register Sha384_t*      sha = (Sha384_t*)p;
+       register sha2_byte*     d;
+       register sha2_byte*     e;
+
+       d = (flags & SUM_TOTAL) ? sha->digest_sum : sha->digest;
+       e = d + SHA384_DIGEST_LENGTH;
+       while (d < e)
+               sfprintf(sp, "%02x", *d++);
+       return 0;
+}
+
+static int
+sha384_data(Sum_t* p, Sumdata_t* data)
+{
+       register Sha384_t*      sha = (Sha384_t*)p;
+
+       data->size = SHA384_DIGEST_LENGTH;
+       data->num = 0;
+       data->buf = sha->digest;
+       return 0;
+}
+
+#endif /* _typ_int64_t */

Reply via email to