Lines Matching refs:np
61 static Namarr_t *array_scope(Namval_t *np, Namarr_t *ap, int flags) in array_scope() argument
86 static int array_unscope(Namval_t *np,Namarr_t *ap) in array_unscope() argument
92 (*ap->fun)(np, NIL(char*), NV_AFREE); in array_unscope()
93 if((fp = nv_disc(np,(Namfun_t*)ap,NV_POP)) && !(fp->nofree&1)) in array_unscope()
95 nv_delete(np,(Dt_t*)0,0); in array_unscope()
104 static int array_covered(Namval_t *np, struct index_array *ap) in array_covered() argument
115 static void array_setptr(register Namval_t *np, struct index_array *old, struct index_array *new) in array_setptr() argument
117 register Namfun_t **fp = &np->nvfun; in array_setptr()
146 int array_maxindex(Namval_t *np) in array_maxindex() argument
148 register struct index_array *ap = (struct index_array*)nv_arrayptr(np); in array_maxindex()
156 static union Value *array_getup(Namval_t *np, Namarr_t *arp, int update) in array_getup() argument
162 return(&np->nvalue); in array_getup()
166 mp = (Namval_t*)((*arp->fun)(np,NIL(char*),NV_ACURRENT)); in array_getup()
173 return((union Value*)((*arp->fun)(np,NIL(char*),0))); in array_getup()
178 errormsg(SH_DICT,ERROR_exit(1),e_subscript,nv_name(np)); in array_getup()
185 nv_onattr(np,NV_NOFREE); in array_getup()
187 nv_offattr(np,NV_NOFREE); in array_getup()
192 int nv_arrayisset(Namval_t *np, Namarr_t *arp) in nv_arrayisset() argument
197 return((np = nv_opensub(np)) && !nv_isnull(np)); in nv_arrayisset()
209 static Namval_t *array_find(Namval_t *np,Namarr_t *arp, int flag) in array_find() argument
225 nv_putsub(np, NIL(char*), ARRAY_SCAN|ARRAY_NOSCOPE); in array_find()
231 (*ap->header.fun)(np,"0",flag==ARRAY_ASSIGN?NV_AADD:0); in array_find()
238 mp = (Namval_t*)((*arp->fun)(np,NIL(char*),NV_ACURRENT)); in array_find()
254 nv_arraychild(np,mp,0); in array_find()
264 ap = array_grow(np, ap, (int)ap->cur); in array_find()
266 errormsg(SH_DICT,ERROR_exit(1),e_subscript,nv_name(np)); in array_find()
268 if((!up->cp||up->cp==Empty) && nv_type(np) && nv_isvtree(np)) in array_find()
276 mp->nvenv = (char*)np; in array_find()
277 nv_arraychild(np,mp,0); in array_find()
279 if(up->np && array_isbit(ap->bits,ap->cur,ARRAY_CHILD)) in array_find()
281 if(wasundef && nv_isarray(up->np)) in array_find()
282 nv_putsub(up->np,NIL(char*),ARRAY_UNDEF); in array_find()
283 return(up->np); in array_find()
286 np->nvalue.cp = up->cp; in array_find()
289 char *xp = nv_setdisc(np,"get",np,(Namfun_t*)np); in array_find()
291 return(xp && xp!=(char*)np?np:0); in array_find()
292 if(!array_covered(np,ap)) in array_find()
295 return(np); in array_find()
299 int nv_arraysettype(Namval_t *np, Namval_t *tp, const char *sub, int flags) in nv_arraysettype() argument
303 int rdonly = nv_isattr(np,NV_RDONLY); in nv_arraysettype()
305 Namarr_t *ap = nv_arrayptr(np); in nv_arraysettype()
314 nv_arraychild(np,nq,0); in nv_arraysettype()
317 sfprintf(sh.strbuf,"%s=%s",nv_name(nq),nv_getval(np)); in nv_arraysettype()
343 static Namfun_t *array_clone(Namval_t *np, Namval_t *mp, int flags, Namfun_t *fp) in array_clone() argument
354 if((flags&NV_COMVAR) && nv_putsub(np,NIL(char*),ARRAY_SCAN)) in array_clone()
358 if(nq=nv_opensub(np)) in array_clone()
361 while(nv_nextsub(np)); in array_clone()
370 ap = array_scope(np,ap,flags); in array_clone()
392 mp->nvflag |= (np->nvflag&~(NV_MINIMAL|NV_NOFREE)); in array_clone()
393 if(!(nelem&(ARRAY_SCAN|ARRAY_UNDEF)) && (sub=nv_getsub(np))) in array_clone()
398 if(!nv_putsub(np,NIL(char*),ARRAY_SCAN|((flags&NV_COMVAR)?0:ARRAY_NOSCOPE))) in array_clone()
401 (*ap->fun)(np,(char*)np,0); in array_clone()
407 name = nv_getsub(np); in array_clone()
410 if(nq=nv_opensub(np)) in array_clone()
416 ar->val[ar->cur].np = mq; in array_clone()
429 else if(nv_isattr(np,NV_INTEGER)) in array_clone()
431 Sfdouble_t d= nv_getnum(np); in array_clone()
440 nv_putval(mp,nv_getval(np),NV_RDONLY); in array_clone()
444 while(nv_nextsub(np)); in array_clone()
449 nv_putsub(np,sub,0L); in array_clone()
456 static char *array_getval(Namval_t *np, Namfun_t *disc) in array_getval() argument
460 if((mp=array_find(np,ap,ARRAY_LOOKUP))!=np) in array_getval()
465 if((mp=array_find(np,aq,ARRAY_LOOKUP))==np) in array_getval()
466 return(nv_getv(np,&aq->hdr)); in array_getval()
470 return(nv_getv(np,&ap->hdr)); in array_getval()
473 static Sfdouble_t array_getnum(Namval_t *np, Namfun_t *disc) in array_getnum() argument
477 if((mp=array_find(np,ap,ARRAY_LOOKUP))!=np) in array_getnum()
482 if((mp=array_find(np,aq,ARRAY_LOOKUP))==np) in array_getnum()
483 return(nv_getn(np,&aq->hdr)); in array_getnum()
487 return(nv_getn(np,&ap->hdr)); in array_getnum()
490 static void array_putval(Namval_t *np, const char *string, int flags, Namfun_t *dp) in array_putval() argument
496 int scan,nofree = nv_isattr(np,NV_NOFREE); in array_putval()
499 mp = array_find(np,ap,string?ARRAY_ASSIGN:ARRAY_DELETE); in array_putval()
501 if(mp && mp!=np) in array_putval()
503 if(!is_associative(ap) && string && !(flags&NV_APPEND) && !nv_type(np) && nv_isvtree(mp)) in array_putval()
505 if(!nv_isattr(np,NV_NOFREE)) in array_putval()
518 nv_arraysettype(np,ap->hdr.type,nv_getsub(np),0); in array_putval()
530 (*ap->fun)(np,NIL(char*),NV_ADELETE); in array_putval()
531 np->nvalue.cp = 0; in array_putval()
535 if(mp!=np) in array_putval()
541 if(!array_covered(np,(struct index_array*)ap)) in array_putval()
548 (*ap->fun)(np, NIL(char*), NV_AFREE); in array_putval()
551 nv_offattr(np,NV_ARRAY); in array_putval()
553 if(!mp || mp!=np || is_associative(ap)) in array_putval()
558 up = array_getup(np,ap,!nofree); in array_putval()
561 if(nv_isarray(np)) in array_putval()
562 np->nvalue.up = up; in array_putval()
563 nv_putv(np,string,flags,&ap->hdr); in array_putval()
568 else if(mp==np) in array_putval()
572 if(string && ap->hdr.type && nv_isvtree(np)) in array_putval()
573 nv_arraysettype(np,ap->hdr.type,nv_getsub(np),0); in array_putval()
576 while(!string && nv_nextsub(np)); in array_putval()
580 nv_onattr(np,NV_NOFREE); in array_putval()
582 nv_offattr(np,NV_NOFREE); in array_putval()
583 if(!string && !nv_isattr(np,NV_ARRAY)) in array_putval()
591 if((nfp = nv_disc(np,(Namfun_t*)ap,NV_POP)) && !(nfp->nofree&1)) in array_putval()
593 if(!nv_isnull(np)) in array_putval()
595 nv_onattr(np,NV_NOFREE); in array_putval()
596 _nv_unset(np,flags); in array_putval()
598 if(np->nvalue.cp==Empty) in array_putval()
599 np->nvalue.cp = 0; in array_putval()
602 array_unscope(np,ap); in array_putval()
616 static void array_copytree(Namval_t *np, Namval_t *mp) in array_copytree() argument
618 Namfun_t *fp = nv_disc(np,NULL,NV_POP); in array_copytree()
619 nv_offattr(np,NV_ARRAY); in array_copytree()
620 nv_clone(np,mp,0); in array_copytree()
621 if(np->nvalue.cp && !nv_isattr(np,NV_NOFREE)) in array_copytree()
622 free((void*)np->nvalue.cp); in array_copytree()
623 np->nvalue.cp = 0; in array_copytree()
624 np->nvalue.up = &mp->nvalue; in array_copytree()
626 nv_disc(np,(Namfun_t*)fp, NV_FIRST); in array_copytree()
628 nv_onattr(np,NV_ARRAY); in array_copytree()
629 mp->nvenv = (char*)np; in array_copytree()
639 static struct index_array *array_grow(Namval_t *np, register struct index_array *arp,int maxi) in array_grow() argument
660 array_setptr(np,arp,ap); in array_grow()
669 if(nv_isnull(np) && nv_isattr(np,NV_NOFREE)) in array_grow()
672 nv_offattr(np,NV_NOFREE); in array_grow()
674 if(np->nvalue.cp==Empty) in array_grow()
675 np->nvalue.cp=0; in array_grow()
676 if(nv_hasdisc(np,&array_disc) || nv_isvtree(np)) in array_grow()
683 ap->val[0].np = mp; in array_grow()
685 for(fp=np->nvfun; fp && !fp->disc->readf; fp=fp->next); in array_grow()
691 else if((ap->val[0].cp=np->nvalue.cp)) in array_grow()
693 else if(nv_isattr(np,NV_INTEGER) && !nv_isnull(np)) in array_grow()
695 Sfdouble_t d= nv_getnum(np); in array_grow()
700 nv_disc(np,(Namfun_t*)ap, NV_FIRST); in array_grow()
701 nv_onattr(np,NV_ARRAY); in array_grow()
704 array_copytree(np,mp); in array_grow()
713 int nv_atypeindex(Namval_t *np, const char *tname) in nv_atypeindex() argument
723 struct index_array *ap = (struct index_array*)nv_arrayptr(np); in nv_atypeindex()
727 ap = array_grow(np,ap,1); in nv_atypeindex()
729 np = nv_namptr(ap->xp,0); in nv_atypeindex()
730 np->nvname = tp->nvname; in nv_atypeindex()
731 nv_onattr(np,NV_MINIMAL); in nv_atypeindex()
732 nv_clone(tp,np,NV_NOFREE); in nv_atypeindex()
733 nv_offattr(np,NV_RDONLY); in nv_atypeindex()
740 Namarr_t *nv_arrayptr(register Namval_t *np) in nv_arrayptr() argument
742 if(nv_isattr(np,NV_ARRAY)) in nv_arrayptr()
743 return((Namarr_t*)nv_hasdisc(np, &array_disc)); in nv_arrayptr()
751 static Namarr_t *nv_changearray(Namval_t *np, void *(*fun)(Namval_t*,const char*,int)) in nv_changearray() argument
761 if(!fun || !(ap = nv_arrayptr(np)) || is_associative(ap)) in nv_changearray()
764 nv_stack(np,&ap->hdr); in nv_changearray()
765 save_ap = (struct index_array*)nv_stack(np,0); in nv_changearray()
766 ap = (Namarr_t*)((*fun)(np, NIL(char*), NV_AINIT)); in nv_changearray()
769 nv_onattr(np,NV_ARRAY); in nv_changearray()
782 nv_putsub(np, string_index, ARRAY_ADD); in nv_changearray()
783 up = (union Value*)((*ap->fun)(np,NIL(char*),0)); in nv_changearray()
797 Namarr_t *nv_setarray(Namval_t *np, void *(*fun)(Namval_t*,const char*,int)) in nv_setarray() argument
803 if(fun && (ap = nv_arrayptr(np))) in nv_setarray()
810 ap = nv_changearray(np, fun); in nv_setarray()
813 if(nv_isnull(np) && nv_isattr(np,NV_NOFREE)) in nv_setarray()
816 nv_offattr(np,NV_NOFREE); in nv_setarray()
818 if(!(fp=nv_isvtree(np))) in nv_setarray()
819 value = nv_getval(np); in nv_setarray()
820 if(fun && !ap && (ap = (Namarr_t*)((*fun)(np, NIL(char*), NV_AINIT)))) in nv_setarray()
825 nv_onattr(np,NV_ARRAY); in nv_setarray()
828 nv_putsub(np, "0", ARRAY_ADD); in nv_setarray()
830 nv_putval(np, value, 0); in nv_setarray()
833 Namval_t *mp = (Namval_t*)((*fun)(np,NIL(char*),NV_ACURRENT)); in nv_setarray()
834 array_copytree(np,mp); in nv_setarray()
845 Namval_t *nv_arraychild(Namval_t *np, Namval_t *nq, int c) in nv_arraychild() argument
848 register Namarr_t *ap = nv_arrayptr(np); in nv_arraychild()
852 return(ap?array_find(np,ap, ARRAY_LOOKUP):0); in nv_arraychild()
855 nv_putsub(np, NIL(char*), ARRAY_FILL); in nv_arraychild()
856 ap = nv_arrayptr(np); in nv_arraychild()
858 if(!(up = array_getup(np,ap,0))) in nv_arraychild()
860 np->nvalue.cp = up->cp; in nv_arraychild()
861 if((tp=nv_type(np)) || c) in nv_arraychild()
864 nq->nvenv = (char*)np; in nv_arraychild()
868 nv_clone(np, nq, NV_NODISC); in nv_arraychild()
872 nq->nvenv = (char*)np; in nv_arraychild()
879 up->np = nq; in nv_arraychild()
891 int nv_nextsub(Namval_t *np) in nv_nextsub() argument
893 register struct index_array *ap = (struct index_array*)nv_arrayptr(np); in nv_nextsub()
901 if(nq=(*ap->header.fun)(np,NIL(char*),NV_ANEXT)) in nv_nextsub()
904 nv_putsub(nq->nvalue.np,NIL(char*),ARRAY_UNDEF); in nv_nextsub()
925 Namval_t *mp = aq->val[dot].np; in nv_nextsub()
950 Namval_t *nv_putsub(Namval_t *np,register char *sp,register long mode) in nv_putsub() argument
952 register struct index_array *ap = (struct index_array*)nv_arrayptr(np); in nv_putsub()
968 size += array_maxindex(np); in nv_putsub()
971 errormsg(SH_DICT,ERROR_exit(1),e_subscript, nv_name(np)); in nv_putsub()
979 np = sh_assignok(np,1); in nv_putsub()
980 ap = array_grow(np, ap,size); in nv_putsub()
986 mp = ap->val[oldsize].np; in nv_putsub()
990 for(nfp=np->nvfun; nfp; nfp=nfp->next) in nv_putsub()
1001 if((mode&ARRAY_SCAN) && (ap->cur--,!nv_nextsub(np))) in nv_putsub()
1002 np = 0; in nv_putsub()
1013 if(!array_covered(np,ap)) in nv_putsub()
1023 np = sh_assignok(np,1); in nv_putsub()
1025 if(!array_covered(np,ap)) in nv_putsub()
1033 nv_putsub(ap->val[size].np,NIL(char*),ARRAY_UNDEF); in nv_putsub()
1035 np = 0; in nv_putsub()
1037 return((Namval_t*)np); in nv_putsub()
1047 (*ap->header.fun)(np, sp, NV_ASETSUB); in nv_putsub()
1048 return(np); in nv_putsub()
1050 (*ap->header.fun)(np, sp, (mode&ARRAY_ADD)?NV_AADD:0); in nv_putsub()
1051 if(!(mode&(ARRAY_SCAN|ARRAY_ADD)) && !(*ap->header.fun)(np,NIL(char*),NV_ACURRENT)) in nv_putsub()
1052 np = 0; in nv_putsub()
1055 (*ap->header.fun)(np,(char*)np,0); in nv_putsub()
1057 (*ap->header.fun)(np, "",0); in nv_putsub()
1058 if((mode&ARRAY_SCAN) && !nv_nextsub(np)) in nv_putsub()
1059 np = 0; in nv_putsub()
1060 return(np); in nv_putsub()
1067 char *nv_endsubscript(Namval_t *np, register char *cp, int mode) in nv_endsubscript() argument
1092 if(mode && np) in nv_endsubscript()
1094 Namarr_t *ap = nv_arrayptr(np); in nv_endsubscript()
1100 nv_putsub(np, sp, ((mode&NV_ADD)?ARRAY_ADD:0)|(cp[1]&&(mode&NV_ADD)?ARRAY_FILL:mode&ARRAY_FILL)); in nv_endsubscript()
1111 Namval_t *nv_opensub(Namval_t* np) in nv_opensub() argument
1113 register struct index_array *ap = (struct index_array*)nv_arrayptr(np); in nv_opensub()
1117 return((Namval_t*)((*ap->header.fun)(np,NIL(char*),NV_ACURRENT))); in nv_opensub()
1119 return(ap->val[ap->cur].np); in nv_opensub()
1124 char *nv_getsub(Namval_t* np) in nv_getsub() argument
1130 if(!np || !(ap = (struct index_array*)nv_arrayptr(np))) in nv_getsub()
1133 return((char*)((*ap->header.fun)(np,NIL(char*),NV_ANAME))); in nv_getsub()
1136 np = nv_namptr(ap->xp,0); in nv_getsub()
1137 np->nvalue.s = ap->cur; in nv_getsub()
1138 return(nv_getval(np)); in nv_getsub()
1154 int nv_aindex(register Namval_t* np) in nv_aindex() argument
1156 Namarr_t *ap = nv_arrayptr(np); in nv_aindex()
1169 int nv_aimax(register Namval_t* np) in nv_aimax() argument
1171 struct index_array *ap = (struct index_array*)nv_arrayptr(np); in nv_aimax()
1183 void *nv_associative(register Namval_t *np,const char *sp,int mode) in nv_associative() argument
1185 register struct assoc_array *ap = (struct assoc_array*)nv_arrayptr(np); in nv_associative()
1196 nv_disc(np,(Namfun_t*)ap, NV_FIRST); in nv_associative()
1256 ap->cur->nvenv = (char*)np; in nv_associative()
1272 if(sp==(char*)np) in nv_associative()
1274 type = nv_isattr(np,NV_PUBLIC&~(NV_ARRAY|NV_CHILD|NV_MINIMAL)); in nv_associative()
1286 mp->nvenv = (char*)np; in nv_associative()
1287 if((mode&NV_ADD) && nv_type(np)) in nv_associative()
1288 nv_arraychild(np,mp,0); in nv_associative()
1290 np = sh_assignok(np,1); in nv_associative()
1309 np = mp; in nv_associative()
1310 if(ap->pos && ap->pos==np) in nv_associative()
1314 ap->cur = np; in nv_associative()
1326 void nv_setvec(register Namval_t *np,int append,register int argc,register char *argv[]) in nv_setvec() argument
1330 if(nv_isarray(np)) in nv_setvec()
1332 ap = (struct index_array*)nv_arrayptr(np); in nv_setvec()
1334 errormsg(SH_DICT,ERROR_exit(1),"cannot append index array to associative array %s",nv_name(np)); in nv_setvec()
1346 else if(!nv_isnull(np)) in nv_setvec()
1351 nv_putsub(np,NIL(char*),(long)argc+arg0|ARRAY_FILL|ARRAY_ADD); in nv_setvec()
1352 nv_putval(np,argv[argc],0); in nv_setvec()