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); +} +