ParseExp::Result ParseExp::ParseItemType(POETCode* input, int *p_lineno) { POETCode* res = 0, *tail=0; if ( get_head(input) == lp) { Result resOfRest = ParseExpImpl(NextToken(input),exp_bop->get_entry().get_code(),0, p_lineno); if (get_head(resOfRest.second) == rp) { input = NextToken(resOfRest.second); res = resOfRest.first; } else return Result(0,input); } else if (match_expItem(input)) { try { res = parse_AST(input, exp_item->get_entry().get_code(), &tail); assert(res != 0); input=SkipEmpty(tail, p_lineno); } catch (ParseError err) { if (backtrack) return Result(0,input); throw err; } } else return Result(0,input); if (funcall->get_entry().get_code() != 0 && get_head(input) == lp) { CodeVar* fvar = dynamic_cast<CodeVar*>(funcall->get_entry().get_code()); if (fvar == 0) INCORRECT_CVAR(funcall->get_entry().get_code()); Result resOfTail = ParseExpImpl(NextToken(input),exp_bop->get_entry().get_code(),0, p_lineno); std::vector<POETCode*> argVec; while (resOfTail.first!=0 && (get_head(resOfTail.second) != rp)) { argVec.push_back(resOfTail.first); resOfTail=ParseExpImpl(NextToken(resOfTail.second),exp_bop->get_entry().get_code(),0, p_lineno); } argVec.push_back(resOfTail.first); POETCode* args = Vector2List(argVec); if (args == 0) args = EMPTY; return Result(CODE_REF(fvar,PAIR(res,args)), NextToken(resOfTail.second)); } else if (arrref->get_entry().get_code() != 0 && get_head(input) == lb ) { CodeVar* fvar = dynamic_cast<CodeVar*>(arrref->get_entry().get_code()); if (fvar == 0) INCORRECT_CVAR(arrref->get_entry().get_code()); std::vector<POETCode*> argVec; while (get_head(input) == lb) { Result resOfTail = ParseExpImpl(NextToken(input),exp_bop->get_entry().get_code(),0, p_lineno); if (resOfTail.first==0 || get_head(resOfTail.second) != rb) return Result(res,input); argVec.push_back(resOfTail.first); input = NextToken(resOfTail.second); } POETCode* args = Vector2List(argVec); if (args == 0) args = EMPTY; return Result(CODE_REF(fvar,PAIR(res,args)),input); } return Result(res, input); }
START_MY_CXT #define fdebug (MY_CXT.x_fdebug) #define current_idx (MY_CXT.x_current_idx) static I32 filter_call(pTHX_ int idx, SV *buf_sv, int maxlen) { dMY_CXT; SV *my_sv = FILTER_DATA(idx); char *nl = "\n"; char *p; char *out_ptr; int n; if (fdebug) warn("**** In filter_call - maxlen = %d, out len buf = %d idx = %d my_sv = %d [%s]\n", maxlen, SvCUR(buf_sv), idx, SvCUR(my_sv), SvPVX(my_sv) ) ; while (1) { /* anything left from last time */ if ((n = SvCUR(my_sv))) { out_ptr = SvPVX(my_sv) + BUF_OFFSET(my_sv) ; if (maxlen) { /* want a block */ if (fdebug) warn("BLOCK(%d): size = %d, maxlen = %d\n", idx, n, maxlen) ; sv_catpvn(buf_sv, out_ptr, maxlen > n ? n : maxlen ); if(n <= maxlen) { BUF_OFFSET(my_sv) = 0 ; SET_LEN(my_sv, 0) ; } else { BUF_OFFSET(my_sv) += maxlen ; SvCUR_set(my_sv, n - maxlen) ; } return SvCUR(buf_sv); } else { /* want lines */ if ((p = ninstr(out_ptr, out_ptr + n, nl, nl + 1))) { sv_catpvn(buf_sv, out_ptr, p - out_ptr + 1); n = n - (p - out_ptr + 1); BUF_OFFSET(my_sv) += (p - out_ptr + 1); SvCUR_set(my_sv, n) ; if (fdebug) warn("recycle %d - leaving %d, returning %d [%s]", idx, n, SvCUR(buf_sv), SvPVX(buf_sv)) ; return SvCUR(buf_sv); } else /* no EOL, so append the complete buffer */ sv_catpvn(buf_sv, out_ptr, n) ; } } SET_LEN(my_sv, 0) ; BUF_OFFSET(my_sv) = 0 ; if (FILTER_ACTIVE(my_sv)) { dSP ; int count ; if (fdebug) warn("gonna call %s::filter\n", PERL_MODULE(my_sv)) ; ENTER ; SAVETMPS; SAVEINT(current_idx) ; /* save current idx */ current_idx = idx ; SAVESPTR(DEFSV) ; /* save $_ */ /* make $_ use our buffer */ DEFSV = sv_2mortal(newSVpv("", 0)) ; PUSHMARK(sp) ; if (CODE_REF(my_sv)) { /* if (SvROK(PERL_OBJECT(my_sv)) && SvTYPE(SvRV(PERL_OBJECT(my_sv))) == SVt_PVCV) { */ count = perl_call_sv((SV*)PERL_OBJECT(my_sv), G_SCALAR); } else { XPUSHs((SV*)PERL_OBJECT(my_sv)) ; PUTBACK ; count = perl_call_method("filter", G_SCALAR); } SPAGAIN ; if (count != 1) croak("Filter::Util::Call - %s::filter returned %d values, 1 was expected \n", PERL_MODULE(my_sv), count ) ; n = POPi ; if (fdebug) warn("status = %d, length op buf = %d [%s]\n", n, SvCUR(DEFSV), SvPVX(DEFSV) ) ; if (SvCUR(DEFSV)) sv_setpvn(my_sv, SvPVX(DEFSV), SvCUR(DEFSV)) ; PUTBACK ; FREETMPS ; LEAVE ; } else n = FILTER_READ(idx + 1, my_sv, maxlen) ; if (n <= 0) { /* Either EOF or an error */ if (fdebug) warn ("filter_read %d returned %d , returning %d\n", idx, n, (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n); /* PERL_MODULE(my_sv) ; */ /* PERL_OBJECT(my_sv) ; */ filter_del(filter_call); /* If error, return the code */ if (n < 0) return n ; /* return what we have so far else signal eof */ return (SvCUR(buf_sv)>0) ? SvCUR(buf_sv) : n; } } }
ParseExp::Result ParseExp::ParseExpImpl(POETCode* input, POETCode* bop, POETCode* inherit, int *p_lineno) { if (inherit == 0) { POETCode* p_uop = exp_uop->get_entry().get_code(); for (POETCode* cur = 0; ((cur=get_head(p_uop))!=0); p_uop = get_tail(p_uop)) { POETCode* p_input = MatchOp(cur, input); if (p_input != 0) { Result resOfRest = ParseItemType(p_input, p_lineno); if (resOfRest.first != 0) { if (buildUop->get_entry().get_code()!=0) { XformVar* xvar = dynamic_cast<XformVar*>(buildUop->get_entry().get_code()); if (xvar == 0) INCORRECT_XVAR(buildUop); inherit = xvar->eval(PAIR(cur,resOfRest.first),false); } else { CodeVar* cvar = dynamic_cast<CodeVar*>(parseUop->get_entry().get_code()); if (cvar == 0) INCORRECT_CVAR(parseUop); inherit = CODE_REF(cvar, PAIR(cur,resOfRest.first)); } input = resOfRest.second; } break; } } } if (inherit == 0) { Result res = ParseItemType(input, p_lineno); inherit = res.first; input = res.second; } if (inherit == 0) { return Result(0,input); } if (get_tail(input) != 0) { POETCode* p_bop = bop; for (POETCode* cur_bop=0; (cur_bop = get_head(p_bop)) != 0; p_bop = get_tail(p_bop) ) { for (POETCode* cur = 0; (cur = get_head(cur_bop)) != 0; cur_bop = get_tail(cur_bop)) { POETCode* p_input = MatchOp(cur, input); if (p_input != 0) { Result resOfTail = ParseExpImpl(p_input,get_tail(p_bop),0, p_lineno); if (resOfTail.first != 0) { POETCode* first1 = 0; if (buildBop->get_entry().get_code()!=0) { XformVar* xvar = dynamic_cast<XformVar*>(buildBop->get_entry().get_code()); if (xvar == 0) INCORRECT_XVAR(buildBop); first1 = xvar->eval(TUPLE3(cur,inherit,resOfTail.first),false); } else { CodeVar* cvar = dynamic_cast<CodeVar*>(parseBop->get_entry().get_code()); if (cvar == 0) INCORRECT_XVAR(parseBop); first1=CODE_REF(cvar,TUPLE3(cur,inherit,resOfTail.first)); } return ParseExpImpl(resOfTail.second,bop,first1, p_lineno); } return Result(inherit,input); } } } } return Result(inherit, input) ; }