[ksh93-integration-discuss] ksh93 2007-04-18 beta is out... / was: [Fwd: Re: [ast-users] Trouble with "clear &" in ksh93s+ ...]

Felix Schulte felix.schulte at gmail.com
Wed Apr 25 06:20:40 PDT 2007


On 4/19/07, Roland Mainz <roland.mainz at nrubsig.org> wrote:
>
> Hi!
>
> ----
>
> ksh93 2007-04-18 beta is out... I'll start updating the
> ksh93-integration prototype005 tree ASAP to get rid of the "clear
> &"-issue...
>
> -------- Original Message --------
patch diff from 20070328 to 20070418 attached
-- 
      _        Felix Schulte
    _|_|_     mailto:felix.schulte at gmail.com
    (0 0)
ooO--(_)--Ooo
-------------- next part --------------
diff -r -N -u ksh93_2007_03_28/lib/package/ast-ksh.html ksh93_2007_04_18/lib/package/ast-ksh.html
--- ksh93_2007_03_28/lib/package/ast-ksh.html	2007-03-29 19:07:08.000000000 +0200
+++ ksh93_2007_04_18/lib/package/ast-ksh.html	2007-04-18 20:07:29.000000000 +0200
@@ -193,7 +193,9 @@
 <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-04-18  --- Release ksh93s+  ---
+07-04-18  A small memory leak with each redirection of a non-builtin has
+	  been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
 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.
@@ -1652,6 +1654,10 @@
 <P><HR><CENTER><FONT color=red><FONT face=courier><H3><A name="libast changes">libast changes</A></H3></FONT></FONT></CENTER>
 <PRE>
 
+07-04-13 tm/tmxdate.c,tm/tmzone.c: handle &#0091;-+&#0093;0000 UTC zone offset
+07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
+07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER =&gt; nan/inf vs. NAN/INF
+07-04-02 comp/conf.tab,comp/conf.sh: add C/POSIX &lt;stdint.h&gt; symbols
 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_)
@@ -3358,7 +3364,7 @@
 <TR>
 <TD align=left></TD>
 <TD align=center></TD>
-<TD align=right>March 29, 2007</TD>
+<TD align=right>April 18, 2007</TD>
 </TR>
 </TABLE>
 <P>
diff -r -N -u ksh93_2007_03_28/lib/package/ast-ksh.README ksh93_2007_04_18/lib/package/ast-ksh.README
--- ksh93_2007_03_28/lib/package/ast-ksh.README	2007-03-29 19:07:08.000000000 +0200
+++ ksh93_2007_04_18/lib/package/ast-ksh.README	2007-04-18 20:07:28.000000000 +0200
@@ -92,7 +92,9 @@
 
 :::::::: ksh93 ::::::::
 
-07-03-08  --- Release ksh93s+  ---
+07-04-18  --- Release ksh93s+  ---
+07-04-18  A small memory leak with each redirection of a non-builtin has
+	  been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
 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.
@@ -1548,6 +1550,10 @@
 
 :::::::: libast ::::::::
 
+07-04-13 tm/tmxdate.c,tm/tmzone.c: handle [-+]0000 UTC zone offset
+07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
+07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER => nan/inf vs. NAN/INF
+07-04-02 comp/conf.tab,comp/conf.sh: add C/POSIX <stdint.h> symbols
 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_)
diff -r -N -u ksh93_2007_03_28/lib/package/ast-ksh.ver ksh93_2007_04_18/lib/package/ast-ksh.ver
--- ksh93_2007_03_28/lib/package/ast-ksh.ver	2007-03-28 18:39:59.000000000 +0200
+++ ksh93_2007_04_18/lib/package/ast-ksh.ver	2007-04-18 20:07:27.000000000 +0200
@@ -1 +1 @@
-ast-ksh 2007-03-28 2007-03-28 1
+ast-ksh 2007-04-18 2007-04-18 1
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/bltins/print.c ksh93_2007_04_18/src/cmd/ksh93/bltins/print.c
--- ksh93_2007_03_28/src/cmd/ksh93/bltins/print.c	2007-02-14 08:54:57.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/bltins/print.c	2007-04-12 20:21:06.000000000 +0200
@@ -561,12 +561,14 @@
 		case 'e':
 		case 'f':
 		case 'g':
-			value->f = 0.;
-			break;
 		case 'A':
 		case 'E':
+		case 'F':
 		case 'G':
-			value->ld = 0.;
+                        if(SFFMT_LDOUBLE)
+				value->ld = 0.;
+			else
+				value->d = 0.;
 			break;
 		case 'n':
 			value->ip = &pp->intvar;
@@ -693,8 +695,8 @@
 		case 'g':
 		case 'A':
 		case 'E':
+		case 'F':
 		case 'G':
-			fe->size = sizeof(value->d);
 			d = sh_strnum(*pp->nextarg,&lastchar,0);
                         if(SFFMT_LDOUBLE)
 			{
@@ -702,7 +704,10 @@
 				fe->size = sizeof(value->ld);
 			}
 			else
