diff options
author | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-04-03 09:48:44 -0700 |
---|---|---|
committer | Roger A. Faulkner <Roger.Faulkner@Oracle.COM> | 2010-04-03 09:48:44 -0700 |
commit | 3e14f97f673e8a630f076077de35afdd43dc1587 (patch) | |
tree | 9828b6b676f58d7b27dd28e00202d3f3461a5cd8 /usr/src/lib/libshell/common/sh/array.c | |
parent | 4f60987df4dcaa54a88b596f861fbf4f3382c65e (diff) | |
download | illumos-joyent-3e14f97f673e8a630f076077de35afdd43dc1587.tar.gz |
6939349 RFE: Update ksh93 to ast-ksh.2010-03-09
6877392 ksh93 regresses 'uniq -c' performance
6887363 Korn shell 93 sometimes mishandles return value of its child process
6900314 (while true ; do true|true ; done) hang in ioctl() with SIGTTOU
6904557 wc no longer counts number of bytes correctly
6904575 cut -d with multibyte character no longer works
6904597 paste -d no longer works with multibyte characters
6904780 /usr/bin/cksum changed output in snv_128
6904870 uniq -s does not skip multibyte characters correctly
6904878 join -t no longer works with multibyte char separator
6907460 EXIT trap handlers are sometimes executed twice
6909579 libast getopt solaris compatibility broken
6920072 ksh93 tail -f, with unconditional .25s sleep and line parsing, about 37x slower than cat
6932124 mktemp in ksh93 is broken
Contributed by Olga Kryzhanovska <olga.kryzhanovska@gmail.com>
Diffstat (limited to 'usr/src/lib/libshell/common/sh/array.c')
-rw-r--r-- | usr/src/lib/libshell/common/sh/array.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/usr/src/lib/libshell/common/sh/array.c b/usr/src/lib/libshell/common/sh/array.c index 0346b9fb59..795d434eda 100644 --- a/usr/src/lib/libshell/common/sh/array.c +++ b/usr/src/lib/libshell/common/sh/array.c @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1982-2009 AT&T Intellectual Property * +* Copyright (c) 1982-2010 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * @@ -286,8 +286,9 @@ static Namval_t *array_find(Namval_t *np,Namarr_t *arp, int flag) np->nvalue.cp = up->cp; if(!up->cp) { + char *xp = nv_setdisc(np,"get",np,(Namfun_t*)np); if(flag!=ARRAY_ASSIGN) - return(0); + return(xp && xp!=(char*)np?np:0); if(!array_covered(np,ap)) ap->header.nelem++; } @@ -922,9 +923,10 @@ int nv_nextsub(Namval_t *np) if(array_isbit(aq->bits, dot,ARRAY_CHILD)) { Namval_t *mp = aq->val[dot].np; - if((aq->header.nelem&ARRAY_NOCHILD) && nv_isvtree(mp)) + if((aq->header.nelem&ARRAY_NOCHILD) && nv_isvtree(mp) && !mp->nvfun->dsize) continue; - nv_putsub(mp,NIL(char*),ARRAY_UNDEF); + if(nv_isarray(mp)) + nv_putsub(mp,NIL(char*),ARRAY_UNDEF); } return(1); } @@ -1255,7 +1257,12 @@ void *nv_associative(register Namval_t *np,const char *sp,int mode) return((void*)ap->cur); case NV_ANAME: if(ap->cur) + { + Shell_t *shp = sh_getinterp(); + if(!shp->instance && nv_isnull(ap->cur)) + return(NIL(void*)); return((void*)ap->cur->nvname); + } return(NIL(void*)); default: if(sp) @@ -1269,7 +1276,7 @@ void *nv_associative(register Namval_t *np,const char *sp,int mode) mode = NV_ADD|HASH_NOSCOPE; else if(ap->header.nelem&ARRAY_NOSCOPE) mode = HASH_NOSCOPE; - if(*sp==0 && (mode&NV_ADD)) + if(*sp==0 && sh_isoption(SH_XTRACE) && (mode&NV_ADD)) errormsg(SH_DICT,ERROR_warn(0),"adding empty subscript"); if(sh.subshell && (mp=nv_search(sp,ap->header.table,0)) && nv_isnull(mp)) ap->cur = mp; @@ -1297,6 +1304,8 @@ void *nv_associative(register Namval_t *np,const char *sp,int mode) ap->pos = mp = (Namval_t*)dtprev(ap->header.table,&fake); ap->nextpos = (Namval_t*)dtnext(ap->header.table,mp); } + else if(!mp && *sp && mode==0) + mp = nv_search(sp,ap->header.table,NV_ADD); np = mp; if(ap->pos && ap->pos==np) ap->header.nelem |= ARRAY_SCAN; |