home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (C) 1992,1993 Peter Edward Cann */
-
- #include<stdio.h>
- #include"comscrpt.h"
-
- char quicke[256];
-
- int parse(listp, survivep)
- int listp, survivep;
- {
- char str[128], cval[8], tickstr[16];
- int value[8];
- int flag, i, j, k, argn, result;
- char c, *sptr;
- flag=result=0;
- for(proglen=0;proglen<PROGSIZ;++proglen)
- {
- if(fgets(str, 80, scriptfd)==NULL)
- {
- flag=1;
- break;
- }
- for(i=0;i<80;++i)
- if(str[i]=='\n')
- {
- str[i]='\0';
- break;
- }
- else if(str[i]=='\0')
- break;
- else if(str[i]=='$')
- if((str[i+1]>='1')&&(str[i+1]<='9'))
- {
- j=strlen(str);
- argn=(str[i+1]-'0')+1;
- if(argn>=mainargc)
- {
- printf("Argument %d cited in statement %d but not supplied on command line.\n", argn-1, proglen);
- exit(101);
- }
- sptr=mainargv[argn];
- k=j+strlen(sptr)-2; /* Nuke $n */
- if(k>80)
- {
- printf("Expanded line too long at statement %d.\n", proglen);
- printf("Raw line reads:\n%s", str);
- exit(101);
- }
- if(k>j)
- for(;j>i;j--,k--)
- str[k]=str[j];
- else if(k<j)
- for(j=i+strlen(sptr),k=i+2;str[j];j++,k++)
- str[j]=str[k];
- for(j=0;sptr[j];j++,i++)
- str[i]=sptr[j];
- i--;
- }
- else if(str[i+1]=='@')
- {
- j=strlen(str);
- k=j+strlen(quicke)-2; /* Nuke $n */
- if(k>80)
- {
- printf("Expanded line too long at statement %d.\n", proglen);
- printf("Raw line reads:\n%s", str);
- exit(101);
- }
- if(k>j)
- for(;j>i;j--,k--)
- str[k]=str[j];
- else if(k<j)
- for(j=i+strlen(quicke),k=i+2;str[j];j++,k++)
- str[j]=str[k];
- for(j=0;quicke[j];j++,i++)
- str[i]=quicke[j];
- i--;
- }
- else
- {
- for(j=i,k=i+1;str[j];j++,k++)
- str[j]=str[k];
- i--;
- }
- if(!strlen(str))
- {
- if(listp)
- printf("--- \n");
- proglen--;
- }
- else
- {
- if(listp)
- if((str[0]==';')||(str[0]==':'))
- printf("--- %s\n", str);
- else
- printf("%03d %s\n", proglen, str);
- if((str[0]!=';')&&(str[0]!='c')&&(str[0]!='+')&&(str[0]!='-')&&(str[0]!='f')&&(str[1]!=' '))
- {
- printf("Missing first delimiting space at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- switch(str[0])
- {
- case ':':
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of label (:) before statement %d.\n", proglen);
- if(!survivep)
- exit(11);
- else
- result++;
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label %d out of range.\n", value[0]);
- if(!survivep)
- exit(11);
- else
- result++;
- }
- if(labels[value[0]]!=-1)
- {
- printf("Label %d duplicated at statement %d.\n", value[0], proglen);
- if(!survivep)
- exit(11);
- else
- result++;
- }
- labels[value[0]]=proglen;
- proglen--;
- break;
- case '*':
- program[proglen].type='*';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of * at statement %d.\n", proglen);
- exit(11);
- }
- if((value[0]<-1)||(value[0]>255))
- {
- printf("Label out of range in * demon at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.number=value[0];
- break;
- case 'j':
- case 'J':
- program[proglen].type='j';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of j at statement %d.\n", proglen);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Jump register out of range in Jump at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.number=value[0];
- break;
- case 'g':
- case 'G':
- program[proglen].type='g';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Goto at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Goto at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.byte=(unsigned char)value[0];
- break;
- case 't':
- case 'T':
- program[proglen].type='t';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Transfer at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Transfer at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.byte=(unsigned char)value[0];
- break;
- case 'r':
- case 'R':
- program[proglen].type='r';
- if(sscanf(str, "%*c %d %d %d", &value[0], &value[1], &value[2])!=3)
- {
- printf("Bad scan of Retry at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Retry at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[2]<0)||(value[2]>255))
- {
- printf("Register out of range in Retry at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.retry.label=value[0];
- program[proglen].stuff.retry.retries=value[1];
- program[proglen].stuff.retry.reg=value[2];
- break;
- case '"':
- program[proglen].type='"';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of display retry register (\") at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Register out of bounds in display retry register (\") at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.number=value[0];
- break;
- case 'l':
- case 'L':
- program[proglen].type='l';
- if(sscanf(str, "%*c %d %d", &value[0], &value[1])!=2)
- {
- printf("Bad scan of Load at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<-1)||(value[0]>255))
- {
- printf("Label out of range in Load at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[1]<0)||(value[1]>255))
- {
- printf("Register out of range in Load at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.load.label=value[0];
- program[proglen].stuff.load.reg=value[1];
- break;
- case '#':
- program[proglen].type='#';
- if(sscanf(str, "%*c %d %d", &value[0], &value[1])!=2)
- {
- printf("Bad scan of Return Check (#) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<-1)||(value[0]>255))
- {
- printf("Label out of range in Return Check (#) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[1]<0)||(value[1]>65535))
- {
- printf("Return value out of range in Return Check (#) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.rtnchk.label=value[0];
- program[proglen].stuff.rtnchk.value=value[1];
- break;
- case '0':
- program[proglen].type='0';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Zero Retry (0) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("reg out of range in Zero Retry (0) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.byte=value[0];
- break;
- case 'p':
- case 'P':
- program[proglen].type='p';
- if((value[2]=sscanf(str, "%*c %s %d", tickstr, &value[1]))<1)
- {
- printf("Bad scan of Process at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((tickstr[0]=='t')||(tickstr[0]=='T'))
- value[0]=atoi(&tickstr[1]);
- else
- value[0]=atoi(tickstr)*18.2;
- program[proglen].stuff.numbers[0]=value[0];
- if(value[2]>1)
- program[proglen].stuff.numbers[1]=value[1];
- else
- program[proglen].stuff.numbers[1]=0;
- break;
- case '>':
- program[proglen].type='>';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of > at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Look-for (>) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
- flag=j=0;
- for(i=2;i<80;++i)
- {
- if(flag)
- if(str[i]=='|')
- program[proglen].stuff.l_and_s.string[j++]='\r';
- else if(str[i]=='`')
- {
- if(str[++i]<'A')
- program[proglen].stuff.l_and_s.string[j]=(str[i]-'0')<<4;
- else if(str[i]<'a')
- program[proglen].stuff.l_and_s.string[j]=(str[i]-'A'+10)<<4;
- else
- program[proglen].stuff.l_and_s.string[j]=(str[i]-'a'+10)<<4;
- if(str[++i]<'A')
- program[proglen].stuff.l_and_s.string[j++]|=str[i]-'0';
- else if(str[i]<'a')
- program[proglen].stuff.l_and_s.string[j++]|=str[i]-'A'+10;
- else
- program[proglen].stuff.l_and_s.string[j++]|=str[i]-'a'+10;
- }
- else
- program[proglen].stuff.l_and_s.string[j++]=str[i];
- if(str[i]==' ')
- flag=1;
- if(str[i]=='\0')
- break;
- }
- break;
- case 'o':
- case 'O':
- program[proglen].type='o';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Outputfile at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Outputfile at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
- flag=j=0;
- for(i=2;i<80;++i)
- {
- if(flag)
- program[proglen].stuff.l_and_s.string[j++]=str[i];
- if(str[i]==' ')
- flag=1;
- if(str[i]=='\0')
- break;
- }
- break;
- case 'i':
- case 'I':
- program[proglen].type='i';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Outputfile at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Outputfile at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
- flag=j=0;
- for(i=2;i<80;++i)
- {
- if(flag)
- program[proglen].stuff.l_and_s.string[j++]=str[i];
- if(str[i]==' ')
- flag=1;
- if(str[i]=='\0')
- break;
- }
- break;
- case '?':
- program[proglen].type='?';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of ? at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in ? at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.byte=value[0];
- break;
- case 'd':
- case 'D':
- program[proglen].type='d';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of d at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in d at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.byte=value[0];
- break;
- case '<':
- program[proglen].type='<';
- j=0;
- for(i=2;i<80;++i)
- {
- if(str[i]=='|')
- program[proglen].stuff.string[j++]='\r';
- else
- program[proglen].stuff.string[j++]=str[i];
- if(str[i]=='\0')
- break;
- }
- break;
- case '!':
- program[proglen].type='!';
- j=0;
- for(i=2;i<80;++i)
- {
- if(str[i]=='|')
- program[proglen].stuff.string[j++]='\n';
- else if(str[i]=='~')
- program[proglen].stuff.string[j++]='\007';
- else
- program[proglen].stuff.string[j++]=str[i];
- if(str[i]=='\0')
- break;
- }
- break;
- case 's':
- case 'S':
- program[proglen].type='s';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of System (s) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in System (s) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.l_and_s.label=value[0];
- flag=j=0;
- for(i=2;i<80;++i)
- {
- if(flag)
- if(str[i]=='|')
- program[proglen].stuff.l_and_s.string[j++]='\r';
- else
- program[proglen].stuff.l_and_s.string[j++]=str[i];
- if(str[i]==' ')
- flag=1;
- if(str[i]=='\0')
- break;
- }
- break;
- case 'X':
- case 'x':
- program[proglen].type='x';
- flag=j=0;
- program[proglen].stuff.l_and_s.ntokens=(unsigned char)0;
- for(i=2;i<80;++i)
- {
- if(str[i]=='|')
- program[proglen].stuff.l_and_s.string[j++]='\r';
- else if(str[i]==' ')
- {
- program[proglen].stuff.l_and_s.string[j++]='\0';
- program[proglen].stuff.l_and_s.ntokens++;
- }
- else
- program[proglen].stuff.l_and_s.string[j++]=str[i];
- if(str[i]=='\0')
- break;
- }
- program[proglen].stuff.l_and_s.string[80]='\0';
- program[proglen].stuff.l_and_s.ntokens++;
- break;
- case 'f':
- case 'F':
- program[proglen].type='f';
- break;
- case '+':
- program[proglen].type='+';
- break;
- case '-':
- program[proglen].type='-';
- break;
- case 'w':
- case 'W':
- program[proglen].type='w';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Wait (w) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.number=value[0];
- break;
- case 'm':
- case 'M':
- program[proglen].type='m';
- if(sscanf(str, "%*c %s", tickstr)!=1)
- {
- printf("Bad scan of Monitor (m) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((tickstr[0]=='t')||(tickstr[0]=='T'))
- value[0]=atoi(&tickstr[1]);
- else
- value[0]=atoi(tickstr)*18.2;
- program[proglen].stuff.number=value[0];
- break;
- case 'k':
- case 'K':
- program[proglen].type='k';
- if(sscanf(str, "%*c %d %c", &value[0], &c)!=2)
- {
- printf("Bad scan of Key (k) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<0)||(value[0]>255))
- {
- printf("Label out of range in Key at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
- if(c=='|')
- program[proglen].stuff.l_and_s.string[0]='\r';
- else if(c=='`')
- {
- if(sscanf(str, "%*c %*d %*c%x", &value[0])!=1)
- {
- printf("Error scanning hex charcode in statement %d. Statement reads:\n%s\n", proglen, str);
- }
- program[proglen].stuff.l_and_s.string[0]=(unsigned char)value[0];
- }
- else
- program[proglen].stuff.l_and_s.string[0]=(unsigned char)c;
- break;
- case 'c':
- case 'C':
- program[proglen].type='c';
- break;
- case 'q':
- case 'Q':
- program[proglen].type='q';
- if(sscanf(str, "%*c %d", &value[0])!=1)
- {
- printf("Bad scan of Quit at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- if((value[0]<128)&&(value[0]!=0))
- {
- printf("Quit with reserved exit code (!=0&&<128) at statement %d.\n", proglen);
- exit(11);
- }
- program[proglen].stuff.number=value[0];
- break;
- case '=':
- value[3]=sscanf(str, "%*c %d %d %c%c%c %d",
- &value[0], &value[1],
- &cval[0], &cval[1], &cval[2],
- &value[2]);
- if((value[3]!=1)&&(value[3]<5))
- {
- printf("Bad scan of port reconfigure (=) at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].type='=';
- if(value[3]==1)
- {
- if(value[0])
- {
- if(1152%value[0])
- {
- printf("Non-PClone COM speed at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- program[proglen].stuff.port.speed=value[0];
- }
- else
- program[proglen].stuff.number=0;
- program[proglen].stuff.port.comnum=-1;
- break;
- }
- else
- {
- program[proglen].stuff.port.comnum=value[0]-1;
- if(value[1])
- if(1152%value[1])
- {
- printf("Non-PClone COM speed at statement %d.\n", proglen);
- printf("Statement reads:\n%s\n", str);
- exit(11);
- }
- else
- program[proglen].stuff.port.speed=value[1];
- else
- program[proglen].stuff.port.speed=0;
- program[proglen].stuff.port.databits=cval[0];
- program[proglen].stuff.port.parity=cval[1];
- program[proglen].stuff.port.stopbits=cval[2];
- if(value[3]>5)
- program[proglen].stuff.port.flowctlflag=value[2];
- else
- program[proglen].stuff.port.flowctlflag=1;
- }
- break;
- case ';':
- proglen--;
- break;
- default:
- printf("Bad command character %c at statement %d.\n", str[0], proglen);
- printf("Statement reads:\n%s\n", str);
- exit(10);
- }
- }
- }
- if(!flag)
- {
- printf("Program too long.\n");
- exit(11);
- }
- return(result);
- }
-
- int validate(survivep)
- int survivep;
- {
- int i, result;
- result=0; /* Count of branch label validity errors */
- for(i=0;i<proglen;i++)
- switch(program[i].type)
- {
- case 'g':
- case 't':
- case '?':
- case 'd':
- if(labels[program[i].stuff.byte]==-1)
- {
- printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.byte, i, program[i].type);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- case 'l':
- if(program[i].stuff.load.label>=0)
- if(labels[program[i].stuff.load.label]==-1)
- {
- printf("Unlisted label %d at statement %d (l).\n", program[i].stuff.load.label, i);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- case '#':
- if(labels[program[i].stuff.rtnchk.label]==-1)
- {
- printf("Unlisted label %d at statement %d (l).\n", program[i].stuff.rtnchk.label, i);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- case '*':
- if((program[i].stuff.number>=0)&&(labels[program[i].stuff.number]==-1))
- {
- printf("Unlisted label %d at statement %d (*).\n", program[i].stuff.number, i);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- case 'r':
- if(labels[program[i].stuff.retry.label]==-1)
- {
- printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.retry.label, i, program[i].type);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- case '>':
- case 'i':
- case 'o':
- case 'k':
- if(labels[program[i].stuff.l_and_s.label]==-1)
- {
- printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.l_and_s.label, i, program[i].type);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- case 's':
- if(labels[program[i].stuff.l_and_s.label]==-1)
- {
- printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.l_and_s.label, i, program[i].type);
- if(!survivep)
- exit(13);
- else
- result++;
- }
- break;
- }
- return(result);
- }
-