+			{
 				value->d = d;
+				fe->size = sizeof(value->d);
+			}
 			break;
 		case 'Q':
 			value->ll = (Sflong_t)strelapsed(*pp->nextarg,&lastchar,1);
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/bltins/typeset.c ksh93_2007_04_18/src/cmd/ksh93/bltins/typeset.c
--- ksh93_2007_03_28/src/cmd/ksh93/bltins/typeset.c	2007-03-22 17:19:09.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/bltins/typeset.c	2007-04-11 04:36:37.000000000 +0200
@@ -118,7 +118,11 @@
 	}
 #endif
 	else
+	{
 		flag = (NV_ASSIGN|NV_EXPORT|NV_IDENT);
+		if(!sh.prefix)
+			sh.prefix = "";
+	}
 	return(b_common(argv,flag,tdata.sh->var_tree, &tdata));
 }
 
@@ -344,6 +348,8 @@
 	Shell_t *shp =tp->sh;
 	if(!sh.prefix)
 		nvflags |= NV_NOSCOPE;
+	else if(*sh.prefix==0)
+		sh.prefix = 0;
 	flag &= ~(NV_NOARRAY|NV_NOSCOPE|NV_VARNAME|NV_IDENT);
 	if(argv[1])
 	{
@@ -698,6 +704,7 @@
 int    b_set(int argc,register char *argv[],void *extra)
 {
 	struct tdata tdata;
+	memset(&tdata,0,sizeof(tdata));
 	tdata.sh = (Shell_t*)extra;
 	tdata.prefix=0;
 	if(argv[1])
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/include/edit.h ksh93_2007_04_18/src/cmd/ksh93/include/edit.h
--- ksh93_2007_03_28/src/cmd/ksh93/include/edit.h	2007-02-14 08:56:39.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/include/edit.h	2007-04-10 16:54:16.000000000 +0200
@@ -60,7 +60,7 @@
 
 #define TABSIZE	8
 #define PRSIZE	160
-#define MAXLINE	502		/* longest edit line permitted */
+#define MAXLINE	1024		/* longest edit line permitted */
 
 typedef struct _edit_pos
 {
@@ -154,7 +154,7 @@
 } Edit_t;
 
 #undef MAXWINDOW
-#define MAXWINDOW	160	/* maximum width window */
+#define MAXWINDOW	300	/* maximum width window */
 #define FAST	2
 #define SLOW	1
 #define ESC	cntl('[')
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/include/jobs.h ksh93_2007_04_18/src/cmd/ksh93/include/jobs.h
--- ksh93_2007_03_28/src/cmd/ksh93/include/jobs.h	2006-09-14 19:22:11.000000000 +0200
+++ ksh93_2007_04_18/src/cmd/ksh93/include/jobs.h	2007-04-10 23:07:19.000000000 +0200
@@ -64,7 +64,7 @@
 	pid_t		p_fgrp;		/* process group when stopped */
 	short		p_job;		/* job number of process */
 	unsigned short	p_exit;		/* exit value or signal number */
-	unsigned char	p_flag;		/* flags - see below */
+	unsigned short	p_flag;		/* flags - see below */
 	int		p_env;		/* subshell environment number */
 #ifdef JOBS
 	off_t		p_name;		/* history file offset for command */
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/RELEASE ksh93_2007_04_18/src/cmd/ksh93/RELEASE
--- ksh93_2007_03_28/src/cmd/ksh93/RELEASE	2007-03-27 20:54:06.000000000 +0200
+++ ksh93_2007_04_18/src/cmd/ksh93/RELEASE	2007-04-18 16:21:50.000000000 +0200
@@ -1,4 +1,6 @@
-07-03-08  --- Release ksh93s+  ---
+07-04-18  --- Release ksh93s+  ---
+07-04-18  A small memory leak with each redirection of a non-builtin has
+	  been fixed.
 07-03-08  A bug in which set +o output command line options has been fixed.
 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.
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/sh/arith.c ksh93_2007_04_18/src/cmd/ksh93/sh/arith.c
--- ksh93_2007_03_28/src/cmd/ksh93/sh/arith.c	2007-03-14 17:02:22.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/sh/arith.c	2007-04-12 20:13:29.000000000 +0200
@@ -190,13 +190,13 @@
 					}
 				}
 				*str = 0;
-				if(strcmp(*ptr,"Inf")==0)
+				if(strcasecmp(*ptr,"Inf")==0)
 				{
 					Inf = 1.0/Zero;
 					Infnod.nvalue.ldp = &Inf;
 					np = &Infnod;
 				}
