void showObjss(stringstream& ss,Obj o){ bool f=o.isToken();Word wc=WordBits/4,wa=sizeof(addrT)*2+2; obj C=o.Class(); ss<<hex<<setw(wc)<<o.w<<"|"; String v=dict.nameOf(C); if(v!=classNotFound){ ss<<setw(20)<<v<<" "; ss<<setw(4)<<hex<<uWord(t2i(C)); }else ss<<setw(20)<<hex<<C.w<<" "; ss<<" |"; if(o.isToken()){ vect& v=o.V(); ss<<(v.readOnly ? " X |" : " |"); ss<<(v.reference ? " X |" : " |"); ss<<(o.hasBody() ? " X |" : " |"); // ss<<(v.excludeFirst ? " X |" : " |"); ss<<(v.fields ? " X |" : " |"); ss<< setw(7)<<v.executionLevel<<"|"; ss<< setw(wa)<<v.addr0<<" |"; }else{ int w=3+4+8+3+wa+2;char s[w+1];memset(s,'-',w);s[w]=0;s[0]=' ';s[w-1]=' '; ss<<" | | | | |"; ss<<setw(wa+2)<<"|"; } ss<<" "<<toString(o); ss<<endl; }
AggregateOrdered match(const Aggregate s,AggregateOrdered positions, Obj pat,AggregateOrdered r=0,Word pn=1){ // p holds the positions array that may have 1 or 2 columns per raw #define loop(aa,step) for(Word i=0,i1=aa.elements(),p;i<i1 && (p=aa[i],true);i+=step) switch(pat.Class().w){ case _classInt:{ if(!r) r=AggregateOrdered(); uWord sn=s.elements(); loop(positions,pn){ if(0<=p && p+1<=sn && s[p]==pat.w) r.keyExists((Obj)(p+1)); } }; break; case _classAggregate: stack.push(positions); execute(pat,true); r=stack.pop(); break; case _classString: case _classPatternAll:{ AggregateOrdered r1=positions; for(auto pat1:(Aggregate)pat) r1=match(s,r1,pat1); if(!r) r=r1;else r+=r1; break; } case _classPatternAny: if(!r) r=AggregateOrdered(); for(auto pat1:(Aggregate)pat) match(s,positions,pat1,r); break; default: assert0(false,"unexpected in matchAll"); break; } return r; }