Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 7445888659893398b01d014bc633b458 > files > 40

ksh-20100621-18.el5.src.rpm

diff -up ksh-20100621/src/cmd/ksh93/sh/init.c.rightjust ksh-20100621/src/cmd/ksh93/sh/init.c
--- ksh-20100621/src/cmd/ksh93/sh/init.c.rightjust	2012-07-25 11:25:58.883602020 +0200
+++ ksh-20100621/src/cmd/ksh93/sh/init.c	2012-07-25 11:25:58.932602392 +0200
@@ -1719,72 +1719,107 @@ static Dt_t *inittree(Shell_t *shp,const
 
 static void env_init(Shell_t *shp)
 {
-	register char *cp;
-	register Namval_t	*np;
-	register char **ep=environ;
-	register char *next=0;
+	register char		*cp;
+	register Namval_t	*np,*mp;
+	register char		**ep=environ;
+	char			*dp,*next=0;
+	int			nenv=0,k=0,size=0;
+	Namval_t		*np0;
 #ifdef _ENV_H
 	shp->env = env_open(environ,3);
 	env_delete(shp->env,"_");
 #endif
-	if(ep)
+	if(!ep)
+		goto skip;
+	while(*ep++)
+		nenv++;
+	np = newof(0,Namval_t,nenv,0);
+	for(np0=np,ep=environ;cp= *ep; ep++)
 	{
-		while(cp= *ep++)
+		dp = strchr(cp,'=');
+		if(!dp)
+			continue;
+		*dp++ = 0;
+		if(mp = dtmatch(shp->var_base,cp))
 		{
-			if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]=='=')
-				next = cp+4;
-			else if(np=nv_open(cp,shp->var_tree,(NV_EXPORT|NV_IDENT|NV_ASSIGN|NV_NOFAIL))) 
-			{
-				nv_onattr(np,NV_IMPORT);
-				np->nvenv = cp;
-				nv_close(np);
-			}
-			else  /* swap with front */
-			{
-				ep[-1] = environ[shp->nenv];
-				environ[shp->nenv++] = cp;
-			}
+			mp->nvenv = (char*)cp;
+			dp[-1] = '=';
+		}
+		else if(*cp=='A' && cp[1]=='_' && cp[2]=='_' && cp[3]=='z' && cp[4]==0)
+		{
+			dp[-1] = '=';
+			next = cp+4;
+			continue;
+		}
+		else
+		{
+			k++;
+			mp = np++;
+			mp->nvname = cp;
+			size += strlen(cp);
 		}
-		while(cp=next)
+			nv_onattr(mp,NV_IMPORT);
+		if(mp->nvfun || nv_isattr(mp,NV_INTEGER))
+			nv_putval(mp,dp,0);
+		else
 		{
-			if(next = strchr(++cp,'='))
-				*next = 0;
-			np = nv_search(cp+2,shp->var_tree,NV_ADD);
-			if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
+			mp->nvalue.cp = dp;
+			nv_onattr(mp,NV_NOFREE);
+		}
+		nv_onattr(mp,NV_EXPORT|NV_IMPORT);
+	}
+	np =  (Namval_t*)realloc((void*)np0,k*sizeof(Namval_t));
+	dp = (char*)malloc(size+k);
+	while(k-->0)
+	{
+		size = strlen(np->nvname);
+		memcpy(dp,np->nvname,size+1);
+		np->nvname[size] = '=';
+		np->nvenv = np->nvname;
+		np->nvname = dp;
+		dp += size+1;
+		dtinsert(shp->var_base,np++);
+	}
+	while(cp=next)
+	{
+		if(next = strchr(++cp,'='))
+			*next = 0;
+		np = nv_search(cp+2,shp->var_tree,NV_ADD);
+		if(np!=SHLVL && nv_isattr(np,NV_IMPORT|NV_EXPORT))
+		{
+			int flag = *(unsigned char*)cp-' ';
+			int size = *(unsigned char*)(cp+1)-' ';
+			if((flag&NV_INTEGER) && size==0)
 			{
-				int flag = *(unsigned char*)cp-' ';
-				int size = *(unsigned char*)(cp+1)-' ';
-				if((flag&NV_INTEGER) && size==0)
+				/* check for floating*/
+				char *val = nv_getval(np);
+				strtol(val,&dp,10);
+				if(*dp=='.' || *dp=='e' || *dp=='E')
 				{
-					/* check for floating*/
-					char *ep,*val = nv_getval(np);
-					strtol(val,&ep,10);
-					if(*ep=='.' || *ep=='e' || *ep=='E')
+					char *lp;
+					flag |= NV_DOUBLE;
+					if(*dp=='.')
+					{
+						strtol(dp+1,&lp,10);
+						if(*lp)
+							dp = lp;
+					}
+					if(*dp && *dp!='.')
 					{
-						char *lp;
-						flag |= NV_DOUBLE;
-						if(*ep=='.')
-						{
-							strtol(ep+1,&lp,10);
-							if(*lp)
-								ep = lp;
-						}
-						if(*ep && *ep!='.')
-						{
-							flag |= NV_EXPNOTE;
-							size = ep-val;
-						}
-						else
-							size = strlen(ep);
-						size--;
+						flag |= NV_EXPNOTE;
+						size = dp-val;
 					}
+					else
+						size = strlen(dp);
+					size--;
 				}
-				nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
 			}
-			else
-				cp += 2;
+			nv_newattr(np,flag|NV_IMPORT|NV_EXPORT,size);
 		}
+		else
+			cp += 2;
 	}
