static DF1(jtpowseqlim){PROLOG(0039);A x,y,z,*zv;I i,n; RZ(w); RZ(z=exta(BOX,1L,1L,20L)); zv=AAV(z); *zv++=x=w; i=1; n=AN(z); while(1){ if(n==i){RZ(z=ext(0,z)); zv=i+AAV(z); n=AN(z);} RZ(*zv++=x=df1(y=x,self)); if(equ(x,y)){AN(z)=*AS(z)=i; break;} ++i; } z=ope(z); EPILOG(z); } /* f^:(<_) w */
static F2(jttclosure){A z;B b;I an,*av,c,d,i,wn,wr,wt,*wv,*zu,*zv,*zz; RZ(a&&w); wt=AT(w); wn=AN(w); wr=AR(w); if(B01&wt)RZ(w=cvt(INT,w)); wv=AV(w); av=AV(a); an=AN(a); RZ(z=exta(INT,1+wr,wn,20L)); zv=AV(z); zz=zv+AN(z); if(1==wn){ *zv++=c=*wv; d=1+c; while(c!=d){ if(zv==zz){i=zv-AV(z); RZ(z=ext(0,z)); zv=AV(z)+i; zz=AV(z)+AN(z);} d=c; if(0>c)c+=an; ASSERT(0<=c&&c<an,EVINDEX); *zv++=c=av[c]; }}else{ ICPY(zv,wv,wn); zu=zv; zv+=wn; while(1){ if(zv==zz){i=zv-AV(z); RZ(z=ext(0,z)); zv=AV(z)+i; zz=AV(z)+AN(z); zu=zv-wn;} b=1; DO(wn, d=c=*zu++; if(0>c)c+=an; ASSERT(0<=c&&c<an,EVINDEX); *zv++=c=av[c]; if(c!=d)b=0;); if(b)break; }}
CmpResult ExtNameCmp(StrLen a,StrLen b) { if( PathBase::IsDotDot(a) ) return PathBase::IsDotDot(b)?CmpEqual:CmpLess; if( PathBase::IsDotDot(b) ) return CmpGreater; for(;;) { SplitExt exta(a); SplitExt extb(b); if( !extb ) { if( !exta ) { return NativeNameCmp(a,b); } else { return CmpGreater; } } else { if( !exta ) { return CmpLess; } else { if( CmpResult cmp=NativeNameCmp(exta.ext,extb.ext) ) return cmp; a=exta.name; b=extb.name; } } } }