static void inclinenumber (LexState *LS) { static const char *pragmas [] = { "debug", "nodebug", "endinput", "end", "ifnot", "if", "else", NULL }; next(LS); // skip '\n' ++LS->linenumber; if (LS->current == '$') { // is a pragma? char buff[PRAGMASIZE + 1]; int32 ifnot = 0; int32 skip = LS->ifstate[LS->iflevel].skip; next(LS); // skip $ readname(LS, buff); switch (luaO_findstring(buff, pragmas)) { case 0: // debug if (!skip) lua_debug = 1; break; case 1: // nodebug if (!skip) lua_debug = 0; break; case 2: // endinput if (!skip) { LS->current = EOZ; LS->iflevel = 0; // to allow $endinput inside a $if } break; case 3: // end if (LS->iflevel-- == 0) luaY_syntaxerror("unmatched $end", "$end"); break; case 4: // ifnot ifnot = 1; // go through case 5: // if if (LS->iflevel == MAX_IFS - 1) luaY_syntaxerror("too many nested $ifs", "$if"); readname(LS, buff); LS->iflevel++; LS->ifstate[LS->iflevel].elsepart = 0; LS->ifstate[LS->iflevel].condition = checkcond(buff) ? !ifnot : ifnot; LS->ifstate[LS->iflevel].skip = skip || !LS->ifstate[LS->iflevel].condition; break; case 6: // else if (LS->ifstate[LS->iflevel].elsepart) luaY_syntaxerror("unmatched $else", "$else"); LS->ifstate[LS->iflevel].elsepart = 1; LS->ifstate[LS->iflevel].skip = LS->ifstate[LS->iflevel - 1].skip || LS->ifstate[LS->iflevel].condition; break; default: luaY_syntaxerror("unknown pragma", buff); } skipspace(LS); if (LS->current == '\n') // pragma must end with a '\n' ... inclinenumber(LS); else if (LS->current != EOZ) // or eof luaY_syntaxerror("invalid pragma format", buff); ifskip(LS); } }
static void inclinenumber (LexState *LS) { static char *pragmas [] = {"debug", "nodebug", "endinput", "end", "ifnot", "if", "else", NULL}; next(LS); /* skip '\n' */ ++LS->linenumber; if (LS->current == '$') { /* is a pragma? */ char buff[PRAGMASIZE+1]; int ifnot = 0; int skip = LS->ifstate[LS->iflevel].skip; next(LS); /* skip $ */ readname(LS, buff); switch (luaL_findstring(buff, pragmas)) { case 0: /* debug */ if (!skip) L->debug = 1; break; case 1: /* nodebug */ if (!skip) L->debug = 0; break; case 2: /* endinput */ if (!skip) { LS->current = EOZ; LS->iflevel = 0; /* to allow $endinput inside a $if */ } break; case 3: /* end */ if (LS->iflevel-- == 0) luaX_syntaxerror(LS, "unmatched $end", "$end"); break; case 4: /* ifnot */ ifnot = 1; /* go through */ case 5: /* if */ if (LS->iflevel == MAX_IFS-1) luaX_syntaxerror(LS, "too many nested $ifs", "$if"); readname(LS, buff); LS->iflevel++; LS->ifstate[LS->iflevel].elsepart = 0; LS->ifstate[LS->iflevel].condition = checkcond(LS, buff) ? !ifnot : ifnot; LS->ifstate[LS->iflevel].skip = skip || !LS->ifstate[LS->iflevel].condition; break; case 6: /* else */ if (LS->ifstate[LS->iflevel].elsepart) luaX_syntaxerror(LS, "unmatched $else", "$else"); LS->ifstate[LS->iflevel].elsepart = 1; LS->ifstate[LS->iflevel].skip = LS->ifstate[LS->iflevel-1].skip || LS->ifstate[LS->iflevel].condition; break; default: luaX_syntaxerror(LS, "unknown pragma", buff); } skipspace(LS); if (LS->current == '\n') /* pragma must end with a '\n' ... */ inclinenumber(LS); else if (LS->current != EOZ) /* or eof */ luaX_syntaxerror(LS, "invalid pragma format", buff); ifskip(LS); } }
//----------------------------------------------------------------------------- int mglParser::FlowExec(mglGraph *, const std::wstring &com, long m, mglArg *a) { int n=-1; if(!ifskip() && !com.compare(L"once")) { if(a[0].type==2) { n = 0; if(a[0].v) Skip = !Once; else Skip = Once = false; } else n = 1; } else if(!Skip && !com.compare(L"if")) { int cond; if(a[0].type==2) { n = 0; cond = (a[0].v!=0)?3:0; } else if(a[0].type==0) { n = 0; a[1].s.assign(a[1].w.begin(),a[1].w.end()); cond = a[0].d->FindAny((m>1 && a[1].type==1) ? a[1].s.c_str():"u")?3:0; } else n = 1; if(n==0) { if_stack[if_pos] = cond; if_pos = if_pos<39 ? if_pos+1 : 39; } } else if(!Skip && !com.compare(L"endif")) { if_pos = if_pos>0 ? if_pos-1 : 0; n = 0; } else if(!Skip && !com.compare(L"else")) { if(if_pos>0) { n=0; if_stack[if_pos-1] = (if_stack[if_pos-1]&2)?2:3; } else n = 1; } else if(!Skip && !com.compare(L"elseif")) { int cond; if(if_pos<1 || m<1) n = 1; else if(if_stack[if_pos-1]&2) { n = 0; cond = 2; } else if(a[0].type==2) { n = 0; cond = (a[0].v!=0)?3:0; } else if(a[0].type==0) { n = 0; a[1].s.assign(a[1].w.begin(),a[1].w.end()); cond = a[0].d->FindAny((m>1 && a[1].type==1) ? a[1].s.c_str():"u")?3:0; } else n = 1; if(n==0) if_stack[if_pos-1] = cond; } else if(!ifskip() && !Skip && !com.compare(L"break")) { if(if_pos==if_for[0]) if_pos = if_pos>0 ? if_pos-1 : 0; } else if(!skip() && !com.compare(L"return")) { if(fn_stack.size()<1) return 2; const mglFnStack &fn=fn_stack.back(); for(int i=0;i<10;i++) par[i]=fn.par[i]; n = -fn.pos-1; fn_stack.pop_back(); } else if(!ifskip() && !Skip && !com.compare(L"next")) { if(if_pos==if_for[0]) if_pos = if_pos>0 ? if_pos-1 : 0; int r = for_stack[0]-1; n = for_stack[0] ? 0:1; if(for_stack[0]) { if(fval[r].ny<fval[r].nx && !for_br) { wchar_t buf[32]; mglprintf(buf,32,L"%g",fval[r].a[fval[r].ny]); AddParam(r, buf); fval[r].ny += 1; n = -fval[r].nz-1; } else { for(int i=0;i<39;i++) { for_stack[i]=for_stack[i+1]; if_for[i]=if_for[i+1]; } for_stack[39] = 0; for_br=false; } } } else if(!ifskip() && !Skip && !com.compare(L"continue")) { if(if_pos==if_for[0]) if_pos = if_pos>0 ? if_pos-1 : 0; int r = for_stack[0]-1; n = for_stack[0] ? 0:1; if(for_stack[0]) { if(fval[r].ny<fval[r].nx) { wchar_t buf[32]; mglprintf(buf,32,L"%g",fval[r].a[fval[r].ny]); AddParam(r, buf); fval[r].ny += 1; n = -fval[r].nz-1; } else for_br = true; } } return n+1; }