// set void XML( const string & in ) { m_XML = in; xmlParser prsr(m_XML); prsr.parse(); node_vector & xnodes = prsr.nodeList(); for(int i=0;i<xnodes.size();i++) { xmlNode & node = xnodes[i]; m_Permissions.insert(make_pair(node.name,node.data)); } }
void HandleElemProcs(){ vtype[1] = valnumb; // ID 1 is the line number startidarray(); valtype idtype; myscanner *scnr=new myscanner;; myparser prsr(3,2, scnr); prsr.startparser(); parseritem *item; unsigned prod, thisidpos, idpos = 2, startlocalids = 0; pgm *ppgm = new pgm; initpgm = ppgm; etd *segetd = 0, *thisetd, *fetd; varitem *w; unsigned asgnno; int /*boolean*/ itspop, segisopen, numbeles; int /*boolean*/ doingglobals = 1; int ifstk[24], ifptr=0; do { prod = prsr.doparse(item); // printf("Prod: %u, Item: %u, %s\n", prod, item->ItemNo(), item->IntStr()); switch (prod){ /* 11 <tactid type ::=> */ /* 12 <tactid type ::=> STRING */ case TACTIDTYPESTR1: case VARTYPESTR1: case TACTIDTYPESTR2: idtype = valstr; thisidpos = idpos++; break; /* 13 <tactid type ::=> NUMBER */ case TACTIDTYPENUMB: idtype = valnumb; thisidpos = idpos++; break; /* 14 <tactid type ::=> LINENO */ case TACTIDTYPELINE: idtype = valline; thisidpos = 1; break; /* 15 <tactid type ::=> WORD */ case TACTIDTYPEWORD: idtype = valword; thisidpos = 0; break; case TACTIDMAINNAME: NumbTACTIds = NumbGlobalvars = MaxNumbVars = idpos; if (!addmainid(item->IntStr(), idtype)){ ResFile->MsgData(item->DisplayPosition()); ResFile->MsgData(item->IntStr()); ResFile->PutResError( NAMEINUSE ); exit(100); } HandleDeclare(item, idtype, globalvars, thisidpos); vtype[thisidpos] = idtype; if (idtype==valstr)ppgm->Append(new pgminittids(thisidpos)); else ppgm->Append(new pgminittidn(thisidpos)); break; /* 19 <alt name list ::=> <alt name list> , <name> */ case TACTIDALTNAME1: /* 20 <alt name list ::=> <name> */ case TACTIDALTNAME2: if (!addotherid(item->IntStr())){ ResFile->MsgData(item->DisplayPosition()); ResFile->MsgData(item->IntStr()); ResFile->PutResError( NAMEINUSE ); exit(100); } HandleDeclare(item, idtype, globalvars, thisidpos); break; /* 30 <declare name ::=> <name> */ case DECLAREDGLOBALNAME: varnamestype *tvt; if (doingglobals){tvt = globalvars; NumbGlobalvars = idpos;} else tvt = localvars; if (idpos > MaxNumbVars) MaxNumbVars = idpos; HandleDeclare(item, idtype, tvt, thisidpos); vtype[thisidpos] = idtype; if (idtype==valstr){ ppgm->Append(new pgminitvars(thisidpos)); if(!doingglobals)localstrs[nolstrs++] = thisidpos; } else ppgm->Append(new pgminitvarn(thisidpos)); break; /* 36 <segment type ::=> OPEN */ case SEGMENTISOPEN: segisopen = 1; break; /* 36 <segment type ::=> CLOSE */ case SEGMENTISCLOSE: segisopen = 0; break; /* 37 <element list ::=> <element name> */ case FIRSTELEMENTNAME: if (!doingglobals)cleanuplocals(ppgm); // cleans up >previous< segment. doingglobals = 0; ppgm = new pgm; // break is intentionally missing here. j.b. numbeles = 0; /* 38 <element list ::=> <element list> , <element name> */ case OTHERELEMENTNAMES: segetd = ((etditem *)item)->MyEtd(); if (segisopen)segetd->startpgm = (void *)ppgm; else segetd->endpgm = (void *)ppgm; if (startlocalids == 0)startlocalids = idpos; else idpos = startlocalids; delete localvars; localvars = new varnamestype; numbeles++; break; /* 34 <actions ::=> <actions> <action statement> */ /* 35 <actions ::=> <action statement> */ case ACTIONSTATEMENT1: case ACTIONSTATEMENT2: if (sp != 0) printf("*program warning* sp = %d",sp); break; /* 66 <word op ::=> collect <logical expression> */ case HANDLECOLLECTCOMMAND: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtopt(formatcollect));break; /* 67 <word op ::=> append <char expression> */ case HANDLEAPPENDCOMMAND: MkC(ppgm);sp--;ppgm->Append(new setpgmfmtwadj(wpost,formatwordpost)); break; /* 68 <word op ::=> prepend <char expression> */ case HANDLEPREPENDCOMMAND: MkC(ppgm);sp--;ppgm->Append(new setpgmfmtwadj(wpre,formatwordpre)); break; /* 69 <word op ::=> replace <char expression> */ case HANDLEREPLACECOMMAND: MkC(ppgm);sp--;ppgm->Append(new setpgmfmtwadj(wrep,formatwordrep)); break; /* 45 <simple action statement ::=> inc <declared name> */ /* 46 <simple action statement ::=> dec <declared name> */ case HANDLEINC: case HANDLEDEC: w = (varitem *)item; asgnno = w->Vardata()->pos(); ppgm->Append(new pgmvarld(asgnno,tstk[sp++]=w->Vardata()->type())); MkN(ppgm); StkN();ppgm->Append(new pgmintstk(1)); sp--; if (prod == HANDLEINC)ppgm->Append(new pgmbinop(add)); else ppgm->Append(new pgmbinop(subt)); if (vtype[asgnno]==valstr)MkC(ppgm); sp--; ppgm->Append(new pgmvarsv(asgnno)); break; /* 42 <simple action statement ::=> output <char expression> */ case HANDLEOUTPUTCOMMAND: MkC(ppgm); sp--; ppgm->Append(new pgmoutput);break; /* 46 <simple action statement ::=> output blines <arith expression> */ case DOBLANKLINES: MkN(ppgm); sp--;ppgm->Append(new pgminsblk);break; /* 43 <simple action statement ::=> error <char expression> */ case HANDLEERRORCOMMAND: MkC(ppgm); sp--; ppgm->Append(new pgmerror);break; /* 44 <simple action statement ::=> remark <char expression> */ case HANDLEREMARKCOMMAND: MkC(ppgm); sp--; ppgm->Append(new pgmremark);break; /* 38 <format option ::=> compress <logical expression> */ case SETFORMATCOMPRESS: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtopt(formatcompress));break; /* 39 <format option ::=> centre <logical expression> */ case SETFORMATCENTRE: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtopt(formatcentre));break; /* 40 <format option ::=> display <logical expression> */ case SETFORMATDISPLAY: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtopt(formatdisplay));break; /* 41 <format option ::=> fill <logical expression> */ case SETFORMATFILL: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtopt(formatfill));break; /* 42 <format option ::=> fold <arith expression> */ case SETFORMATFOLD: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtfold);break; /* 43 <format option ::=> indent <arith expression> */ case SETFORMATINDENT: MkN(ppgm);sp--;ppgm->Append(new setpgmfmtindent);break; /* 75 <format option ::=> to <var name> */ case SETOUTTOVAR: w = (varitem *)item; if (VerifyVarForOut(w->Vardata())) ppgm->Append(new setpgmfmtout(w->Vardata()->pos())); else { /*RES OLD MSG 603 %0: Variable %1 has an incorrect type for "format to". */ ResFile->MsgData(w->DisplayPosition()); ResFile->MsgData(w->IntStr()); ResFile->PutResError(/*RES REM INS*/ 603); exit(100); } break; /* 76 <format option ::=> to tdb */ case SETOUTTOTDB: ppgm->Append(new setpgmfmtout(0)); break; /* 54 <popstack which ::=> POP */ case ITSPOP: itspop=1; break; /* 55 <popstack which ::=> STACK */ case ITSSTACK: itspop=0; break; /* 58 <ps item ::=> <var name> */ case POPSTACKVAR: w = (varitem *)item; if (itspop)ppgm->Append(new pgmpop(w->Vardata()->pos())); else ppgm->Append(new pgmpush(w->Vardata()->pos())); break; /* 54 <let statement ::=> let <destination> = <let expression> */ case DOTHEASSIGN: if ((vtype[asgnno]==valnumb)&&(tstk[sp-1] == valstr))MkN(ppgm); else if ((vtype[asgnno]==valstr)&&(tstk[sp-1] == valnumb))MkC(ppgm); sp--; ppgm->Append(new pgmvarsv(asgnno)); break; /* 55 <destination ::=> <var name> */ case GETASSIGNID: w = (varitem *)item; asgnno = w->Vardata()->pos(); break; /* 58 <char expression ::=> <char expression> | <char item> */ case CHAREXPAPPEND: Mk2C(ppgm); sp--;ppgm->Append(new pgmchbin(ccn));break; /* 60 <char item ::=> <string> */ case CHAREXPSTRING: StkC();ppgm->Append(new pgmchpush(item->IntStr()));break; /* 61 <char item ::=> nl */ case CHAREXPNEWLINE: StkC();ppgm->Append(new pgmchpush((UNCH *)"\n"));break; /* 64 <char item ::=> UPPER ( <char expression> ) */ case CHAREXPUPPER: MkC(ppgm);ppgm->Append(new pgmunop(unupp));break; /* 87 <char item ::=> THISGI */ case CHARTHISGI: StkC();ppgm->Append(new pgmelename);break; /* 89 <char item ::=> SUBSTR ( <sub operands> ) */ case CHARSUBSTR: sp -= 2; ppgm->Append(new pgmsubstr); break; /* 90 <char item ::=> PAD ( <pad operands> ) */ case CHARPAD: sp -= 4; StkC(); ppgm->Append(new pgmpad); break; /* 94 <main sub ops ::=> <sub item> , <start numb> */ case SUBSTRMISSLEN: StkN();ppgm->Append(new pgmintstk(9999));break; /* 95 <sub item ::=> <char expression> */ case SUBSTRITEM: MkC(ppgm); break; /* 96 <start numb ::=> <arith expression> */ case SUBSTRSTART: MkN(ppgm); break; /* 97 <len numb ::=> <arith expression> */ case SUBSTRLEN: MkN(ppgm); break; /* 98 <pad item ::=> <char expression> */ case PADITEM: MkC(ppgm); break; /* 99 <pad length ::=> <arith expression> */ case PADLEN: MkN(ppgm); break; /* 100 <pad pattern ::=> */ case PADNOPATTERN: StkC();ppgm->Append(new pgmchpush((UNCH *)" "));break; /* 101 <pad pattern ::=> , <char expression> */ case PADPATTERN: MkC(ppgm); break; /* 102 <pad position ::=> */ case PADBACK1: StkN();ppgm->Append(new pgmintstk(0)); break; /* 103 <pad position ::=> FRONT , */ case PADFRONT: StkN();ppgm->Append(new pgmintstk(1)); break; /* 104 <pad position ::=> BACK , */ case PADBACK2: StkN();ppgm->Append(new pgmintstk(0)); break; //* 67 <arith expression ::=> <arith expression> + <arith term> */ case ARITHEXPPLUS: Mk2N(ppgm); sp--;ppgm->Append(new pgmbinop(add));break; /* 68 <arith expression ::=> <arith expression> - <arith term> */ case ARITHEXPMINUS: Mk2N(ppgm); sp--;ppgm->Append(new pgmbinop(subt));break; /* 70 <signed term ::=> - <arith term> */ case ARITHEXPUMINUS: MkN(ppgm);ppgm->Append(new pgmunop(unneg));break; /* 73 <arith term ::=> <arith term> * <arith primary> */ case ARITHEXPTIMES: Mk2N(ppgm); sp--;ppgm->Append(new pgmbinop(mult));break; /* 74 <arith term ::=> <arith term> / <arith primary> */ case ARITHEXPDIV: Mk2N(ppgm); sp--;ppgm->Append(new pgmbinop(adiv));break; /* 77 <arith item ::=> <number> */ case ARITHEXPNUMB: StkN();ppgm->Append(new pgmintstk(atoi((char *)item->IntStr())));break; /* 121 <arith item ::=> FIND ( <char expression> , <char expression> ) */ case ARITHEXPFIND: Mk2C(ppgm); sp-=2; StkN();ppgm->Append(new pgmfind); break; /* 82 <arith item ::=> MAX ( <arith expression> , <arith expression> ) */ case ARITHEXPMAX: Mk2N(ppgm);sp--;ppgm->Append(new pgmbinop(amax));break; /* 83 <arith item ::=> MIN ( <arith expression> , <arith expression> ) */ case ARITHEXPMIN: Mk2N(ppgm);sp--;ppgm->Append(new pgmbinop(amin));break; /* 85 <arith item ::=> LENGTH ( <char expression> ) */ case ARITHEXPLEN: MkC(ppgm);tstk[sp-1] = valnumb;ppgm->Append(new pgmunop(unlen));break; /* 98 <name or attrib ::=> <var name> */ case GETTACTGLOBAL: w = (varitem *)item; ppgm->Append(new pgmvarld(w->Vardata()->pos(),tstk[sp++]=w->Vardata()->type())); break; /* 100 <attribute ::=> . <name> */ case LOADLOCALATTRIB: if (numbeles == 1)BuildAttrRef(ppgm, segetd, item->IntStr()); else BuildAttrRef2(ppgm, item->IntStr()); break; /* 101 <attribute ::=> <the element> . <name> */ case LOADELEMATTRIB: BuildAttrRef(ppgm, thisetd, item->IntStr()); break; /* 102 <the element ::=> <element name> */ case SAVEELEMENT: thisetd = ((etditem *)item)->MyEtd(); break; /* 124 <if start ::=> IF <logical expression> THEN <statement end> */ case IFSTART: ppgm->StartIf(); sp--; ifstk[++ifptr] = 1; // note first ifstk element is not used break; /* 132 <elsif line ::=> <elsif id> <logical expression> THEN <statement end> */ case ELSEIFCOND: ppgm->StartIf(); sp--; break; /* 133 <elsif id ::=> ELSE IF */ case ELSEIFSTART: ppgm->StartElse(); ++ifstk[ifptr]; break; /* 126 <ELSE ID ::=> ELSE <statement end> */ case IFELSESTART: ppgm->StartElse(); break; /* 127 <end if ::=> END <statement end> */ case IFEND: ppgm->EndIf(ifstk[ifptr--]); break; /* 129 <while test ::=> <WHILE ID> <logical expression> <statement end> */ case WHILECOND: ppgm->WhileCond(); sp--; break; /* 130 <WHILE ID ::=> WHILE */ case WHILESTART: ppgm->StartWhile(); break; /* 131 <end while ::=> END <statement end> */ case WHILEEND: ppgm->EndWhile(); break; /* 113 <logical expression ::=> <logical expression> OR <logical term> */ case LOGOR: Mk2N(ppgm);sp--;ppgm->Append(new pgmbinop(lor));break; /* 115 <logical term ::=> <logical term> AND <signed logical term> */ case LOGAND: Mk2N(ppgm);sp--;ppgm->Append(new pgmbinop(land));break; /* 117 <signed logical term ::=> NOT <logical primary> */ case LOGNOT: MkN(ppgm);ppgm->Append(new pgmunop(unlneg));break; /* 107 <logical primary ::=> ON */ case LOGEXPON: StkN();ppgm->Append(new pgmintstk(1));break; /* 108 <logical primary ::=> OFF */ case LOGEXPOFF: StkN();ppgm->Append(new pgmintstk(0));break; /* 166 <in funct elem ::=> <element name> */ case DOINFUNCT: /* 167 <is funct elem ::=> <element name> */ case DOISFUNCT: StkN(); fetd = ((etditem *)item)->MyEtd(); if (prod == DOINFUNCT)ppgm->Append(new pgminelem(fetd->etdgi)); else ppgm->Append(new pgmiselem(fetd->etdgi)); break; /* 122 <compare ::=> <exp 1> = <exp 2> */ case COMPEQU: DoCompare(ppgm,aeq,ceq); break; /* 123 <compare ::=> <exp 1> ~ = <exp 2> */ case COMPNOTEQU: DoCompare(ppgm,ane,cne); break; /* 124 <compare ::=> <exp 1> "> <exp 2> */ case COMPGT: DoCompare(ppgm,agt,cgt); break; /* 125 <compare ::=> <exp 1> "< <exp 2> */ case COMPLT: DoCompare(ppgm,alt,clt); break; /* 126 <compare ::=> <exp 1> "> = <exp 2> */ case COMPGE: DoCompare(ppgm,age,cge); break; /* 127 <compare ::=> <exp 1> "< = <exp 2> */ case COMPLE: DoCompare(ppgm,ale,cle); break; } } while ((prod != 1)&&(prod <= 1000)); if (prod > 1000) exit(1); delete scnr; };