-				else if(strcmp(*ptr,"NaN")==0)
+				else if(strcasecmp(*ptr,"NaN")==0)
 				{
 					NaN = 0.0/Zero;
 					NaNnod.nvalue.ldp = &NaN;
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/sh/init.c ksh93_2007_04_18/src/cmd/ksh93/sh/init.c
--- ksh93_2007_03_28/src/cmd/ksh93/sh/init.c	2007-03-14 17:02:29.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/sh/init.c	2007-04-11 18:10:20.000000000 +0200
@@ -791,7 +791,11 @@
 	register int		t = 0;
 	
 	if (s = (const char*)strrchr(path, '/'))
+	{
+		if (*path == '-')
+			t |= SH_TYPE_LOGIN;
 		s++;
+	}
 	else
 		s = path;
 	if (*s == '-')
@@ -945,7 +949,7 @@
 			buff[n] = 0;
 			sh.shpath = strdup(buff);
 		}
-		else if((cp && (last=strrchr(cp,'/')) && sh_type(last+1)) || (argc>0 && (last=strrchr(cp= *argv,'/'))))
+		else if((cp && (sh_type(cp)&SH_TYPE_SH)) || (argc>0 && strchr(cp= *argv,'/')))
 		{
 			if(*cp=='/')
 				sh.shpath = strdup(cp);
@@ -1415,12 +1419,8 @@
 		nv_offattr(PWDNOD,NV_TAGGED);
 		path_pwd(0);
 	}
-	if(cp = nv_getval(SHELLNOD))
-	{
-		cp = path_basename(cp);
-		if(sh_type(cp)&SH_TYPE_RESTRICTED)
-			sh_onoption(SH_RESTRICTED); /* restricted shell */
-	}
+	if((cp = nv_getval(SHELLNOD)) && (sh_type(cp)&SH_TYPE_RESTRICTED))
+		sh_onoption(SH_RESTRICTED); /* restricted shell */
 	return;
 }
 
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/sh/jobs.c ksh93_2007_04_18/src/cmd/ksh93/sh/jobs.c
--- ksh93_2007_03_28/src/cmd/ksh93/sh/jobs.c	2007-03-03 02:42:46.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/sh/jobs.c	2007-04-10 23:15:58.000000000 +0200
@@ -59,19 +59,14 @@
 	unsigned short	exitval;
 };
 
-static struct jobsave *job_savelist;
-
 /*
  * return next on link list of jobsave free list
  */
 static struct jobsave *jobsave_create(pid_t pid)
 {
-	register struct jobsave *jp = job_savelist;
-	if(jp)
-	{
-		job_savelist = jp->next;
+	struct jobsave *jp;
+	if(jp = newof(0,struct jobsave,1,0))
 		jp->pid = pid;
-	}
 	return(jp);
 }
 
@@ -111,6 +106,7 @@
 #define P_DONE		040
 #define P_COREDUMP	0100
 #define P_DISOWN	0200
+#define P_FG		0400
 
 static int		job_chksave(pid_t);
 static struct process	*job_bypid(pid_t);
@@ -371,12 +367,6 @@
 void job_init(int lflag)
 {
 	register int i,ntry=0;
-	struct jobsave *jp;
-	/* create a jobsave freelist */
-	job_savelist = (struct jobsave*)malloc(sh.lim.child_max*sizeof(struct jobsave));
-	for(jp=job_savelist,i=1; i < sh.lim.child_max; i++, jp++)
-		jp->next = (jp+1);
-	jp->next = 0;
 	job.fd = JOBTTY;
 	signal(SIGCHLD,job_waitsafe);
 #   if defined(SIGCLD) && (SIGCLD!=SIGCHLD)
@@ -612,8 +602,9 @@
 	if(tcsetpgrp(job.fd,sh.pid) !=0)
 		return;
 #endif	/* SIGTSTP */
-	/* force the following tty_get() to do a tcgetattr() */
-	tty_set(-1, 0, NIL(struct termios*));
+	/* force the following tty_get() to do a tcgetattr() unless fg */
+	if(!(pw->p_flag&P_FG))
+		tty_set(-1, 0, NIL(struct termios*));
 	if(pw && (pw->p_flag&P_SIGNALLED) && pw->p_exit!=SIGHUP)
 	{
 		if(tty_get(job.fd,&pw->p_stty) == 0)
@@ -1000,8 +991,7 @@
 	for(jp=bck.list; jp;jp=jpnext)
 	{
 		jpnext = jp->next;
-		jp->next = job_savelist;
-		job_savelist = jp;
+		free((void*)jp);
 	}
 	bck.list = 0;
 	job.pwlist = NIL(struct process*);
@@ -1382,6 +1372,7 @@
 			return(1);
 		}
 		job.waitall = 1;
+		pw->p_flag |= P_FG;
 		job_wait(pw->p_pid);
 		job.waitall = 0;
 	}
@@ -1603,8 +1594,7 @@
 		else
 			bck.list = jp->next;
 		bck.count--;
-		jp->next = job_savelist; 
-		job_savelist = jp;
+		free((void*)jp);
 	}
 	return(r);
 }
