home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: DFÜ und Kommunikation / SOS-DFUE.ISO / programm / dos / utility / pccp076 / csparse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-27  |  21.1 KB  |  776 lines

  1. /* Copyright (C) 1992,1993 Peter Edward Cann */
  2.  
  3. #include<stdio.h>
  4. #include"comscrpt.h"
  5.  
  6. char quicke[256];
  7.  
  8. int parse(listp, survivep)
  9.     int listp, survivep;
  10.     {
  11.     char str[128], cval[8], tickstr[16];
  12.     int value[8];
  13.     int flag, i, j, k, argn, result;
  14.     char c, *sptr;
  15.     flag=result=0;
  16.     for(proglen=0;proglen<PROGSIZ;++proglen)
  17.         {
  18.         if(fgets(str, 80, scriptfd)==NULL)
  19.             {
  20.             flag=1;
  21.             break;
  22.             }
  23.         for(i=0;i<80;++i)
  24.             if(str[i]=='\n')
  25.                 {
  26.                 str[i]='\0';
  27.                 break;
  28.                 }
  29.             else if(str[i]=='\0')
  30.                 break;
  31.             else if(str[i]=='$')
  32.                 if((str[i+1]>='1')&&(str[i+1]<='9'))
  33.                     {
  34.                     j=strlen(str);
  35.                     argn=(str[i+1]-'0')+1;
  36.                     if(argn>=mainargc)
  37.                         {
  38.                         printf("Argument %d cited in statement %d but not supplied on command line.\n", argn-1, proglen);
  39.                         exit(101);
  40.                         }
  41.                     sptr=mainargv[argn];
  42.                     k=j+strlen(sptr)-2; /* Nuke $n */
  43.                     if(k>80)
  44.                         {
  45.                         printf("Expanded line too long at statement %d.\n", proglen);
  46.                         printf("Raw line reads:\n%s", str);
  47.                         exit(101);
  48.                         }
  49.                     if(k>j)
  50.                         for(;j>i;j--,k--)
  51.                             str[k]=str[j];
  52.                     else if(k<j)
  53.                         for(j=i+strlen(sptr),k=i+2;str[j];j++,k++)
  54.                             str[j]=str[k];
  55.                     for(j=0;sptr[j];j++,i++)
  56.                         str[i]=sptr[j];
  57.                     i--;
  58.                     }
  59.                 else if(str[i+1]=='@')
  60.                     {
  61.                     j=strlen(str);
  62.                     k=j+strlen(quicke)-2; /* Nuke $n */
  63.                     if(k>80)
  64.                         {
  65.                         printf("Expanded line too long at statement %d.\n", proglen);
  66.                         printf("Raw line reads:\n%s", str);
  67.                         exit(101);
  68.                         }
  69.                     if(k>j)
  70.                         for(;j>i;j--,k--)
  71.                             str[k]=str[j];
  72.                     else if(k<j)
  73.                         for(j=i+strlen(quicke),k=i+2;str[j];j++,k++)
  74.                             str[j]=str[k];
  75.                     for(j=0;quicke[j];j++,i++)
  76.                         str[i]=quicke[j];
  77.                     i--;
  78.                     }
  79.                 else
  80.                     {
  81.                     for(j=i,k=i+1;str[j];j++,k++)
  82.                         str[j]=str[k];
  83.                     i--;
  84.                     }
  85.         if(!strlen(str))
  86.             {
  87.             if(listp)
  88.                 printf("--- \n");
  89.             proglen--;
  90.             }
  91.         else
  92.             {
  93.             if(listp)
  94.                 if((str[0]==';')||(str[0]==':'))
  95.                     printf("--- %s\n", str);
  96.                 else
  97.                     printf("%03d %s\n", proglen, str);
  98.             if((str[0]!=';')&&(str[0]!='c')&&(str[0]!='+')&&(str[0]!='-')&&(str[0]!='f')&&(str[1]!=' '))
  99.                 {
  100.                 printf("Missing first delimiting space at statement %d.\n", proglen);
  101.                 printf("Statement reads:\n%s\n", str);
  102.                 exit(11);
  103.                 }
  104.             switch(str[0])
  105.                 {
  106.                 case ':':
  107.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  108.                         {
  109.                         printf("Bad scan of label (:) before statement %d.\n", proglen);
  110.                         if(!survivep)
  111.                             exit(11);
  112.                         else
  113.                             result++;
  114.                         }
  115.                     if((value[0]<0)||(value[0]>255))
  116.                         {
  117.                         printf("Label %d out of range.\n", value[0]);
  118.                         if(!survivep)
  119.                             exit(11);
  120.                         else
  121.                             result++;
  122.                         }
  123.                     if(labels[value[0]]!=-1)
  124.                         {
  125.                         printf("Label %d duplicated at statement %d.\n", value[0], proglen);
  126.                         if(!survivep)
  127.                             exit(11);
  128.                         else
  129.                             result++;
  130.                         }
  131.                     labels[value[0]]=proglen;
  132.                     proglen--;
  133.                     break;
  134.                 case '*':
  135.                     program[proglen].type='*';
  136.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  137.                         {
  138.                         printf("Bad scan of * at statement %d.\n", proglen);
  139.                         exit(11);
  140.                         }
  141.                     if((value[0]<-1)||(value[0]>255))
  142.                         {
  143.                         printf("Label out of range in * demon at statement %d.\n", proglen);
  144.                         printf("Statement reads:\n%s\n", str);
  145.                         exit(11);
  146.                         }
  147.                     program[proglen].stuff.number=value[0];
  148.                     break;
  149.                 case 'j':
  150.                 case 'J':
  151.                     program[proglen].type='j';
  152.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  153.                         {
  154.                         printf("Bad scan of j at statement %d.\n", proglen);
  155.                         exit(11);
  156.                         }
  157.                     if((value[0]<0)||(value[0]>255))
  158.                         {
  159.                         printf("Jump register out of range in Jump at statement %d.\n", proglen);
  160.                         printf("Statement reads:\n%s\n", str);
  161.                         exit(11);
  162.                         }
  163.                     program[proglen].stuff.number=value[0];
  164.                     break;
  165.                 case 'g':
  166.                 case 'G':
  167.                     program[proglen].type='g';
  168.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  169.                         {
  170.                         printf("Bad scan of Goto at statement %d.\n", proglen);
  171.                         printf("Statement reads:\n%s\n", str);
  172.                         exit(11);
  173.                         }
  174.                     if((value[0]<0)||(value[0]>255))
  175.                         {
  176.                         printf("Label out of range in Goto at statement %d.\n", proglen);
  177.                         printf("Statement reads:\n%s\n", str);
  178.                         exit(11);
  179.                         }
  180.                     program[proglen].stuff.byte=(unsigned char)value[0];
  181.                     break;
  182.                 case 't':
  183.                 case 'T':
  184.                     program[proglen].type='t';
  185.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  186.                         {
  187.                         printf("Bad scan of Transfer at statement %d.\n", proglen);
  188.                         printf("Statement reads:\n%s\n", str);
  189.                         exit(11);
  190.                         }
  191.                     if((value[0]<0)||(value[0]>255))
  192.                         {
  193.                         printf("Label out of range in Transfer at statement %d.\n", proglen);
  194.                         printf("Statement reads:\n%s\n", str);
  195.                         exit(11);
  196.                         }
  197.                     program[proglen].stuff.byte=(unsigned char)value[0];
  198.                     break;
  199.                 case 'r':
  200.                 case 'R':
  201.                     program[proglen].type='r';
  202.                     if(sscanf(str, "%*c %d %d %d", &value[0], &value[1], &value[2])!=3)
  203.                         {
  204.                         printf("Bad scan of Retry at statement %d.\n", proglen);
  205.                         printf("Statement reads:\n%s\n", str);
  206.                         exit(11);
  207.                         }
  208.                     if((value[0]<0)||(value[0]>255))
  209.                         {
  210.                         printf("Label out of range in Retry at statement %d.\n", proglen);
  211.                         printf("Statement reads:\n%s\n", str);
  212.                         exit(11);
  213.                         }
  214.                     if((value[2]<0)||(value[2]>255))
  215.                         {
  216.                         printf("Register out of range in Retry at statement %d.\n", proglen);
  217.                         printf("Statement reads:\n%s\n", str);
  218.                         exit(11);
  219.                         }
  220.                     program[proglen].stuff.retry.label=value[0];
  221.                     program[proglen].stuff.retry.retries=value[1];
  222.                     program[proglen].stuff.retry.reg=value[2];
  223.                     break;
  224.                 case '"':
  225.                     program[proglen].type='"';
  226.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  227.                         {
  228.                         printf("Bad scan of display retry register (\") at statement %d.\n", proglen);
  229.                         printf("Statement reads:\n%s\n", str);
  230.                         exit(11);
  231.                         }
  232.                     if((value[0]<0)||(value[0]>255))
  233.                         {
  234.                         printf("Register out of bounds in display retry register (\") at statement %d.\n", proglen);
  235.                         printf("Statement reads:\n%s\n", str);
  236.                         exit(11);
  237.                         }
  238.                     program[proglen].stuff.number=value[0];
  239.                     break;
  240.                 case 'l':
  241.                 case 'L':
  242.                     program[proglen].type='l';
  243.                     if(sscanf(str, "%*c %d %d", &value[0], &value[1])!=2)
  244.                         {
  245.                         printf("Bad scan of Load at statement %d.\n", proglen);
  246.                         printf("Statement reads:\n%s\n", str);
  247.                         exit(11);
  248.                         }
  249.                     if((value[0]<-1)||(value[0]>255))
  250.                         {
  251.                         printf("Label out of range in Load at statement %d.\n", proglen);
  252.                         printf("Statement reads:\n%s\n", str);
  253.                         exit(11);
  254.                         }
  255.                     if((value[1]<0)||(value[1]>255))
  256.                         {
  257.                         printf("Register out of range in Load at statement %d.\n", proglen);
  258.                         printf("Statement reads:\n%s\n", str);
  259.                         exit(11);
  260.                         }
  261.                     program[proglen].stuff.load.label=value[0];
  262.                     program[proglen].stuff.load.reg=value[1];
  263.                     break;
  264.                 case '#':
  265.                     program[proglen].type='#';
  266.                     if(sscanf(str, "%*c %d %d", &value[0], &value[1])!=2)
  267.                         {
  268.                         printf("Bad scan of Return Check (#) at statement %d.\n", proglen);
  269.                         printf("Statement reads:\n%s\n", str);
  270.                         exit(11);
  271.                         }
  272.                     if((value[0]<-1)||(value[0]>255))
  273.                         {
  274.                         printf("Label out of range in Return Check (#) at statement %d.\n", proglen);
  275.                         printf("Statement reads:\n%s\n", str);
  276.                         exit(11);
  277.                         }
  278.                     if((value[1]<0)||(value[1]>65535))
  279.                         {
  280.                         printf("Return value out of range in Return Check (#) at statement %d.\n", proglen);
  281.                         printf("Statement reads:\n%s\n", str);
  282.                         exit(11);
  283.                         }
  284.                     program[proglen].stuff.rtnchk.label=value[0];
  285.                     program[proglen].stuff.rtnchk.value=value[1];
  286.                     break;
  287.                 case '0':
  288.                     program[proglen].type='0';
  289.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  290.                         {
  291.                         printf("Bad scan of Zero Retry (0) at statement %d.\n", proglen);
  292.                         printf("Statement reads:\n%s\n", str);
  293.                         exit(11);
  294.                         }
  295.                     if((value[0]<0)||(value[0]>255))
  296.                         {
  297.                         printf("reg out of range in Zero Retry (0) at statement %d.\n", proglen);
  298.                         printf("Statement reads:\n%s\n", str);
  299.                         exit(11);
  300.                         }
  301.                     program[proglen].stuff.byte=value[0];
  302.                     break;
  303.                 case 'p':
  304.                 case 'P':
  305.                     program[proglen].type='p';
  306.                     if((value[2]=sscanf(str, "%*c %s %d", tickstr, &value[1]))<1)
  307.                         {
  308.                         printf("Bad scan of Process at statement %d.\n", proglen);
  309.                         printf("Statement reads:\n%s\n", str);
  310.                         exit(11);
  311.                         }
  312.                     if((tickstr[0]=='t')||(tickstr[0]=='T'))
  313.                         value[0]=atoi(&tickstr[1]);
  314.                     else
  315.                         value[0]=atoi(tickstr)*18.2;
  316.                     program[proglen].stuff.numbers[0]=value[0];
  317.                     if(value[2]>1)
  318.                         program[proglen].stuff.numbers[1]=value[1];
  319.                     else
  320.                         program[proglen].stuff.numbers[1]=0;
  321.                     break;
  322.                 case '>':
  323.                     program[proglen].type='>';
  324.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  325.                         {
  326.                         printf("Bad scan of > at statement %d.\n", proglen);
  327.                         printf("Statement reads:\n%s\n", str);
  328.                         exit(11);
  329.                         }
  330.                     if((value[0]<0)||(value[0]>255))
  331.                         {
  332.                         printf("Label out of range in Look-for (>) at statement %d.\n", proglen);
  333.                         printf("Statement reads:\n%s\n", str);
  334.                         exit(11);
  335.                         }
  336.                     program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
  337.                     flag=j=0;
  338.                     for(i=2;i<80;++i)
  339.                         {
  340.                         if(flag)
  341.                             if(str[i]=='|')
  342.                                 program[proglen].stuff.l_and_s.string[j++]='\r';
  343.                             else if(str[i]=='`')
  344.                                 {
  345.                                 if(str[++i]<'A')
  346.                                     program[proglen].stuff.l_and_s.string[j]=(str[i]-'0')<<4;
  347.                                 else if(str[i]<'a')
  348.                                     program[proglen].stuff.l_and_s.string[j]=(str[i]-'A'+10)<<4;
  349.                                 else
  350.                                     program[proglen].stuff.l_and_s.string[j]=(str[i]-'a'+10)<<4;
  351.                                 if(str[++i]<'A')
  352.                                     program[proglen].stuff.l_and_s.string[j++]|=str[i]-'0';
  353.                                 else if(str[i]<'a')
  354.                                     program[proglen].stuff.l_and_s.string[j++]|=str[i]-'A'+10;
  355.                                 else
  356.                                     program[proglen].stuff.l_and_s.string[j++]|=str[i]-'a'+10;
  357.                                 }
  358.                             else
  359.                                 program[proglen].stuff.l_and_s.string[j++]=str[i];
  360.                         if(str[i]==' ')
  361.                             flag=1;
  362.                         if(str[i]=='\0')
  363.                             break;
  364.                         }
  365.                     break;
  366.                 case 'o':
  367.                 case 'O':
  368.                     program[proglen].type='o';
  369.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  370.                         {
  371.                         printf("Bad scan of Outputfile at statement %d.\n", proglen);
  372.                         printf("Statement reads:\n%s\n", str);
  373.                         exit(11);
  374.                         }
  375.                     if((value[0]<0)||(value[0]>255))
  376.                         {
  377.                         printf("Label out of range in Outputfile at statement %d.\n", proglen);
  378.                         printf("Statement reads:\n%s\n", str);
  379.                         exit(11);
  380.                         }
  381.                     program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
  382.                     flag=j=0;
  383.                     for(i=2;i<80;++i)
  384.                         {
  385.                         if(flag)
  386.                                 program[proglen].stuff.l_and_s.string[j++]=str[i];
  387.                         if(str[i]==' ')
  388.                             flag=1;
  389.                         if(str[i]=='\0')
  390.                             break;
  391.                         }
  392.                     break;
  393.                 case 'i':
  394.                 case 'I':
  395.                     program[proglen].type='i';
  396.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  397.                         {
  398.                         printf("Bad scan of Outputfile at statement %d.\n", proglen);
  399.                         printf("Statement reads:\n%s\n", str);
  400.                         exit(11);
  401.                         }
  402.                     if((value[0]<0)||(value[0]>255))
  403.                         {
  404.                         printf("Label out of range in Outputfile at statement %d.\n", proglen);
  405.                         printf("Statement reads:\n%s\n", str);
  406.                         exit(11);
  407.                         }
  408.                     program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
  409.                     flag=j=0;
  410.                     for(i=2;i<80;++i)
  411.                         {
  412.                         if(flag)
  413.                                 program[proglen].stuff.l_and_s.string[j++]=str[i];
  414.                         if(str[i]==' ')
  415.                             flag=1;
  416.                         if(str[i]=='\0')
  417.                             break;
  418.                         }
  419.                     break;
  420.                 case '?':
  421.                     program[proglen].type='?';
  422.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  423.                         {
  424.                         printf("Bad scan of ? at statement %d.\n", proglen);
  425.                         printf("Statement reads:\n%s\n", str);
  426.                         exit(11);
  427.                         }
  428.                     if((value[0]<0)||(value[0]>255))
  429.                         {
  430.                         printf("Label out of range in ? at statement %d.\n", proglen);
  431.                         printf("Statement reads:\n%s\n", str);
  432.                         exit(11);
  433.                         }
  434.                     program[proglen].stuff.byte=value[0];
  435.                     break;
  436.                 case 'd':
  437.                 case 'D':
  438.                     program[proglen].type='d';
  439.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  440.                         {
  441.                         printf("Bad scan of d at statement %d.\n", proglen);
  442.                         printf("Statement reads:\n%s\n", str);
  443.                         exit(11);
  444.                         }
  445.                     if((value[0]<0)||(value[0]>255))
  446.                         {
  447.                         printf("Label out of range in d at statement %d.\n", proglen);
  448.                         printf("Statement reads:\n%s\n", str);
  449.                         exit(11);
  450.                         }
  451.                     program[proglen].stuff.byte=value[0];
  452.                     break;
  453.                 case '<':
  454.                     program[proglen].type='<';
  455.                     j=0;
  456.                     for(i=2;i<80;++i)
  457.                         {
  458.                         if(str[i]=='|')
  459.                             program[proglen].stuff.string[j++]='\r';
  460.                         else
  461.                             program[proglen].stuff.string[j++]=str[i];
  462.                         if(str[i]=='\0')
  463.                             break;
  464.                         }
  465.                     break;
  466.                 case '!':
  467.                     program[proglen].type='!';
  468.                     j=0;
  469.                     for(i=2;i<80;++i)
  470.                         {
  471.                         if(str[i]=='|')
  472.                             program[proglen].stuff.string[j++]='\n';
  473.                         else if(str[i]=='~')
  474.                             program[proglen].stuff.string[j++]='\007';
  475.                         else
  476.                             program[proglen].stuff.string[j++]=str[i];
  477.                         if(str[i]=='\0')
  478.                             break;
  479.                         }
  480.                     break;
  481.                 case 's':
  482.                 case 'S':
  483.                     program[proglen].type='s';
  484.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  485.                         {
  486.                         printf("Bad scan of System (s) at statement %d.\n", proglen);
  487.                         printf("Statement reads:\n%s\n", str);
  488.                         exit(11);
  489.                         }
  490.                     if((value[0]<0)||(value[0]>255))
  491.                         {
  492.                         printf("Label out of range in System (s) at statement %d.\n", proglen);
  493.                         printf("Statement reads:\n%s\n", str);
  494.                         exit(11);
  495.                         }
  496.                     program[proglen].stuff.l_and_s.label=value[0];
  497.                     flag=j=0;
  498.                     for(i=2;i<80;++i)
  499.                         {
  500.                         if(flag)
  501.                             if(str[i]=='|')
  502.                                 program[proglen].stuff.l_and_s.string[j++]='\r';
  503.                             else
  504.                                 program[proglen].stuff.l_and_s.string[j++]=str[i];
  505.                         if(str[i]==' ')
  506.                             flag=1;
  507.                         if(str[i]=='\0')
  508.                             break;
  509.                         }
  510.                     break;
  511.                 case 'X':
  512.                 case 'x':
  513.                     program[proglen].type='x';
  514.                     flag=j=0;
  515.                     program[proglen].stuff.l_and_s.ntokens=(unsigned char)0;
  516.                     for(i=2;i<80;++i)
  517.                         {
  518.                         if(str[i]=='|')
  519.                             program[proglen].stuff.l_and_s.string[j++]='\r';
  520.                         else if(str[i]==' ')
  521.                             {
  522.                             program[proglen].stuff.l_and_s.string[j++]='\0';
  523.                             program[proglen].stuff.l_and_s.ntokens++;
  524.                             }
  525.                         else
  526.                             program[proglen].stuff.l_and_s.string[j++]=str[i];
  527.                         if(str[i]=='\0')
  528.                             break;
  529.                         }
  530.                     program[proglen].stuff.l_and_s.string[80]='\0';
  531.                     program[proglen].stuff.l_and_s.ntokens++;
  532.                     break;
  533.                 case 'f':
  534.                 case 'F':
  535.                     program[proglen].type='f';
  536.                     break;
  537.                 case '+':
  538.                     program[proglen].type='+';
  539.                     break;
  540.                 case '-':
  541.                     program[proglen].type='-';
  542.                     break;
  543.                 case 'w':
  544.                 case 'W':
  545.                     program[proglen].type='w';
  546.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  547.                         {
  548.                         printf("Bad scan of Wait (w) at statement %d.\n", proglen);
  549.                         printf("Statement reads:\n%s\n", str);
  550.                         exit(11);
  551.                         }
  552.                     program[proglen].stuff.number=value[0];
  553.                     break;
  554.                 case 'm':
  555.                 case 'M':
  556.                     program[proglen].type='m';
  557.                     if(sscanf(str, "%*c %s", tickstr)!=1)
  558.                         {
  559.                         printf("Bad scan of Monitor (m) at statement %d.\n", proglen);
  560.                         printf("Statement reads:\n%s\n", str);
  561.                         exit(11);
  562.                         }
  563.                     if((tickstr[0]=='t')||(tickstr[0]=='T'))
  564.                         value[0]=atoi(&tickstr[1]);
  565.                     else
  566.                         value[0]=atoi(tickstr)*18.2;
  567.                     program[proglen].stuff.number=value[0];
  568.                     break;
  569.                 case 'k':
  570.                 case 'K':
  571.                     program[proglen].type='k';
  572.                     if(sscanf(str, "%*c %d %c", &value[0], &c)!=2)
  573.                         {
  574.                         printf("Bad scan of Key (k) at statement %d.\n", proglen);
  575.                         printf("Statement reads:\n%s\n", str);
  576.                         exit(11);
  577.                         }
  578.                     if((value[0]<0)||(value[0]>255))
  579.                         {
  580.                         printf("Label out of range in Key at statement %d.\n", proglen);
  581.                         printf("Statement reads:\n%s\n", str);
  582.                         exit(11);
  583.                         }
  584.                     program[proglen].stuff.l_and_s.label=(unsigned char)value[0];
  585.                     if(c=='|')
  586.                         program[proglen].stuff.l_and_s.string[0]='\r';
  587.                     else if(c=='`')
  588.                         {
  589.                         if(sscanf(str, "%*c %*d %*c%x", &value[0])!=1)
  590.                             {
  591.                             printf("Error scanning hex charcode in statement %d. Statement reads:\n%s\n", proglen, str);
  592.                             }
  593.                         program[proglen].stuff.l_and_s.string[0]=(unsigned char)value[0];
  594.                         }
  595.                     else
  596.                         program[proglen].stuff.l_and_s.string[0]=(unsigned char)c;
  597.                     break;
  598.                 case 'c':
  599.                 case 'C':
  600.                     program[proglen].type='c';
  601.                     break;
  602.                 case 'q':
  603.                 case 'Q':
  604.                     program[proglen].type='q';
  605.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  606.                         {
  607.                         printf("Bad scan of Quit at statement %d.\n", proglen);
  608.                         printf("Statement reads:\n%s\n", str);
  609.                         exit(11);
  610.                         }
  611.                     if((value[0]<128)&&(value[0]!=0))
  612.                         {
  613.                         printf("Quit with reserved exit code (!=0&&<128) at statement %d.\n", proglen);
  614.                         exit(11);
  615.                         }
  616.                     program[proglen].stuff.number=value[0];
  617.                     break;
  618.                 case '=':
  619.                     value[3]=sscanf(str, "%*c %d %d %c%c%c %d",
  620.                         &value[0], &value[1],
  621.                         &cval[0], &cval[1], &cval[2],
  622.                         &value[2]);
  623.                     if((value[3]!=1)&&(value[3]<5))
  624.                         {
  625.                         printf("Bad scan of port reconfigure (=) at statement %d.\n", proglen);
  626.                         printf("Statement reads:\n%s\n", str);
  627.                         exit(11);
  628.                         }
  629.                     program[proglen].type='=';
  630.                     if(value[3]==1)
  631.                         {
  632.                         if(value[0])
  633.                             {
  634.                             if(1152%value[0])
  635.                                 {
  636.                                 printf("Non-PClone COM speed at statement %d.\n", proglen);
  637.                                 printf("Statement reads:\n%s\n", str);
  638.                                 exit(11);
  639.                                 }
  640.                             program[proglen].stuff.port.speed=value[0];
  641.                             }
  642.                         else
  643.                             program[proglen].stuff.number=0;
  644.                         program[proglen].stuff.port.comnum=-1;
  645.                         break;
  646.                         }
  647.                     else
  648.                         {
  649.                         program[proglen].stuff.port.comnum=value[0]-1;
  650.                         if(value[1])
  651.                             if(1152%value[1])
  652.                                 {
  653.                                 printf("Non-PClone COM speed at statement %d.\n", proglen);
  654.                                 printf("Statement reads:\n%s\n", str);
  655.                                 exit(11);
  656.                                 }
  657.                             else
  658.                                 program[proglen].stuff.port.speed=value[1];
  659.                         else
  660.                             program[proglen].stuff.port.speed=0;
  661.                         program[proglen].stuff.port.databits=cval[0];
  662.                         program[proglen].stuff.port.parity=cval[1];
  663.                         program[proglen].stuff.port.stopbits=cval[2];
  664.                         if(value[3]>5)
  665.                             program[proglen].stuff.port.flowctlflag=value[2];
  666.                         else
  667.                             program[proglen].stuff.port.flowctlflag=1;
  668.                         }
  669.                     break;
  670.                 case ';':
  671.                     proglen--;
  672.                     break;
  673.                 default:
  674.                     printf("Bad command character %c at statement %d.\n", str[0], proglen);
  675.                     printf("Statement reads:\n%s\n", str);
  676.                     exit(10);
  677.                 }
  678.             }
  679.         }
  680.     if(!flag)
  681.         {
  682.         printf("Program too long.\n");
  683.         exit(11);
  684.         }
  685.     return(result);
  686.     }
  687.  
  688. int validate(survivep)
  689.     int survivep;
  690.     {
  691.     int i, result;
  692.     result=0; /* Count of branch label validity errors */
  693.     for(i=0;i<proglen;i++)
  694.         switch(program[i].type)
  695.             {
  696.             case 'g':
  697.             case 't':
  698.             case '?':
  699.             case 'd':
  700.                 if(labels[program[i].stuff.byte]==-1)
  701.                     {
  702.                     printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.byte, i, program[i].type);
  703.                     if(!survivep)
  704.                         exit(13);
  705.                     else
  706.                         result++;
  707.                     }
  708.                 break;
  709.             case 'l':
  710.                 if(program[i].stuff.load.label>=0)
  711.                     if(labels[program[i].stuff.load.label]==-1)
  712.                         {
  713.                         printf("Unlisted label %d at statement %d (l).\n", program[i].stuff.load.label, i);
  714.                         if(!survivep)
  715.                             exit(13);
  716.                         else
  717.                             result++;
  718.                         }
  719.                 break;
  720.             case '#':
  721.                 if(labels[program[i].stuff.rtnchk.label]==-1)
  722.                     {
  723.                     printf("Unlisted label %d at statement %d (l).\n", program[i].stuff.rtnchk.label, i);
  724.                     if(!survivep)
  725.                         exit(13);
  726.                     else
  727.                         result++;
  728.                     }
  729.                 break;
  730.             case '*':
  731.                 if((program[i].stuff.number>=0)&&(labels[program[i].stuff.number]==-1))
  732.                     {
  733.                     printf("Unlisted label %d at statement %d (*).\n", program[i].stuff.number, i);
  734.                     if(!survivep)
  735.                         exit(13);
  736.                     else
  737.                         result++;
  738.                     }
  739.                 break;
  740.             case 'r':
  741.                 if(labels[program[i].stuff.retry.label]==-1)
  742.                     {
  743.                     printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.retry.label, i, program[i].type);
  744.                     if(!survivep)
  745.                         exit(13);
  746.                     else
  747.                         result++;
  748.                     }
  749.                 break;
  750.             case '>':
  751.             case 'i':
  752.             case 'o':
  753.             case 'k':
  754.                 if(labels[program[i].stuff.l_and_s.label]==-1)
  755.                     {
  756.                     printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.l_and_s.label, i, program[i].type);
  757.                     if(!survivep)
  758.                         exit(13);
  759.                     else
  760.                         result++;
  761.                     }
  762.                 break;
  763.             case 's':
  764.                 if(labels[program[i].stuff.l_and_s.label]==-1)
  765.                     {
  766.                     printf("Unlisted label %d at statement %d (%c).\n", program[i].stuff.l_and_s.label, i, program[i].type);
  767.                     if(!survivep)
  768.                         exit(13);
  769.                     else
  770.                         result++;
  771.                     }
  772.                 break;
  773.             }
  774.     return(result);
  775.     }
  776.