- int i;
- pCode *pc;
-
- if(!tokIdx)
- return;
-
- for(i=0; i<=tokIdx; i++)
- dump1Token(tokArr[i].tt);
-
-
- fputc('\n',stderr);
-
- {
- int lparsedPatIdx=0;
- int lpcpIdx;
- int ltokIdx =0;
- int matching = 0;
- int j,k;
-
- char * cPmnem = NULL; // Pointer to non-wild mnemonic (if any)
- char * cP1stop = NULL;
- char * cP2ndop = NULL;
-
- //pCodeOp *pcl = NULL; // Storage for a label
- //pCodeOp *pco1 = NULL; // 1st operand
- //pCodeOp *pco2 = NULL; // 2nd operand
- //pCode *pc = NULL; // Mnemonic
-
- typedef enum {
- PS_START,
- PS_HAVE_LABEL,
- PS_HAVE_MNEM,
- PS_HAVE_1OPERAND,
- PS_HAVE_COMMA,
- PS_HAVE_2OPERANDS
- } ParseStates;
-
- ParseStates state = PS_START;
-
- do {
-
- lpcpIdx=0;
- matching = 0;
- //fprintf(stderr,"ltokIdx = %d\n",ltokIdx);
-
- if( ((tokArr[ltokIdx].tt == PCT_SPACE) )//|| (tokArr[ltokIdx].tt == PCT_COMMA))
- && (advTokIdx(<okIdx, 1)) ) // eat space
- break;
-
- do {
- j = pcComparePattern(&tokArr[ltokIdx], pcpArr[lpcpIdx].tokens, tokIdx +1);
- if( j ) {
- //fprintf(stderr,"found token pattern match\n");
- switch(pcpArr[lpcpIdx].pt) {
- case PCP_LABEL:
- if(state == PS_START){
- fprintf(stderr," label\n");
- state = PS_HAVE_LABEL;
- } else
- fprintf(stderr," bad state (%d) for label\n",state);
- break;
-
- case PCP_STR:
- fprintf(stderr," %s is",tokArr[ltokIdx].tok.s);
- switch(state) {
- case PS_START:
- case PS_HAVE_LABEL:
- fprintf(stderr," mnem\n");
- cPmnem = tokArr[ltokIdx].tok.s;
- state = PS_HAVE_MNEM;
- break;
- case PS_HAVE_MNEM:
- fprintf(stderr," 1st operand\n");
- cP1stop = tokArr[ltokIdx].tok.s;
- //pco1 = newpCodeOp(NULL,PO_GPR_REGISTER);
- state = PS_HAVE_1OPERAND;
- break;
- case PS_HAVE_1OPERAND:
- fprintf(stderr," error expecting comma\n");
- break;
- case PS_HAVE_COMMA:
- fprintf(stderr," 2 operands\n");
- cP2ndop = tokArr[ltokIdx].tok.s;
- break;
- case PS_HAVE_2OPERANDS:
- break;
- }
- break;
-
- case PCP_WILDVAR:
- switch(state) {
- case PS_START:
- case PS_HAVE_LABEL:
- fprintf(stderr," wild mnem\n");
- state = PS_HAVE_MNEM;
- break;
- case PS_HAVE_MNEM:
- fprintf(stderr," 1st operand is wild\n");
- state = PS_HAVE_1OPERAND;
- break;
- case PS_HAVE_1OPERAND:
- fprintf(stderr," error expecting comma\n");
- break;
- case PS_HAVE_COMMA:
- fprintf(stderr," 2nd operand is wild\n");
- break;
- case PS_HAVE_2OPERANDS:
- break;
- }
- break;
-
- case PCP_NUMBER:
- switch(state) {
- case PS_START:
- case PS_HAVE_LABEL:
- fprintf(stderr," ERROR number\n");
- break;
- case PS_HAVE_MNEM:
- fprintf(stderr," 1st operand is a number\n");
- state = PS_HAVE_1OPERAND;
- break;
- case PS_HAVE_1OPERAND:
- fprintf(stderr," error expecting comma\n");
- break;
- case PS_HAVE_COMMA:
- fprintf(stderr," 2nd operand is a number\n");
- break;
- case PS_HAVE_2OPERANDS:
- break;
- }
- break;
-
- case PCP_WILDSTR:
- break;
- case PCP_COMMA:
- if(state == PS_HAVE_1OPERAND){
- fprintf(stderr," got a comma\n");
- state = PS_HAVE_COMMA;
- } else
- fprintf(stderr," unexpected comma\n");
+ pCode *pc;
+ int error = 0;
+
+ if(!tokIdx)
+ return error;
+
+#ifdef PCODE_DEBUG
+ {
+ unsigned i;
+ for(i=0; i<=tokIdx; i++)
+ dump1Token(tokArr[i].tt);
+ fputc('\n',stderr);
+ }
+#endif
+
+ {
+ int lparsedPatIdx=0;
+ int lpcpIdx;
+ int ltokIdx =0;
+ int matching = 0;
+ int j=0;
+ int k=0;
+
+ char * cPmnem = NULL; // Pointer to non-wild mnemonic (if any)
+ char * cP1stop = NULL;
+ char * cP2ndop = NULL;
+
+ //pCodeOp *pcl = NULL; // Storage for a label
+ //pCodeOp *pco1 = NULL; // 1st operand
+ //pCodeOp *pco2 = NULL; // 2nd operand
+ //pCode *pc = NULL; // Mnemonic
+
+ typedef enum {
+ PS_START,
+ PS_HAVE_LABEL,
+ PS_HAVE_MNEM,
+ PS_HAVE_1OPERAND,
+ PS_HAVE_COMMA,
+ PS_HAVE_2OPERANDS
+ } ParseStates;
+
+ ParseStates state = PS_START;
+
+ do {
+
+ lpcpIdx=0;
+ matching = 0;
+
+ if( ((tokArr[ltokIdx].tt == PCT_SPACE) )
+ && (advTokIdx(<okIdx, 1)) ) // eat space
+ break;
+
+ do {
+ j = pcComparePattern(&tokArr[ltokIdx], pcpArr[lpcpIdx].tokens, tokIdx +1);
+ if( j ) {
+
+ switch(pcpArr[lpcpIdx].pt) {
+ case PCP_LABEL:
+ if(state == PS_START){
+ DFPRINTF((stderr," label\n"));
+ state = PS_HAVE_LABEL;
+ } else
+ DFPRINTF((stderr," bad state (%d) for label\n",state));
+ break;
+
+ case PCP_STR:
+ DFPRINTF((stderr," %s is",tokArr[ltokIdx].tok.s));
+ switch(state) {
+ case PS_START:
+ case PS_HAVE_LABEL:
+ DFPRINTF((stderr," mnem\n"));
+ cPmnem = tokArr[ltokIdx].tok.s;
+ state = PS_HAVE_MNEM;
+ break;
+ case PS_HAVE_MNEM:
+ DFPRINTF((stderr," 1st operand\n"));
+ cP1stop = tokArr[ltokIdx].tok.s;
+ //pco1 = newpCodeOp(NULL,PO_GPR_REGISTER);
+ state = PS_HAVE_1OPERAND;
+ break;
+ case PS_HAVE_1OPERAND:
+ DFPRINTF((stderr," error expecting comma\n"));
+ break;
+ case PS_HAVE_COMMA:
+ DFPRINTF((stderr," 2 operands\n"));
+ cP2ndop = tokArr[ltokIdx].tok.s;
+ break;
+ case PS_HAVE_2OPERANDS:
+ break;
+ }
+ break;
+
+ case PCP_WILDVAR:
+ switch(state) {
+ case PS_START:
+ case PS_HAVE_LABEL:
+ DFPRINTF((stderr," wild mnem\n"));
+ state = PS_HAVE_MNEM;
+ break;
+ case PS_HAVE_MNEM:
+ DFPRINTF((stderr," 1st operand is wild\n"));
+ state = PS_HAVE_1OPERAND;
+ break;
+ case PS_HAVE_1OPERAND:
+ DFPRINTF((stderr," error expecting comma\n"));
+ break;
+ case PS_HAVE_COMMA:
+ DFPRINTF((stderr," 2nd operand is wild\n"));
+ break;
+ case PS_HAVE_2OPERANDS:
+ break;
+ }
+ break;
+
+ case PCP_NUMBER:
+ switch(state) {
+ case PS_START:
+ case PS_HAVE_LABEL:
+ fprintf(stderr," ERROR number\n");
+ break;
+ case PS_HAVE_MNEM:
+ DFPRINTF((stderr," 1st operand is a number\n"));
+ state = PS_HAVE_1OPERAND;
+ break;
+ case PS_HAVE_1OPERAND:
+ fprintf(stderr," error expecting comma\n");
+ break;
+ case PS_HAVE_COMMA:
+ DFPRINTF((stderr," 2nd operand is a number\n"));
+ break;
+ case PS_HAVE_2OPERANDS:
+ break;
+ }
+ break;
+
+ case PCP_WILDSTR:
+ break;
+ case PCP_COMMA:
+ if(state == PS_HAVE_1OPERAND){
+ DFPRINTF((stderr," got a comma\n"));
+ state = PS_HAVE_COMMA;
+ } else
+ fprintf(stderr," unexpected comma\n");
+ break;
+
+ }
+
+ matching = 1;
+ parsedPatArr[lparsedPatIdx].pcp = &pcpArr[lpcpIdx];
+ parsedPatArr[lparsedPatIdx].pct = &tokArr[ltokIdx];
+ lparsedPatIdx++;
+
+ //dump1Token(tokArr[ltokIdx].tt);
+
+ if(advTokIdx(<okIdx, strlen(pcpArr[lpcpIdx].tokens) ) ) {
+ DFPRINTF((stderr," reached end \n"));
+ matching = 0;
+ //return;
+ }
+ }
+
+
+ } while ((++lpcpIdx < PCPATTERNS) && !matching);
+
+ } while (matching);
+
+ parsedPatArr[lparsedPatIdx].pcp = NULL;
+ parsedPatArr[lparsedPatIdx].pct = NULL;
+
+ j=k=0;
+ do {
+ int c;
+
+ if( (c=altComparePattern( altArr[k].tokens, &parsedPatArr[j],10) ) ) {
+
+ if( altArr[k].f) {
+ pc = altArr[k].f(&parsedPatArr[j],pcwb);
+ //if(pc && pc->print)
+ // pc->print(stderr,pc);
+ //if(pc && pc->destruct) pc->destruct(pc); dumps core?
+
+ //if(curBlock && pc)
+ //addpCode2pBlock(curBlock, pc);
+ if(pc) {
+ if (pcret) {
+ *pcret = pc;
+ return 0; // Only accept one line for now.
+ } else
+ addpCode2pBlock(pcwb->pb, pc);
+ } else
+ error++;
+ }
+ j += c;
+ }
+ k++;
+ }
+ while(j<=lparsedPatIdx && k<ALTPATTERNS);
+
+ /*
+ DFPRINTF((stderr,"\nConverting parsed line to pCode:\n\n"));
+
+ j = 0;
+ do {
+ if(parsedPatArr[j].pcp && parsedPatArr[j].pcp->f )
+ parsedPatArr[j].pcp->f(&parsedPatArr[j]);
+ DFPRINTF((stderr," %d",parsedPatArr[j].pcp->pt));
+ j++;