@@ -1638,8 +1628,7 @@
 	for(jp=bck.list,bck= *bp; jp; jp=jpnext)
 	{
 		jpnext = jp->next;
-		jp->next = job_savelist;
-		job_savelist = jp;
+		free((void*)jp);
 	}
 	free(ptr);
 	job_unlock();
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/sh/main.c ksh93_2007_04_18/src/cmd/ksh93/sh/main.c
--- ksh93_2007_03_28/src/cmd/ksh93/sh/main.c	2007-03-05 23:51:41.000000000 +0100
+++ ksh93_2007_04_18/src/cmd/ksh93/sh/main.c	2007-04-11 18:03:39.000000000 +0200
@@ -269,6 +269,7 @@
 				if(strmatch(name,e_devfdNN))
 				{
 					char *cp;
+					int type;
 					fdin = (int)strtol(name+8, (char**)0, 10);
 					if(fstat(fdin,&statb)<0)
 						errormsg(SH_DICT,ERROR_system(1),e_open,error_info.id);
@@ -277,10 +278,9 @@
 					 * try to undo effect of solaris 2.5+
 					 * change for argv for setuid scripts
 					 */
-					cp = path_basename(*av);
-					if(sh_type(cp) && (!(name=nv_getval(L_ARGNOD)) || !sh_type(cp = path_basename(name))))
+					if(((type = sh_type(cp = av[0])) & SH_TYPE_SH) && (!(name = nv_getval(L_ARGNOD)) || !((type = sh_type(cp = name)) & SH_TYPE_SH)))
 					{
-						av[0] = cp;
+						av[0] = (type & SH_TYPE_LOGIN) ? cp : path_basename(cp);
 						/*  exec to change $0 for ps */
 						execv(pathshell(),av);
 						/* exec fails */
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/sh/xec.c ksh93_2007_04_18/src/cmd/ksh93/sh/xec.c
--- ksh93_2007_03_28/src/cmd/ksh93/sh/xec.c	2007-03-27 20:10:43.000000000 +0200
+++ ksh93_2007_04_18/src/cmd/ksh93/sh/xec.c	2007-04-18 15:17:02.000000000 +0200
@@ -1190,6 +1190,8 @@
 			}
 			sh_popcontext(&buff);
 			sh_iorestore(buff.topfd,jmpval);
+			if(buff.olist)
+				free_list(buff.olist);
 			if(type&FPIN)
 			{
 				job.waitall = waitall;
@@ -2878,6 +2880,8 @@
 	else
 		exitset();
 	sh_popcontext(&buff);
+	if(buff.olist)
+		free_list(buff.olist);
 #ifdef SIGTSTP
 	if(jobwasset)
 	{
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/tests/arith.sh ksh93_2007_04_18/src/cmd/ksh93/tests/arith.sh
--- ksh93_2007_03_28/src/cmd/ksh93/tests/arith.sh	2006-10-24 16:29:06.000000000 +0200
+++ ksh93_2007_04_18/src/cmd/ksh93/tests/arith.sh	2007-04-12 20:16:03.000000000 +0200
@@ -442,25 +442,25 @@
 [[ $x == "$((x))" ]] || err_exit  '$x !- $((x)) when x is pi'
 $SHELL -c  "[[  ${x//./} == {14,100}(\d) ]]" 2> /dev/null || err_exit 'pi has less than 14 significant places'
 if	(( Inf+1 == Inf ))
-then	[[ $(printf "%g\n" $((Inf))) == Inf ]] || err_exit 'printf "%g\n" $((Inf) fails'
-#	[[ $(printf "%g\n" $((Nan))) == Inf ]] || err_exit 'printf "%g\n" $((Nan) fails'
-	[[ $(printf "%g\n" Inf) == Inf ]] || err_exit 'printf "%g\n" Inf fails'
-	[[ $(printf "%g\n" NaN) == NaN ]] || err_exit 'printf "%g\n" NaN fails'
-	[[ $(print -- $((Inf))) == Inf ]] || err_exit 'print -- $((Inf)) fails'
+then	[[ $(printf "%g\n" $((Inf))) == inf ]] || err_exit 'printf "%g\n" $((Inf)) fails'
+#	[[ $(printf "%g\n" $((Nan))) == inf ]] || err_exit 'printf "%g\n" $((Nan)) fails'
+	[[ $(printf "%g\n" Inf) == inf ]] || err_exit 'printf "%g\n" Inf fails'
+	[[ $(printf "%g\n" NaN) == nan ]] || err_exit 'printf "%g\n" NaN fails'
+	[[ $(print -- $((Inf))) == inf ]] || err_exit 'print -- $((Inf)) fails'
 	(( 1.0/0.0 == Inf )) || err_exit '1.0/0.0 != Inf'
-	[[ $(print -- $((0.0/0.0))) == NaN ]] || err_exit '0.0/0.0 != NaN'
+	[[ $(print -- $((0.0/0.0))) == nan ]] || err_exit '0.0/0.0 != NaN'
 	(( Inf*Inf == Inf )) || err_exit 'Inf*Inf != Inf'
 	(( NaN != NaN )) || err_exit 'NaN == NaN'
 	(( -5*Inf == -Inf )) || err_exit '-5*Inf != -Inf'
-	[[ $(print -- $((sqrt(-1.0)))) == NaN ]]|| err_exit 'sqrt(-1.0) != NaN'
+	[[ $(print -- $((sqrt(-1.0)))) == nan ]]|| err_exit 'sqrt(-1.0) != NaN'
 	(( pow(1.0,Inf) == 1.0 )) || err_exit 'pow(1.0,Inf) != 1.0'
 	(( pow(Inf,0.0) == 1.0 )) || err_exit 'pow(Inf,0.0) != 1.0'
-	[[ $(print -- $((NaN/Inf))) == NaN ]] || err_exit 'NaN/Inf != NaN'
+	[[ $(print -- $((NaN/Inf))) == nan ]] || err_exit 'NaN/Inf != NaN'
 	(( 4.0/Inf == 0.0 )) || err_exit '4.0/Inf != 0.0'
 else	err_exit 'Inf and NaN not working'
 fi
 unset x y
 float x=14.555 y
 y=$(printf "%a" x)
-(( x == y )) || err_exit 'output of printf %a not self preserving'
+(( x == y )) || err_exit "output of printf %a not self preserving -- expected $x, got $y"
 exit $((Errors))
diff -r -N -u ksh93_2007_03_28/src/cmd/ksh93/tests/attributes.sh ksh93_2007_04_18/src/cmd/ksh93/tests/attributes.sh
--- ksh93_2007_03_28/src/cmd/ksh93/tests/attributes.sh	2007-03-27 20:22:54.000000000 +0200
+++ ksh93_2007_04_18/src/cmd/ksh93/tests/attributes.sh	2007-04-11 04:42:02.000000000 +0200
@@ -208,6 +208,7 @@
 {
 	export foo=hello 
 	typeset -x  bar=world
+	[[ $foo == hello ]] || err_exit 'export scoping problem in function'
 } 
 fun
 [[ $(export | grep foo) == 'foo=hello' ]] || err_exit 'export not working in functions'
diff -r -N -u ksh93_2007_03_28/src/lib/libast/comp/conf.sh ksh93_2007_04_18/src/lib/libast/comp/conf.sh
--- ksh93_2007_03_28/src/lib/libast/comp/conf.sh	2007-03-06 21:22:41.000000000 +0100
+++ ksh93_2007_04_18/src/lib/libast/comp/conf.sh	2007-04-02 21:43:47.000000000 +0200
@@ -21,7 +21,7 @@
 ########################################################################
 : generate getconf and limits info
 #
-# @(#)conf.sh (AT&T Research) 2007-03-06
+# @(#)conf.sh (AT&T Research) 2007-04-02
 #
 # this script generates these files from the table file in the first arg
 # the remaining args are the C compiler name and flags
@@ -70,6 +70,7 @@
 #include "FEATURE/common"'
 tail='#include "FEATURE/param"'
 generated="/* : : generated by $command from $1 : : */"
+hdr=
 ifs=${IFS-'
 	 '}
 nl='
@@ -189,7 +190,23 @@
 					IFS=$ifs
 					break
 					;;
-				*.h)	headers=$headers$nl#include$sp'<'$1'>'
+				*.h)	case $shell in
+					ksh)	f=${1%.h} ;;
+					*)	f=`echo $1 | sed 's,\.h$,,'` ;;
+					esac
+					case " $hdr " in
+					*" $f "*)
+						headers=$headers$nl#include$sp'<'$1'>'
+						;;
+					*" -$f- "*)
+						;;
+					*)	if	iffe -n - hdr $f | grep -q _hdr_$f
+						then	hdr="$hdr $f"
+							headers=$headers$nl#include$sp'<'$1'>'
+						else	hdr="$hdr -$f-"
+						fi
+						;;
+					esac
 					;;
 				*)	values=$values$sp$1
 					case $1 in
