home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 221_01 / peephole.c < prev    next >
Text File  |  1979-12-31  |  16KB  |  784 lines

  1. /*#define VAX*/
  2. #define PHASE2
  3. /*#define PHASE3*/
  4. #define P15nov86
  5. #define P17nov86
  6. /*#define P18nov86*/
  7. #define P28nov86
  8. #ifdef VAX
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. #else
  12. #include stdio.h
  13. extern int fputs(), strncmp(), strncpy();
  14. #endif
  15.  
  16. #define save_line_count 20
  17. #define lin_buf_len 1600
  18. #define line 80
  19. #define opt_deps 100
  20.  
  21. /*  Peephole optimizer for 6809 code */
  22. /*  written by Dieter H. Flunkert   */
  23. /*  Written:     */
  24. /*  Version A.07 */
  25. /*    02-dec-85  */
  26. /*  Update:      */
  27. /*    01-jul-86  */
  28. /*    17-jul-86  */
  29. /*    07-nov-86  */
  30. /*    15-nov-86  */
  31. /*    17-nov-86  */
  32. /*    18-nov-86  */
  33. /*    28-nov-86  */
  34.  
  35. /* Global variables    */
  36. char new_table[] = "EQNELEGELTGTHIHSLSLO";
  37. char jump_table[] = "NEEQGTLTGELELSLOHIHS";
  38. char number[] = " LB   ";
  39. #ifdef VAX
  40. FILE *ifp, *ofp;
  41. #else
  42. int ofp, ifp;
  43. #endif
  44. char buffer[line];
  45. char save_buffer[lin_buf_len];
  46. char save_jump[line];
  47. char num_1[line];
  48. char num_2[line];
  49. #ifdef P18nov86
  50. int opt_level, wr_ok;
  51. #endif
  52. int opt_end, opt_id, bp;
  53.  
  54. /* for stand alone  */
  55.  
  56. /* #define EOF -1  */
  57. /* #define NULL 0  */
  58. /* #define EOL 13  */
  59.  
  60. #define jump7 "*+7\n"
  61. #define jump5 " BRA  *+5\n"
  62. #define kommas ",S\n"
  63. #define ldd " LDD  "
  64. #define lddnum " LDD  #"
  65. #define ldd0 " LDD  #0\n"
  66. #define ldd1 " LDD  #1\n"
  67. #define pulsd " PULS D\n"
  68. #define pshsd " PSHS D\n"
  69. #define pshsy " PSHS Y\n"
  70. #define pulsx " PULS X\n"
  71. #define pshsx " PSHS X\n"
  72. #define tfryd " TFR  Y,D\n"
  73. #define addd " ADDD "
  74. #define addd1 " ADDD #1\n"
  75. #define adddsplus " ADDD ,S++\n"
  76. #define coma " COMA\n"
  77. #define comb " COMB\n"
  78. #define subd " SUBD "
  79. #define stb " STB  "
  80. #define ldb " LDB  "
  81. #define stbsplus " STB  [,S++]\n"
  82. #define ldbsplus " LDB  [,S++]\n"
  83. #define lddsplus " LDD  [,S++]\n"
  84. #define stdsplus " STD  [,S++]\n"
  85. #define stdx " STD  ,X\n"
  86. #define std " STD  "
  87. #define leay " LEAY "
  88. #define leax " LEAX "
  89. #define cmpd " CMPD "
  90. #define cmpd0 " CMPD #0\n"
  91. #define cmpdsplus " CMPD ,S++\n"
  92. #define lb " LB"
  93. #define lbeqcc " LBEQ cc"
  94. #define lbnecc " LBNE cc"
  95. #define lbsr " JSR "
  96. #define jmp " JMP "
  97.  
  98. #ifdef VAX
  99. main()
  100. #else
  101. main(argc, argv) int argc, argv[];
  102. #endif
  103. {
  104. /* i points to first free place in save buffer */
  105. /* bp points to next line to be transfered to check buffer */
  106.  
  107.  int i,j;
  108.  int opt;
  109.  
  110. #ifdef VAX
  111. init();
  112. #else
  113. init(argc,argv);
  114. #endif
  115.  opt_end = opt_id = bp = i = 0;
  116.  opt = 
  117. #ifdef P18nov86
  118.  wr_ok =
  119. #endif
  120.  1;
  121.  while(getline() != EOF) {    /* read lines until end of file */
  122.   if(i+line >= lin_buf_len) { /* buffer full? */
  123.     write_buffer();           /* write line to file */
  124.     i=m1_down();              /* move buffer down */
  125.     bp=0;                     /* reset buffer pointer */
  126.   }
  127.   i = copy_append(i);         /* copy to save buffer (append it) */
  128.   while((bp = copy_buffer(bp)) > 0) { /* copy to check buffer */
  129.     if(buffer[0] != ";") {    /* process only valid assembler code */
  130.       if(check_1(opt++) != 0) { /* check if good for optimize */
  131. #ifdef P18nov86
  132.      if(wr_ok) 
  133. #endif
  134.        write_buffer(); /* write first line of buffer to file */
  135. #ifdef P18nov86
  136.      if(!wr_ok) {
  137.        m1_down();                /* shift buffer one line */
  138.        m1_down();
  139.      }
  140. #endif
  141.      i = m1_down();  /* shift buffer one line */
  142.      opt_end = bp = 0;
  143.      opt =
  144. #ifdef P18nov86
  145.      wr_ok =
  146. #endif
  147.      1;
  148.     }
  149.     else {
  150.  
  151.  /* if good for optimize and already the last in this sequence */
  152.  /* write the optimized version and forget the rest     */
  153.  
  154.      if (opt_end < 0) {
  155.       write_opt();
  156.       opt =
  157. #ifdef P18nov86
  158.       wr_ok =
  159. #endif
  160.       1;
  161.       i = move_buffer(bp); /* move buffer down */
  162.       opt_end = opt_id = bp = 0;
  163.      }
  164.     }
  165.    }
  166.   }
  167.  }
  168.  if (save_buffer[bp] != '\0')
  169.   fputs(save_buffer[bp],ofp); /* write the rest of the save buffer */
  170.    fputs(buffer, ofp);   /* write last line */
  171. }
  172. copy_buffer(bp)
  173. /* copy line of save buffer to check buffer */
  174. int bp; /* buffer pointer of save buffer  */
  175. {
  176.  int i;
  177.  
  178.  if (bp < 0) bp = -bp;  /* use absolute value */
  179.  if (save_buffer[bp] == '\0') 
  180.     return (-bp); /* return negative value if nothing to do */
  181.  i = 0;
  182.  while((buffer[i++] = save_buffer[bp++]) != '\n') ;
  183.  buffer[i] = '\0';
  184.  return(bp);
  185. }
  186. write_buffer()
  187. /* write first line from save buffer to output file */
  188. {
  189.  copy_buffer(0);
  190.  fputs(buffer,ofp);
  191. }
  192. m1_down()
  193. /* move save buffer one line 'down'  */
  194. {
  195.  int i;
  196.  
  197.  i = 0;
  198.  while (save_buffer[i++] != '\n') ;
  199.  return(move_buffer(i));
  200. }
  201. move_buffer(bp)
  202. int bp;
  203. /* move buffer bp characters down */
  204. {
  205.  int  j;
  206.  
  207.  j = 0;
  208.  while((save_buffer[j++] = save_buffer[bp++]) != '\0') ;
  209.  return (--j);
  210. }
  211. write_opt()
  212. /* write optimize string to output file  */
  213. {
  214.  int i,len;
  215.  
  216.  i = 0;
  217.  switch(opt_id) {
  218. #ifdef PHASE2
  219.   case 1: {
  220.    fputs(num_2,ofp);
  221.    fputs(num_1,ofp);
  222.    break;
  223.    }
  224. #endif
  225.   case 2: {
  226.    fputs(leax,ofp);
  227.    fputs(num_1,ofp);
  228.    fputs(ldd,ofp);
  229.    fputs(num_2,ofp);
  230.    fputs(stdx,ofp);
  231.    break;
  232.   }
  233.   case 3: {
  234.    fputs(number,ofp);
  235.    fputs(num_2,ofp);
  236.    break;
  237.   }
  238.   case 10: {
  239.    fputs(ldd,ofp);
  240.    fputs(num_1,ofp);
  241.    break;
  242.   }
  243.   case 11: {
  244.    fputs(leay,ofp);
  245.    fputs(num_2,ofp);
  246.    fputs(pshsy,ofp);
  247.    fputs(ldd,ofp);
  248.    fputs(num_1,ofp);
  249.    break;
  250.   }
  251. #ifndef P18nov86
  252.   case 12: {
  253.    fputs(ldb,ofp);
  254.    fputs(num_2,ofp);
  255.    fputs(stb,ofp);
  256.    fputs(num_1,ofp);
  257.    break;
  258.   }
  259. #endif
  260.   case 13: {
  261.    fputs(ldd,ofp);
  262.    fputs(num_1,ofp);
  263.    fputs(subd,ofp);
  264.    fputs(num_2,ofp);
  265.    fputs(std,ofp);
  266.    fputs(num_1,ofp);
  267.    break;
  268.   }
  269.   case 14: {
  270.    fputs(ldb,ofp);
  271.    fputs(num_1,ofp);
  272.    break;
  273.   }
  274.   case 15: {
  275.    fputs(lbsr,ofp);
  276.    fputs(num_2,ofp);
  277.    fputs(std,ofp);
  278.    fputs(num_1,ofp);
  279.    break;
  280.   }
  281. #ifndef P18nov86
  282.   case 16: {
  283.    fputs(ldd,ofp);
  284.    fputs(num_2,ofp);
  285.    fputs(std,ofp);
  286.    fputs(num_1,ofp);
  287.    break;
  288.   }
  289. #endif
  290.   case 17: {
  291.    fputs(ldd,ofp);
  292.    fputs(num_1,ofp);
  293.    fputs(addd,ofp);
  294.    fputs(num_2,ofp);
  295.    fputs(std,ofp);
  296.    fputs(num_1,ofp);
  297.    break;
  298.   }
  299.  case 18:
  300.   fputs(save_jump,ofp);
  301.   fputs("8\n",ofp);
  302.   fputs(ldd0,ofp);
  303.   fputs(jmp,ofp);
  304.   fputs(num_2,ofp);
  305. /*
  306.   fputs(ldd1,ofp);
  307. */
  308.   break;
  309. #ifdef P17nov86
  310.  case 21:
  311.   fputs(lddnum,ofp);
  312.   fputs(num_1,ofp);
  313.   putc('\n',ofp);
  314.   break;
  315. #endif
  316. #ifdef P28nov86
  317.  case 22:
  318.   fputs(num_1,ofp);
  319.   fputs(num_2,ofp);
  320.   break;
  321. #endif
  322.  case 23:
  323.   fputs(num_1,ofp);
  324.   break;
  325.  case 24:
  326.   fputs(lddnum,ofp);
  327.   putc('-',ofp);
  328.   fputs(num_1,ofp);
  329.   break;
  330. #ifdef P18nov86
  331.  case 99:
  332.   fputs(num_2,ofp);
  333.   fputs(num_1,ofp);
  334.   break;
  335. #endif
  336.  default: break;
  337.  }
  338. }
  339. #ifdef VAX
  340. init()
  341. /*  get filenames and open files   */
  342. {
  343.  int i;   /* just for counting */
  344.  char infile[80]; /* file names   */
  345.  char outfile[80];
  346.  
  347.  i = 0;
  348.  fputs("\nFile to optimize? ",stdout);
  349.  while((infile[i]=getchar()) != '\n')
  350.     if(infile[i]!='\b') ++i;
  351.     else {
  352.      if(--i < 0) i = 0;
  353.      putc(' ',stdout);
  354.      putc('\b',stdout);
  355.     }
  356.  infile[i] = '\0';
  357.  if ((ifp = fopen(infile,"r")) == NULL) {
  358.   fputs("\n*** E R R O R *** opening file ",stdout);
  359.     fputs(infile,stdout);
  360.   exit(0);
  361.  }
  362.  i = 0;
  363.  fputs("\nOutput File Name? ",stdout);
  364.  while((outfile[i]=getchar()) != '\n')
  365.     if(outfile[i]!='\b') ++i;
  366.     else {
  367.      if(--i < 0) i=0;
  368.      putc(' ',stdout);
  369.      putc('\b',stdout);
  370.     }
  371.  outfile[i] = '\0';
  372.    if(outfile[0] == '\0') {
  373.     ofp = stdout;
  374.     return;
  375.    }
  376.  if ((ofp = fopen(outfile,"w")) == NULL) {
  377.   fputs("\n*** E R R O R *** opening file ",stdout);
  378.     fputs(outfile,stdout);
  379.   exit(0);
  380.  }
  381. }
  382. #else
  383. init(argc, argv) int argc, argv[]; {
  384. char *argptr;
  385. int i;
  386.   i=0;
  387.   ifp=stdin;
  388.   ofp=stdout;
  389.   if(argc==1) {
  390.     fputs("\nusage peephole <infile >outfile",stderr);
  391.     exit(0);
  392.   }
  393.   while(--argc) {
  394.     argptr=argv[++i];
  395.     if(*argptr=='<') {
  396.       if((ifp=fopen(++argptr,"r")) == 0) {
  397.          fputs("\nerror opening input file",stderr);
  398.          exit(0);
  399.        }
  400.      }
  401.      if(*argptr=='>') {
  402.        if((ofp=fopen(++argptr,"w")) == 0) {
  403.          fputs("\nerror opening output file",stderr);
  404.          exit(0);
  405.        }
  406.      }
  407.    }
  408.  }
  409. #endif
  410. getline()
  411. /* read a line from input file */
  412. {
  413.  int i;
  414.  char c;
  415.  
  416.  i = 0;
  417.  if(CCPOLL()) if(getc(stdin)==3) exit(0);
  418.  while((c = getc(ifp)) != EOF) {
  419.   buffer[i++] = c;
  420.     if(c == '\n') break;
  421.  }
  422.  buffer[i] = '\0';
  423.    if(c == EOF) return EOF;
  424.  return(0);
  425. }
  426. copy_append(i)
  427. /* append a string to the string save area  */
  428. int i;
  429. {
  430.  int j;
  431.  
  432.  j = 0;
  433.  while((save_buffer[i] = buffer[j++]) != '\n')
  434.     if(save_buffer[i++] == '\0') return(--i);
  435.  save_buffer[++i] = '\0';
  436.  return(i);
  437. }
  438. check_1(opt)
  439. /* check if the line is optimizeable */
  440. int opt;
  441. {
  442.  int i;
  443.  switch(opt) {
  444.   case 1: {
  445. #ifdef P18nov86
  446.    if(strcmp(buffer,stdsplus)==0 ||
  447.       strcmp(buffer,stbsplus)==0) {
  448.     strncpy(num_2,buffer,strlen(std));
  449.     if(opt_level) {
  450.       itoa(stackoffset[--opt_level],work);
  451.       i=0;
  452.       while(num_1[i++] != ',');
  453.       strcat(work,kommas);
  454.       strcpy(num_1,work);
  455.       opt_end = -1;
  456.       opt_id = 99;
  457.       return 0;
  458.     }
  459.    }
  460. #endif
  461. #ifdef PHASE2
  462.    if (strcmp(buffer,pshsd) == 0) {
  463.     opt_id = 1;
  464.     return(0);
  465.    }
  466. #endif
  467.    if (strncmp(buffer,leay,(strlen(leay))) == 0) {
  468.     opt_id = 2;
  469.     strcpy(num_1,&buffer[6]);
  470. #ifdef P18nov86
  471.     i=j=0;
  472.     while((work[j++]=num_1[i++]) != ',');
  473.     work[--j]='\0';
  474.     itoa(atoi(work)-(opt_level<<1),work);
  475.     strcat(work,&num_1[--i]);
  476.     strcpy(num_1,work);
  477. #endif
  478.     return(0);
  479.    }
  480.    if (strncmp(&buffer[6],jump7,(strlen(jump7))) == 0) {
  481.     opt_id = 3;
  482.     strncpy(save_jump,buffer,8);
  483.     change_jump();
  484.     return(0);
  485.    }
  486. #ifdef P15nov86
  487.    if(strcmp(pulsd,buffer)==0) {
  488.      opt_id=20;
  489.      return 0;
  490.    }
  491. #endif
  492.    if(strcmp(pshsx,buffer)==0) {
  493.      opt_id=25;
  494.      return 0;
  495.    }
  496. #ifdef P17nov86
  497.    if (strncmp(buffer,lddnum,(strlen(lddnum))) == 0) {
  498.      if(isdigit(buffer[7]) == 0) return 1; 
  499.      opt_id=21;
  500.      strcpy(num_1,&buffer[7]);
  501.      return 0;  
  502.    }
  503. #endif
  504.    if(strncmp(buffer,cmpd0,strlen(cmpd0)) == 0) {
  505.      opt_id=23;
  506.      return 0;
  507.    }
  508.    return(1);
  509.   }
  510.   case 2: {
  511. #ifdef PHASE2
  512.    if (opt_id == 1) {
  513.     if (strncmp(buffer,ldd,(strlen(ldd))) == 0) {
  514.      strcpy(num_1,&buffer[6]);
  515.      return((buffer[6]=='#') || (isalpha(buffer[6])) ? 0 : 1);
  516.     }
  517.     else return(1);
  518.    }
  519. #endif
  520.    if (opt_id == 2) return(strcmp(tfryd,buffer));
  521.    if (opt_id == 3) return(strcmp(ldd0,buffer));
  522.    if (opt_id == 25)
  523.      if(strcmp(buffer,pulsx) == 0) {
  524.        opt_end = -1;
  525.        opt_id = -opt_id;
  526.        return 0;
  527.      }
  528.      else return 1;
  529. #ifdef P15nov86
  530.    if (opt_id == 20) {
  531.      if(strcmp(pshsd,buffer)==0) {
  532.        opt_end = -1;
  533.        return 0;
  534.      }
  535.      else return 1;
  536.    }
  537. #endif
  538. #ifdef P17nov86
  539.    if(opt_id==21) {
  540.      if(strcmp(pshsd,buffer)==0) {
  541.        i=0;
  542.        while(num_1[i++] != '\n');
  543.        num_1[--i] = 0;
  544.        i=atoi(num_1)<<1;
  545.        itoa(i,num_1);
  546.        return 0;
  547.      }
  548. #endif
  549. #ifdef P28nov86
  550.      else if(strncmp(buffer,cmpd,strlen(cmpd))==0) {
  551.        if(buffer[6]=='#' && isdigit(buffer[7])) {
  552.          strcpy(num_2,&buffer[7]);
  553.          opt_id=22;
  554.          return 0;
  555.        }
  556.      }
  557.      else if(strcmp(buffer,coma)==0) {
  558.        opt_id=24;
  559.        return 0;
  560.      }
  561. #endif
  562. #ifdef P17nov86
  563.    }
  564. #endif
  565.    if(opt_id==23) {
  566.      opt_end = -1;
  567.      if(strncmp(buffer,lb,strlen(lb))==0) {
  568.        strcpy(num_1,buffer);
  569.        return 0;
  570.      }
  571.      else return 1;
  572.    }
  573.    return(1);
  574.   }
  575.   case 3: {
  576. #ifdef PHASE2
  577.    if (opt_id == 1) {
  578.     opt_end = -1;
  579.     if (strcmp(buffer,adddsplus) == 0) {
  580.      if(num_1[1]=='0') opt_id = -opt_id;
  581.      strcpy(num_2,addd);
  582.      return(0);
  583.     }
  584. #ifdef PHASE3
  585.     if (strcmp(buffer,cmpdsplus) == 0) {
  586.      strcpy(num_2,cmpd);
  587.      return(0);
  588.     }
  589.     else
  590.       return(1);
  591. #endif
  592.    }
  593. #endif
  594.    if(opt_id == 2) if(strcmp(buffer,pshsd)==0) {
  595. #ifdef P18nov86
  596.        i=j=0;
  597.        while((num_3[j++]=num_1[i++]) != ',');
  598.        num_3[--j] = '\0';
  599.        wr_ok = 0;
  600.        stackoffset[opt_level++] = atoi(num_3);
  601. #endif
  602.        return 0;
  603.    }
  604.    else return 1;
  605.    if(opt_id == 3) return(strcmp(buffer,jump5));
  606.    if(opt_id == 24) return(strcmp(buffer,comb));
  607. #ifdef P17nov86
  608.    if(opt_id == 21)
  609.      if(strcmp(adddsplus,buffer) == 0) {
  610.        opt_end=-1;
  611.        return 0;
  612.      }
  613. #endif
  614. #ifdef P28nov86
  615.    if(opt_id == 22)
  616.      if(strncmp(buffer,lbeqcc,strlen(lbeqcc))==0) {
  617.        opt_end = -1;
  618.        if(strcmp(num_1,num_2)) opt_id = -1;
  619.        else {
  620.          strcpy(num_1,jmp);
  621.          strcpy(num_2,&buffer[6]);
  622.        }
  623.        return 0;
  624.      }
  625.      else if(strncmp(buffer,lbnecc,strlen(lbnecc))==0) {
  626.        opt_end = -1;
  627.        if(strcmp(num_1,num_2)==0) opt_id = -1;
  628.        else {
  629.          strcpy(num_1,jmp);
  630.          strcpy(num_2,&buffer[6]);
  631.        }
  632.        return 0;
  633.      }
  634. #endif
  635.    return(1);
  636.   }
  637.   case 4: {
  638.    if (opt_id == 3) return(strcmp(buffer,ldd1));
  639.    if(opt_id == 24) {
  640.      opt_end = -1;
  641.      return(strcmp(buffer,addd1));
  642.    }
  643.    if (opt_id == 2) {
  644.     if (strcmp(buffer,lddsplus) == 0) {
  645.      opt_id = 10;
  646. #ifdef P18nov86
  647.      --opt_level;
  648. #endif
  649.      opt_end = -1;
  650.      return(0);
  651.     }
  652. #ifndef P18nov86
  653.     if (strncmp(buffer,ldd,(strlen(ldd))) == 0) {
  654.       if ((isdigit(buffer[7])) != 0) {
  655.       strcpy(num_2,&buffer[6]);
  656.       opt_id = 16;
  657.       return(0);
  658.      }
  659.      else return(1);
  660.     }
  661. #endif
  662.     if (strncmp(buffer,leay,(strlen(leay))) == 0) {
  663.      strcpy(num_2,&buffer[6]);
  664.      opt_id = 11;
  665.      return(0);
  666.     }
  667.     if (strcmp(buffer,ldbsplus) == 0) {
  668.      opt_id = 14;
  669. #ifdef P18nov86
  670.      --opt_level;
  671. #endif
  672.      opt_end = -1;
  673.      return (0);
  674.     }
  675. #ifndef P18nov86
  676.     if (strncmp(buffer,ldb,(strlen(ldb))) == 0) {
  677.      if (isdigit(buffer[7]) != 0) {
  678.         strcpy(num_2, &buffer[6]);
  679.       opt_id = 12;
  680.       return(0);
  681.      }
  682.      else return(1);
  683.     }
  684. #endif
  685.     if (strcmp(buffer,pshsd) == 0) {
  686.      opt_id = 13;
  687.      return(0);
  688.     }
  689. /*
  690.     if (strncmp(buffer,lbsr,(strlen(lbsr))) == 0) {
  691.      opt_id = 15;
  692.      strcpy(num_2,&buffer[6]);
  693.      return(0);
  694.     }
  695. */
  696.    }
  697.    return(1);
  698.   }
  699.   case 5: {
  700.    if(opt_id == 3) return(strcmp(buffer,cmpd0));
  701.    if(opt_id == 2) return(strcmp(buffer,pulsx));
  702.    if(opt_id == 11) return(strcmp(buffer,tfryd));
  703. #ifndef P18nov86
  704.    if(/*opt_id == 15 ||*/ opt_id == 16) {
  705.     if(strcmp(buffer,stdsplus) == 0) {
  706.      opt_end = -1;
  707.      return(0);
  708.     }
  709.     else return(1);
  710.    }
  711.    if(opt_id == 12)
  712.     if(strcmp(buffer,stbsplus) == 0) {
  713.      opt_end = -1;
  714.      return(0);
  715.     }
  716.     else return(1);
  717. #endif
  718.    return(strcmp(buffer,lddsplus));
  719.   }
  720.   case 6: {
  721.    if(opt_id == 11) return(strcmp(buffer,pshsd));
  722.    if(opt_id == 13) {
  723.     strcpy(num_2,&buffer[6]);
  724.     if(strncmp(buffer,addd,(strlen(addd))) == 0) {
  725.      opt_id = 17;
  726.      return(0);
  727.     }
  728.     else return(strncmp(buffer,subd,(strlen(subd))));
  729.    }
  730.    opt_end = -1;
  731.    if (opt_id == 2)
  732.      if(strcmp(buffer,stdx)==0) {
  733. #ifdef P18nov86
  734.         --opt_level;
  735. #endif
  736.         return 0;
  737.       }
  738.       else return 1;
  739.    if (opt_id == 3)
  740.     if (strncmp(buffer,lbeqcc,(strlen(lbeqcc))) == 0) {
  741.      i=6;
  742.      while(buffer[i] != '\n')
  743.        if(buffer[++i]=='_') {
  744.          opt_id=18;
  745.          break;
  746.        }
  747.      strcpy(num_2,&buffer[6]);
  748.      return(0);
  749.     }
  750.    return(1);
  751.   }
  752.   case 7: {
  753.    opt_end = -1;
  754.    if (opt_id == 13 || opt_id == 17) {
  755. #ifdef P18nov86
  756.      --opt_level;
  757. #endif
  758.      return(strcmp(buffer,stdsplus));
  759.    }
  760.    return(1);
  761.   }
  762.   default: {
  763.    fputs("\nCase error\n",stdout);
  764.    exit(0);
  765.   }
  766.  }
  767. }
  768. change_jump()
  769. /* change jump according to table */
  770. {
  771.  int counter, i;
  772.  
  773.  counter = 0;
  774.    i = 2;
  775.  while (jump_table[counter] != '\0') {
  776.   if(jump_table[counter] == buffer[i] &
  777.        jump_table[counter+1] == buffer[i+1]) {
  778.    number[++i] = new_table[counter++];
  779.      number[++i] = new_table[counter++];
  780.     }
  781.   else counter = counter + 2;
  782.  }
  783. }
  784.