// 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));
   }
 }
Exemple #2
0
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;
};