@@ -1040,12 +1057,13 @@
 						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" ;;
+						SIZE_*|U*|*_MAX)	
+							f="%${LL}u"
+							t="unsigned _ast_intmax_t"
+							;;
+						*)	f="%${LL}d"
+							t="_ast_intmax_t"
+							;;
 						esac
 						cat > $tmp.c <<!
 ${head}
@@ -1057,7 +1075,7 @@
 int
 main()
 {
-	printf("$f\n", $conf_name);
+	printf("$f\n", ($t)$conf_name);
 	return 0;
 }
 !
@@ -1160,6 +1178,16 @@
 	esac
 	conf_minmax=0
 	case $call:$standard:$flags in
+	*:C:*M*)for s in _${standard}_${conf_name} ${values}
+		do	case $s in
+			$sym)	;;
+			*)	conf_minmax=$s
+				conf_flags="${conf_flags}|CONF_MINMAX_DEF"
+				break
+				;;
+			esac
+		done
+		;;
 	*:C:*)	;;
 	[CPSX][CSX]:*:*[FM]*)
 		x=
diff -r -N -u ksh93_2007_03_28/src/lib/libast/comp/conf.tab ksh93_2007_04_18/src/lib/libast/comp/conf.tab
--- ksh93_2007_03_28/src/lib/libast/comp/conf.tab	2007-03-01 08:38:58.000000000 +0100
+++ ksh93_2007_04_18/src/lib/libast/comp/conf.tab	2007-04-02 21:45:47.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # posix { getconf limits } macro table
 #