+skip:
 #ifdef _ENV_H
 	env_delete(shp->env,e_envmarker);
 #endif
diff -up ksh-20100621/src/lib/libast/misc/optget.c.rightjust ksh-20100621/src/lib/libast/misc/optget.c
--- ksh-20100621/src/lib/libast/misc/optget.c.rightjust	2010-06-04 23:39:54.000000000 +0200
+++ ksh-20100621/src/lib/libast/misc/optget.c	2012-07-25 11:25:58.933602400 +0200
@@ -803,30 +803,44 @@ search(const void* tab, size_t num, size
 }
 
 /*
- * save s and return the saved pointer
+ * save ap+bp+cp and return the saved pointer
  */
 
 static char*
-save(const char* s)
+save(const char* ap, size_t az, const char* bp, size_t bz, const char* cp, size_t cz)
 {
+	char*		b;
+	char*		e;
+	const char*	ep;
 	Save_t*		p;
 	Dtdisc_t*	d;
+	char		buf[1024];
 
 	static Dt_t*	dict;
 
 	if (!dict)
 	{
 		if (!(d = newof(0, Dtdisc_t, 1, 0)))
-			return (char*)s;
+			return (char*)ap;
 		d->key = offsetof(Save_t, text);
 		if (!(dict = dtopen(d, Dthash)))
-			return (char*)s;
+			return (char*)ap;
 	}
-	if (!(p = (Save_t*)dtmatch(dict, s)))
-	{
-		if (!(p = newof(0, Save_t, 1, strlen(s))))
-			return (char*)s;
-		strcpy(p->text, s);
+	b = buf;
+	e = b + sizeof(buf) - 1;
+	for (ep = ap + az; b < e && ap < ep; *b++ = *ap++);
+	if (bp)
+	{
+		for (ep = bp + bz; b < e && bp < ep; *b++ = *bp++);
+		if (cp)
+			for (ep = cp + cz; b < e && cp < ep; *b++ = *cp++);
+	}
+	*b = 0;
+	if (!(p = (Save_t*)dtmatch(dict, buf)))
+	{
+		if (!(p = newof(0, Save_t, 1, b - buf)))
+			return (char*)ap;
+		strcpy(p->text, buf);
 		dtinsert(dict, p);
 	}
 	return p->text;
@@ -878,6 +892,24 @@ expand(register char* s, register char*
 }
 
 /*
+ * initialize the translation dictionary and flag maps
+ */
+
+static void
+initdict(void)
+{
+	register int	n;
+
+	state.vp = sfstropen();
+	state.msgdisc.key = offsetof(Msg_t, text);
+	state.msgdisc.size = -1;
+	state.msgdisc.link = offsetof(Msg_t, link);
+	if (state.msgdict = dtopen(&state.msgdisc, Dthash))
+		for (n = 0; n < elementsof(C_LC_MESSAGES_libast); n++)
+			dtinsert(state.msgdict, C_LC_MESSAGES_libast + n);
+}
+
+/*
  * initialize the attributes for pass p from opt string s
  */
 
@@ -892,20 +924,14 @@ init(register char* s, Optpass_t* p)
 	char*		e;
 	int		l;
 
-	if (!state.msgdict)
+	if (!state.localized)
 	{
+		state.localized = 1;
 #if !_PACKAGE_astsa
 		if (!ast.locale.serial)
 			setlocale(LC_ALL, "");
 #endif
-		state.vp = sfstropen();
 		state.xp = sfstropen();
-		state.msgdisc.key = offsetof(Msg_t, text);
-		state.msgdisc.size = -1;
-		state.msgdisc.link = offsetof(Msg_t, link);
-		if (state.msgdict = dtopen(&state.msgdisc, Dthash))
-			for (n = 0; n < elementsof(C_LC_MESSAGES_libast); n++)
-				dtinsert(state.msgdict, C_LC_MESSAGES_libast + n);
 		if (!map[OPT_FLAGS[0]])
 			for (n = 0, t = OPT_FLAGS; *t; t++)
 				map[*t] = ++n;
@@ -1021,7 +1047,11 @@ init(register char* s, Optpass_t* p)
 						{
 							for (; *s == '\a' || *s == '\b' || *s == '\v' || *s == ' '; s++);
 							if (*s == '\f')
-								s = expand(s + 1, NiL, &e, state.vp, p->id);
+							{
+								if (*(s + 1) == '?' && *(s + 2) == '\f')
+									break;
+								s = expand(s + 1, NiL, &e, state.xp, p->id);
+							}
 							for (t = s; *t && *t != ' ' && *t != ']'; t++);
 							if (t > s)
 							{
@@ -1035,9 +1065,9 @@ init(register char* s, Optpass_t* p)
 									if (*u == '-' || *u == ']')
 									{
 										if (!l)
-											p->id = save(sfprints("%-.*s", t - s, s));
+											p->id = save(s, t - s, 0, 0, 0, 0);
 										else if ((a = strlen(p->id)) <= (n = t - s) || strncmp(p->id + a - n, s, n) || *(p->id + a - n - 1) != ':')
-											p->id = save(sfprints("%s::%-.*s", p->id, t - s, s));
+											p->id = save(p->id, strlen(p->id), "::", 2, s, t - s);
 									}
 								}
 							}
@@ -1057,9 +1087,9 @@ init(register char* s, Optpass_t* p)
 			p->id = "command";
 	}
 	else if (p->id == error_info.id)
-		p->id = save(p->id);
+		p->id = save(p->id, strlen(p->id), 0, 0, 0, 0);
 	if (s = p->catalog)
-		p->catalog = ((t = strchr(s, ']')) && (!p->id || (t - s) != strlen(p->id) || !strneq(s, p->id, t - s))) ? save(sfprints("%-.*s", t - s, s)) : (char*)0;
+		p->catalog = ((t = strchr(s, ']')) && (!p->id || (t - s) != strlen(p->id) || !strneq(s, p->id, t - s))) ? save(s, t - s, 0, 0, 0, 0) : (char*)0;
 	if (!p->catalog)
 	{
 		if (opt_info.disc && opt_info.disc->catalog && (!p->id || !streq(opt_info.disc->catalog, p->id)))
@@ -4240,7 +4270,7 @@ optget(register char** argv, const char*
 			{
 				opt_info.argv = 0;
 				state.argv[0] = 0;
-				if (argv[0] && (state.argv[0] = save(argv[0])))
+				if (argv[0] && (state.argv[0] = save(argv[0], strlen(argv[0]), 0, 0, 0, 0)))
 					opt_info.argv = state.argv;
 				state.style = STYLE_short;
 			}
@@ -4401,6 +4431,8 @@ optget(register char** argv, const char*
 		 * ? always triggers internal help
 		 */
 
+		if (!state.msgdict)
+			initdict();
 		if (w)
 		{
 			if (!v && (*(w + 1) || !(v = argv[opt_info.index]) || !++opt_info.index))
@@ -4421,6 +4453,8 @@ optget(register char** argv, const char*
 		}
 		goto help;
 	}
+	else if (w && !state.msgdict)
+		initdict();
 	numopt = 0;
 	f = 0;
 	s = opts;
@@ -4582,7 +4616,7 @@ optget(register char** argv, const char*
 			}
 			if (*s == '\f')
 			{
-				psp = info(psp, s + 1, NiL, state.xp, id);
+				psp = info(psp, s + 1, NiL, xp, id);
 				if (psp->nb)
 					s = psp->nb;
 				else
diff -up ksh-20100621/src/lib/libast/misc/optlib.h.rightjust ksh-20100621/src/lib/libast/misc/optlib.h
--- ksh-20100621/src/lib/libast/misc/optlib.h.rightjust	2010-06-04 23:31:15.000000000 +0200
+++ ksh-20100621/src/lib/libast/misc/optlib.h	2012-07-25 11:25:58.934602408 +0200
@@ -97,6 +97,7 @@ typedef struct Optstate_s
 	int		width;		/* format line width		*/
 	int		flags;		/* display flags		*/
 	int		emphasis;	/* ansi term emphasis ok	*/
+	int		localized;	/* locale initialized		*/
 	Dtdisc_t	msgdisc;	/* msgdict discipline		*/
 	Dt_t*		msgdict;	/* default ast.id catalog msgs	*/
 	Optcache_t*	cache;		/* OPT_cache cache		*/
diff -up ksh-20100621/src/lib/libast/vmalloc/vmhdr.h.required ksh-20100621/src/lib/libast/vmalloc/vmhdr.h
--- ksh-20100621/src/lib/libast/vmalloc/vmhdr.h.required	2010-01-07 23:17:37.000000000 +0100
+++ ksh-20100621/src/lib/libast/vmalloc/vmhdr.h	2012-07-25 16:29:07.114505655 +0200
@@ -176,7 +176,7 @@ extern void		_vmmessage _ARG_((const cha
 #ifdef	_AST_PAGESIZE
 #define VMHEAPINCR	(_Vmpagesize*1)
 #else
-#define VMHEAPINCR	(_Vmpagesize*4)
+#define VMHEAPINCR	(_Vmpagesize*sizeof(void*))
 #endif
 
 /* Blocks are allocated such that their sizes are 0%(BITS+1)
diff -Naurp ksh-20100621/src/lib/libast/include/regex.h ksh20101201/src/lib/libast/include/regex.h
--- ksh-20100621/src/lib/libast/include/regex.h	2010-03-04 22:27:36.000000000 +0100
+++ ksh20101201/src/lib/libast/include/regex.h	2010-11-22 16:37:47.000000000 +0100
@@ -170,10 +170,11 @@ struct regdisc_s
 
 typedef struct regstat_s
 {
-	regflags_t	re_flags;	/* REG_LEFT|REG_RIGHT		*/
+	regflags_t	re_flags;	/* REG_*			*/
 	ssize_t		re_min;		/* min anchored match length	*/
 	ssize_t		re_max;		/* max anchored match length	*/
 	ssize_t		re_record;	/* regrexec() match length	*/
+	regflags_t	re_info;	/* REG_* info			*/
 } regstat_t;
 
 struct regex_s
diff -up ksh-20100621/src/cmd/ksh93/bltins/test.c.cmddiff ksh-20100621/src/cmd/ksh93/bltins/test.c
--- ksh-20100621/src/cmd/ksh93/bltins/test.c.cmddiff	2009-06-17 23:57:22.000000000 +0200
+++ ksh-20100621/src/cmd/ksh93/bltins/test.c	2012-07-30 22:58:22.436664837 +0200
@@ -555,7 +555,7 @@ int sh_access(register const char *name,
 	struct stat statb;
 	if(*name==0)
 		return(-1);
-	if(strmatch(name,(char*)e_devfdNN))
+	if(sh_isdevfd(name))
 		return(sh_ioaccess((int)strtol(name+8, (char**)0, 10),mode));
 	/* can't use access function for execute permission with root */
 	if(mode==X_OK && sh.euserid==0)
@@ -656,7 +656,7 @@ static int test_stat(const char *name,st
 		errno = ENOENT;
 		return(-1);
 	}
-	if(strmatch(name,(char*)e_devfdNN))
+	if(sh_isdevfd(name))
 		return(fstat((int)strtol(name+8, (char**)0, 10),buff));
 	else
 		return(stat(name,buff));
diff -up ksh-20100621/src/cmd/ksh93/edit/history.c.cmddiff ksh-20100621/src/cmd/ksh93/edit/history.c
--- ksh-20100621/src/cmd/ksh93/edit/history.c.cmddiff	2009-04-09 00:28:28.000000000 +0200
+++ ksh-20100621/src/cmd/ksh93/edit/history.c	2012-07-30 22:56:38.934505380 +0200
@@ -162,7 +162,7 @@ static History_t *hist_ptr;
 		acctfd = 0;
 		return(0);
 	}
-	if(strmatch(acctfile,e_devfdNN))
+	if(sh_isdevfd(acctfile))
 	{
 		char newfile[16];
 		sfsprintf(newfile,sizeof(newfile),"%.8s%d\0",e_devfdNN,acctfd);
diff -up ksh-20100621/src/cmd/ksh93/include/io.h.cmddiff ksh-20100621/src/cmd/ksh93/include/io.h
--- ksh-20100621/src/cmd/ksh93/include/io.h.cmddiff	2012-07-30 22:56:38.842505270 +0200
+++ ksh-20100621/src/cmd/ksh93/include/io.h	2012-07-30 22:56:38.935505381 +0200
@@ -81,6 +81,7 @@ extern void 	sh_iounsave(Shell_t*);
 extern int	sh_chkopen(const char*);
 extern int	sh_ioaccess(int,int);
 extern int	sh_devtofd(const char*);
+extern int	sh_isdevfd(const char*);
 extern int	sh_source(Shell_t*, Sfio_t*, const char*);
 
 /* the following are readonly */
diff -up ksh-20100621/src/cmd/ksh93/sh/init.c.cmddiff ksh-20100621/src/cmd/ksh93/sh/init.c
--- ksh-20100621/src/cmd/ksh93/sh/init.c.cmddiff	2012-07-30 22:56:38.916505359 +0200
+++ ksh-20100621/src/cmd/ksh93/sh/init.c	2012-07-30 22:56:38.936505382 +0200
@@ -1283,7 +1283,7 @@ Shell_t *sh_init(register int argc,regis
 	else
 		sh_offoption(SH_PRIVILEGED);
 	/* shname for $0 in profiles and . scripts */
-	if(strmatch(argv[1],e_devfdNN))
+	if(sh_isdevfd(argv[1]))
 		shp->shname = strdup(argv[0]);
 	else
 		shp->shname = strdup(shp->st.dolv[0]);
diff -up ksh-20100621/src/cmd/ksh93/sh/io.c.cmddiff ksh-20100621/src/cmd/ksh93/sh/io.c
--- ksh-20100621/src/cmd/ksh93/sh/io.c.cmddiff	2012-07-30 22:56:38.000000000 +0200
+++ ksh-20100621/src/cmd/ksh93/sh/io.c	2012-07-30 23:03:25.365265364 +0200
@@ -2508,3 +2508,16 @@ Sfio_t *sh_pathopen(const char *cp)
 		errormsg(SH_DICT,ERROR_system(1),e_open,cp);
 	return(sh_iostream(shp,n));
 }
+
+int sh_isdevfd(register const char *fd)
+{
+       if(!fd || memcmp(fd,"/dev/fd/",8) || fd[8]==0)
+               return(0);
+       for ( fd=&fd[8] ; *fd != '\0' ; fd++ )
+       {
+               if (*fd < '0' || *fd > '9')
+                       return(0);
+       }
+       return(1);
+}
+