-# @(#)conf.tab (AT&T Research) 2007-02-14
+# @(#)conf.tab (AT&T Research) 2007-04-01
 #
 # name standard section call flags [ header ... ] [ value ... ]
 #
@@ -412,6 +412,8 @@
 PTHREAD_KEYS_MAX		C	QQ 1 L
 PTHREAD_STACK_MIN		C	QQ 1 L
 PTHREAD_THREADS_MAX		C	QQ 1 L
+PTRDIFF_MAX			C	XX 1 LMU	stdint.h 65535
+PTRDIFF_MIN			C	XX 1 LMU	stdint.h -65535
 RAW_SOCKETS			POSIX	SC 1 FUW
 READER_WRITER_LOCKS		POSIX	SC 1 FUW
 REALTIME			XOPEN	SC 1 FU
@@ -473,10 +475,13 @@
 SHM				XOPEN	SC 1 FSUW
 SHRT_MAX			C	XX 1 L		32767
 SHRT_MIN			C	XX 1 L		-32767
+SIG_ATOMIC_MAX			C	XX 1 L		signal.h
+SIG_ATOMIC_MIN			C	XX 1 L		signal.h
+SIGQUEUE_MAX			POSIX	SC 1 LMU	32
 SIGQUEUE_MAX			POSIX	SC 1 LMU	32
 SIGRT_MAX			SVID	SC 1 0
 SIGRT_MIN			SVID	SC 1 0
-SIZE_MAX			C	XX 1 LMX	UINT_MAX 65535
+SIZE_MAX			C	XX 1 LMX	stdint.h UINT_MAX 65535
 SLVM_MAXNODES			C	QQ 1 L
 SOCK_MAXBUF			C	QQ 1 0
 SOFTPOWER			C	QQ 1 L
@@ -523,7 +528,7 @@
 TIMERS				POSIX	SC 1 CDFUW
 TIMER_MAX			POSIX	SC 1 LMU	32
 TMP				AST	CS 1 MU		"/tmp"
-TMP_MAX				C	SC 1 LMU	33520641
+TMP_MAX				C	SC 1 LMU	10000
 TRACE				POSIX	SC 1 FUW
 TRACE_EVENT_FILTER		POSIX	SC 1 FUW
 TRACE_EVENT_NAME_MAX		POSIX	SC 1 FUVW
@@ -565,6 +570,10 @@
 VERSION_90			POSIX	SC 1 FSU
 VERSION_93			C	XX 1 L
 VERSION_93			POSIX	SC 1 FSU
+WCHAR_MAX			C	XX 1 L		stddef.h
+WCHAR_MIN			C	XX 1 L		stddef.h
+WINT_MIN			C	XX 1 L		wchar.h
+WINT_MAX			C	XX 1 L		wchar.h
 WORD_BIT			XOPEN	XX 1 L		(8*sizeof(int))
 XCU_VERSION			XOPEN	SC 1 CDFSU
 XPG2				XOPEN	XX 1 FU
diff -r -N -u ksh93_2007_03_28/src/lib/libast/RELEASE ksh93_2007_04_18/src/lib/libast/RELEASE
--- ksh93_2007_03_28/src/lib/libast/RELEASE	2007-03-28 08:15:10.000000000 +0200
+++ ksh93_2007_04_18/src/lib/libast/RELEASE	2007-04-13 19:09:16.000000000 +0200
@@ -1,3 +1,7 @@
+07-04-13 tm/tmxdate.c,tm/tmzone.c: handle [-+]0000 UTC zone offset
+07-04-11 sfio/sfvprintf.c: add %F, propagate SFFMT_UPPER
+07-04-11 sfio/sfcvt.c: handle SFFMT_UPPER => nan/inf vs. NAN/INF
+07-04-02 comp/conf.tab,comp/conf.sh: add C/POSIX <stdint.h> symbols
 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_)
diff -r -N -u ksh93_2007_03_28/src/lib/libast/sfio/sfcvt.c ksh93_2007_04_18/src/lib/libast/sfio/sfcvt.c
--- ksh93_2007_03_28/src/lib/libast/sfio/sfcvt.c	2007-01-04 16:54:32.000000000 +0100
+++ ksh93_2007_04_18/src/lib/libast/sfio/sfcvt.c	2007-04-12 21:28:50.000000000 +0200
@@ -26,11 +26,13 @@
 **	Written by Kiem-Phong Vo and Glenn Fowler (SFFMT_AFORMAT)
 */
 
-static char		*Inf = "Inf", *Zero = "0", *Nan = "NaN";
+static char		*lc_inf = "inf", *uc_inf = "INF";
+static char		*lc_nan = "nan", *uc_nan = "NAN";
+static char		*Zero = "0";
+#define SF_INF		((_Sfi = 3), strncpy(buf, (format & SFFMT_UPPER) ? uc_inf : lc_inf, size))
+#define SF_NAN		((_Sfi = 3), strncpy(buf, (format & SFFMT_UPPER) ? uc_nan : lc_nan, size))
+#define SF_ZERO		((_Sfi = 1), strncpy(buf, Zero, size))
 #define SF_INTPART	(SF_IDIGITS/2)
-#define SF_INFINITE	((_Sfi = 3), Inf)
-#define SF_ZERO		((_Sfi = 1), Zero)
-#define SF_NAN		((_Sfi = 3), Nan)
 
 #if ! _lib_isnan
 #if _lib_fpclassify
@@ -77,7 +79,7 @@
 	if (n = isinf(dv))
 	{	if (n < 0)
 			*sign = 1;
-		return SF_INFINITE;
+		return SF_INF;
 	}
 #endif
 #if !_ast_fltmax_double
@@ -104,7 +106,7 @@
 		switch (fpclassify(f))
 		{
 		case FP_INFINITE:
-			return SF_INFINITE;
+			return SF_INF;
 		case FP_NAN:
 			return SF_NAN;
 		case FP_ZERO:
@@ -120,7 +122,7 @@
 		if(f < LDBL_MIN)
 			return SF_ZERO;
 		if(f > LDBL_MAX)
-			return SF_INFINITE;
+			return SF_INF;
 
 		if(format & SFFMT_AFORMAT)
 		{	Sfdouble_t	g;
@@ -161,7 +163,7 @@
 				{
 					f *= _Sfneg10[v];
 					if((n += (1<<v)) >= SF_IDIGITS)
-						return SF_INFINITE;
+						return SF_INF;
 				}
 			} while(f >= (Sfdouble_t)SF_MAXLONG);
 		}
@@ -176,7 +178,7 @@
 
 			n = b-sp;
 			if((*decpt += (int)n) >= SF_IDIGITS)
-				return SF_INFINITE;
+				return SF_INF;
 			b = sp;
 			sp = buf + SF_INTPART;
 		}
@@ -228,7 +230,7 @@
 		if (n = isinf(f))
 		{	if (n < 0)
 				*sign = 1;
-			return SF_INFINITE;
+			return SF_INF;
 		}
 #endif
 #if _c99_in_the_wild
@@ -248,7 +250,7 @@
 		switch (fpclassify(f))
 		{
 		case FP_INFINITE:
-			return SF_INFINITE;
+			return SF_INF;
 		case FP_NAN:
 			return SF_NAN;
 		case FP_ZERO:
@@ -264,7 +266,7 @@
 		if(f < DBL_MIN)
 			return SF_ZERO;
 		if(f > DBL_MAX)
-			return SF_INFINITE;
+			return SF_INF;
 
 		if(format & SFFMT_AFORMAT)
 		{	double	g;
@@ -303,7 +305,7 @@
 				else
 				{	f *= _Sfneg10[v];
 					if((n += (1<<v)) >= SF_IDIGITS)
-						return SF_INFINITE;
+						return SF_INF;
 				}
 			} while(f >= (double)SF_MAXLONG);
 		}
@@ -318,7 +320,7 @@
 
 			n = b-sp;
 			if((*decpt += (int)n) >= SF_IDIGITS)
-				return SF_INFINITE;
+				return SF_INF;
 			b = sp;
 			sp = buf + SF_INTPART;
 		}
diff -r -N -u ksh93_2007_03_28/src/lib/libast/sfio/sfvprintf.c ksh93_2007_04_18/src/lib/libast/sfio/sfvprintf.c
--- ksh93_2007_03_28/src/lib/libast/sfio/sfvprintf.c	2007-02-21 20:27:39.000000000 +0100
+++ ksh93_2007_04_18/src/lib/libast/sfio/sfvprintf.c	2007-04-12 21:34:05.000000000 +0200
@@ -124,7 +124,7 @@
 	int		argp, argn;	/* arg position and number	*/
 
 #define SLACK		1024
-	char		buf[SF_MAXDIGITS+SLACK], tmp[SF_MAXDIGITS], data[SF_GRAIN];
+	char		buf[SF_MAXDIGITS+SLACK], tmp[SF_MAXDIGITS+1], data[SF_GRAIN];
 	int		decimal = 0, thousand = 0;
 
 #if _has_multibyte
@@ -1099,7 +1099,7 @@
 		case 'g': case 'G': /* these ultimately become %e or %f */
 		case 'a': case 'A':
 		case 'e': case 'E':
-		case 'f':
+		case 'f': case 'F':
 #if !_ast_fltmax_double
 			if(size == sizeof(Sfdouble_t) )
 			{	v = SFFMT_LDOUBLE;
@@ -1111,28 +1111,28 @@
 				dval = argv.d;
 			}
 
-			if(fmt == 'e' || fmt == 'E')
-			{	n = (precis = precis < 0 ? FPRECIS : precis)+1;
-				v |= SFFMT_EFORMAT;
-				ep = _sfcvt(dval,tmp,sizeof(tmp), min(n,SF_FDIGITS),
+			if(fmt == 'e' || fmt == 'E' && (v |= SFFMT_UPPER))
+			{	v |= SFFMT_EFORMAT;
+				n = (precis = precis < 0 ? FPRECIS : precis)+1;
+				ep = _sfcvt(dval,tmp+1,sizeof(tmp)-1, min(n,SF_FDIGITS),
 					    &decpt, &sign, &n_s, v);
 				goto e_format;
 			}
-			else if(fmt == 'f' || fmt == 'F')
+			else if(fmt == 'f' || fmt == 'F' && (v |= SFFMT_UPPER))
 			{	precis = precis < 0 ? FPRECIS : precis;
-				ep = _sfcvt(dval,tmp,sizeof(tmp), min(precis,SF_FDIGITS),
+				ep = _sfcvt(dval,tmp+1,sizeof(tmp)-1, min(precis,SF_FDIGITS),
 					    &decpt, &sign, &n_s, v);
 				goto f_format;
 			}
-			else if(fmt == 'a' || fmt == 'A')
-			{	if(precis < 0)
-				{	if(v == SFFMT_LDOUBLE)
+			else if(fmt == 'a' || fmt == 'A' && (v |= SFFMT_UPPER))
+			{	v |= SFFMT_AFORMAT;
+				if(precis < 0)
+				{	if(v & SFFMT_LDOUBLE)
 						precis = 2*(sizeof(Sfdouble_t) - 2);
 					else	precis = 2*(sizeof(double) - 2);
 				}
 				n = precis + 1;
-				v |= SFFMT_AFORMAT | (fmt == 'A' ? SFFMT_UPPER : 0);
-				ep = _sfcvt(dval,tmp,sizeof(tmp), min(n,SF_FDIGITS),
+				ep = _sfcvt(dval,tmp+1,sizeof(tmp)-1, min(n,SF_FDIGITS),
 					    &decpt, &sign, &n_s, v);
 
 				sp = endsp = buf+1;	/* reserve space for sign */
@@ -1144,8 +1144,10 @@
 			}
 			else /* 'g' or 'G' format */
 			{	precis = precis < 0 ? FPRECIS : precis == 0 ? 1 : precis;
+				if(fmt == 'G')
+					v |= SFFMT_UPPER;
 				v |= SFFMT_EFORMAT;
-				ep = _sfcvt(dval,tmp,sizeof(tmp), min(precis,SF_FDIGITS),
+				ep = _sfcvt(dval,tmp+1,sizeof(tmp)-1, min(precis,SF_FDIGITS),
 					    &decpt, &sign, &n_s, v);
 				if(dval == 0.)
 					decpt = 1;
@@ -1214,6 +1216,7 @@
 			if(isalpha(*ep))
 			{
 			infinite:
+				flags &= ~SFFMT_ZERO;
 				endsp = (sp = ep)+sfslen();
 				ep = endep;
 				precis = 0;
diff -r -N -u ksh93_2007_03_28/src/lib/libast/tm/tmxdate.c ksh93_2007_04_18/src/lib/libast/tm/tmxdate.c
--- ksh93_2007_03_28/src/lib/libast/tm/tmxdate.c	2006-12-26 23:15:08.000000000 +0100
+++ ksh93_2007_04_18/src/lib/libast/tm/tmxdate.c	2007-04-13 19:07:06.000000000 +0200
@@ -189,8 +189,9 @@
 		{
 			if (*s == '.' || *s == '-' || *s == '+')
 			{
-				if (((set|state) & (YEAR|MONTH|HOUR|MINUTE|ZONE)) == (YEAR|MONTH|HOUR|MINUTE) && (zone = tmgoff(s, &t, 0)))
+				if (((set|state) & (YEAR|MONTH|HOUR|MINUTE|ZONE)) == (YEAR|MONTH|HOUR|MINUTE) && (i = tmgoff(s, &t, TM_LOCALZONE)) != TM_LOCALZONE)
 				{
+					zone = i;
 					state |= ZONE;
 					if (!*(s = t))
 						break;
diff -r -N -u ksh93_2007_03_28/src/lib/libast/tm/tmzone.c ksh93_2007_04_18/src/lib/libast/tm/tmzone.c
--- ksh93_2007_03_28/src/lib/libast/tm/tmzone.c	1998-11-12 06:50:34.000000000 +0100
+++ ksh93_2007_04_18/src/lib/libast/tm/tmzone.c	2007-04-13 19:07:22.000000000 +0200
@@ -56,7 +56,7 @@
 	static char		off[16];
 
 	tmset(tm_info.zone);
-	if ((*name == '+' || *name == '-') && (fixed.west = tmgoff(name, &e, 0)) && !*e)
+	if ((*name == '+' || *name == '-') && (fixed.west = tmgoff(name, &e, TM_LOCALZONE)) != TM_LOCALZONE && !*e)
 	{
 		fixed.standard = fixed.daylight = strncpy(off, name, sizeof(off) - 1);
 		if (end)


More information about the ksh93-integration-discuss mailing list