home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / comp / os / minix / 5126 / patch4.2c.Z / patch4.2c
Encoding:
Text File  |  1993-01-11  |  32.6 KB  |  1,424 lines

  1. *** src/msgout.c.o    Mon Dec  7 13:13:17 1992
  2. --- src/msgout.c    Mon Dec  7 13:13:20 1992
  3. ***************
  4. *** 49,55 ****
  5.   # define VA_START(a,s)    va_start(a,s)
  6.   # ifdef __STDC__
  7.   #  define P1(p1, p2)    (p1 p2, ...)
  8. ! #  define P2(p1, p2, p3, p4)    (p1 p2, p3, p4, ...)
  9.   # else
  10.   #  define P1(p1, p2)    (p2) p1 p2;
  11.   #  define P2(p1, p2, p3, p4)    (p2, p4) p1 p2; p3 p4;
  12. --- 49,55 ----
  13.   # define VA_START(a,s)    va_start(a,s)
  14.   # ifdef __STDC__
  15.   #  define P1(p1, p2)    (p1 p2, ...)
  16. ! #  define P2(p1, p2, p3, p4)    (p1 p2, p3 p4, ...)
  17.   # else
  18.   #  define P1(p1, p2)    (p2) p1 p2;
  19.   #  define P2(p1, p2, p3, p4)    (p2, p4) p1 p2; p3 p4;
  20. ***************
  21. *** 128,133 ****
  22. --- 128,134 ----
  23.   /* ERR_FIELD     */    "no field allowed here",
  24.   /* ERR_FPCON    */     "illegal floating-point constant",
  25.   /* ERR_IDEXPECT     */    "identifier expected",
  26. + /* ERR_ILLCAST    */     "illegal cast operation",
  27.   /* ERR_ILLCHAR    */     "illegal character '%c'",
  28.   /* ERR_ILLCLASS    */    "illegal storage class",
  29.   /* ERR_ILLINIT    */    "illegal initialization",
  30. ***************
  31. *** 186,196 ****
  32. --- 187,199 ----
  33.    *    code, but are quite likely not be an error.
  34.    */
  35.   /* WARN_0TYPEDEF */    "zero-sized typedef may be changed by initialisations",
  36. + /* WARN_ADDARRAY */    "& operator on array ignored",
  37.   /* WARN_ADDFUNC */    "& operator on function ignored",
  38.   /* WARN_EMPTY */    "empty statment",
  39.   /* WARN_HIDE */        "definition of '%s' hides an earlier definition",
  40.   /* WARN_IMPLICIT */    "argument '%s' implicitly declared 'int'",
  41.   /* WARN_IMPLICITFN */    "implicitly declared function: 'int %s()'",
  42. + /* WARN_INCOMPLETE */    "initialisation incomplete - remaining fields zeroed",
  43.   /* WARN_NOTKANDR */    "the use of '%s' is not allowed under strict K&R C",
  44.   /* WARN_NOTUSED */    "variable/function '%s' not used",
  45.   /*
  46. ***************
  47. *** 224,230 ****
  48.   /* WARN_FLDTYPE    */    "bit field type should be unsigned or int",
  49.   /* WARN_NOCOPY */    "didn't copy local struct/union in save_type",
  50.   /* WARN_PRAGMA */    "#pragma ignored",
  51. - /* WARN_STRINGCUT */    "string constant cut as it exceeds %d characters",
  52.   /*
  53.    *    Messages below this point are output without file/line number details
  54.    */
  55. --- 227,232 ----
  56. ***************
  57. *** 286,292 ****
  58.   va_list ap;
  59.   
  60.     VA_START (ap, formatstr);
  61. !   (void) vfprintf (stderr, formatstr, ap);
  62.     va_end(ap);
  63.   }
  64.   
  65. --- 288,294 ----
  66.   va_list ap;
  67.   
  68.     VA_START (ap, formatstr);
  69. !   VOIDCAST vfprintf (stderr, formatstr, ap);
  70.     va_end(ap);
  71.   }
  72.   
  73. ***************
  74. *** 301,307 ****
  75.   va_list ap;
  76.   
  77.     VA_START (ap, formatstr);
  78. !   (void) vfprintf (icode, formatstr, ap);
  79.     va_end(ap);
  80.   }
  81.   #endif /* ICODE */
  82. --- 303,309 ----
  83.   va_list ap;
  84.   
  85.     VA_START (ap, formatstr);
  86. !   VOIDCAST vfprintf (icode, formatstr, ap);
  87.     va_end(ap);
  88.   }
  89.   #endif /* ICODE */
  90. ***************
  91. *** 316,322 ****
  92.   va_list ap;
  93.   
  94.     VA_START (ap, formatstr);
  95. !   (void) vfprintf (list, formatstr, ap);
  96.     va_end(ap);
  97.   }
  98.   
  99. --- 318,324 ----
  100.   va_list ap;
  101.   
  102.     VA_START (ap, formatstr);
  103. !   VOIDCAST vfprintf (list, formatstr, ap);
  104.     va_end(ap);
  105.   }
  106.   
  107. ***************
  108. *** 330,336 ****
  109.   va_list ap;
  110.   
  111.     VA_START (ap, formatstr);
  112. !   (void) vfprintf (output, formatstr, ap);
  113.     va_end(ap);
  114.   }
  115.   
  116. --- 332,338 ----
  117.   va_list ap;
  118.   
  119.     VA_START (ap, formatstr);
  120. !   VOIDCAST vfprintf (output, formatstr, ap);
  121.     va_end(ap);
  122.   }
  123.   
  124. ***************
  125. *** 344,350 ****
  126.   
  127.     VA_START(ap,msgnum);
  128.     open_message("C68");
  129. !   (void) vfprintf (list,get_message(msgnum),ap);
  130.     lprintf ("\n");
  131.     va_end(ap);
  132.   }
  133. --- 346,352 ----
  134.   
  135.     VA_START(ap,msgnum);
  136.     open_message("C68");
  137. !   VOIDCAST vfprintf (list,get_message(msgnum),ap);
  138.     lprintf ("\n");
  139.     va_end(ap);
  140.   }
  141. ***************
  142. *** 398,409 ****
  143.       if (list_option) {
  144.           /* output details to listing file */
  145.       lprintf (" *** %s",get_message(errtype));
  146. !     (void) vfprintf(list, get_message(msgnum), ap);
  147.       lprintf ("\n");
  148.       }
  149.     }
  150.     /* finally we output text + newline */
  151. !   (void) vfprintf (stderr, get_message(msgnum), ap);
  152.     eprintf ("\n");
  153.   
  154.     if (msgnum < WARN_BASE) {
  155. --- 400,411 ----
  156.       if (list_option) {
  157.           /* output details to listing file */
  158.       lprintf (" *** %s",get_message(errtype));
  159. !     VOIDCAST vfprintf(list, get_message(msgnum), ap);
  160.       lprintf ("\n");
  161.       }
  162.     }
  163.     /* finally we output text + newline */
  164. !   VOIDCAST vfprintf (stderr, get_message(msgnum), ap);
  165.     eprintf ("\n");
  166.   
  167.     if (msgnum < WARN_BASE) {
  168. ***************
  169. *** 428,438 ****
  170.       static int      beenhere = 0;
  171.   
  172.       VA_START (ap,msg);
  173. !     message(MSG_FATAL,routine);
  174. !     (void) vfprintf(stderr,msg,ap);
  175. !     message(MSG_MISSING);
  176. !     if (!beenhere) {
  177. !     beenhere = 1;
  178.       flush_peep();
  179.       }
  180.       va_end(ap);
  181. --- 430,440 ----
  182.       static int      beenhere = 0;
  183.   
  184.       VA_START (ap,msg);
  185. !     if (!beenhere) {
  186. !     beenhere = 1;
  187. !     message(MSG_FATAL,routine);
  188. !     VOIDCAST vfprintf(stderr,msg,ap);
  189. !     message(MSG_MISSING);
  190.       flush_peep();
  191.       }
  192.       va_end(ap);
  193. *** src/optimize.c.o    Mon Dec  7 13:13:36 1992
  194. --- src/optimize.c    Mon Dec  7 13:13:40 1992
  195. ***************
  196. *** 80,86 ****
  197.               epf = ep0->v.f * ep1->v.f;
  198.               break;
  199.             case en_div:
  200. !         if (ep1->v.f == 0.0) {
  201.               message(GWARN_DIVZERO);
  202.               ep->nodetype = en_div;
  203.           } else {
  204. --- 80,86 ----
  205.               epf = ep0->v.f * ep1->v.f;
  206.               break;
  207.             case en_div:
  208. !         if (ep1->v.f == ((double) 0)) {
  209.               message(GWARN_DIVZERO);
  210.               ep->nodetype = en_div;
  211.           } else {
  212. *** src/out386_bas.c.o    Mon Dec  7 13:13:50 1992
  213. --- src/out386_bas.c    Mon Dec  7 13:13:54 1992
  214. ***************
  215. *** 64,69 ****
  216. --- 64,70 ----
  217.   
  218.   #define    BI    1
  219.   #define SP    2
  220. + #define FP    4
  221.   
  222.   static struct oplst {
  223.       char           *s;
  224. ***************
  225. *** 71,76 ****
  226. --- 72,78 ----
  227.       int            sa;    /* special addressing modes:
  228.                    *    BI    immediate is bracketed,
  229.                    *    SP    size prefix needed.
  230. +              *    FP    387 op
  231.                    */
  232.   }               opl[] =
  233.   
  234. ***************
  235. *** 119,139 ****
  236.   "rep",        op_rep,        SP,
  237.   "movs",        op_smov,    BI | SP,
  238.   "test",        op_test,    BI | SP,
  239. ! "fadd",        op_fadd,    BI | SP,
  240. ! "fsub",        op_fsub,    BI | SP,
  241. ! "fsubr",    op_fsubr,    BI | SP,
  242. ! "fmul",        op_fmul,    BI | SP,
  243. ! "fdiv",        op_fdiv,    BI | SP,
  244. ! "fdivr",    op_fdivr,    BI | SP,
  245. ! "fchs",        op_fchs,    BI | SP,
  246. ! "fld",        op_fld,        BI | SP,
  247. ! "fild",        op_fild,    BI | SP,
  248. ! "fst",        op_fst,        BI | SP,
  249. ! "fstp",        op_fstp,    BI | SP,
  250. ! "fstp %st(0)",    op_fpop,    BI | SP,
  251. ! "fcompp",    op_fcompp,    BI | SP,
  252. ! "ftst",        op_ftst,    BI | SP,
  253. ! "fnstsw",    op_fnstsw,    BI | SP,
  254.   "sahf",        op_sahf,    BI | SP,
  255.   0,        0,        0
  256.   };
  257. --- 121,143 ----
  258.   "rep",        op_rep,        SP,
  259.   "movs",        op_smov,    BI | SP,
  260.   "test",        op_test,    BI | SP,
  261. ! #ifndef NOFLOAT
  262. ! "fadd",        op_fadd,    BI | SP | FP,
  263. ! "fsub",        op_fsub,    BI | SP | FP,
  264. ! "fsubr",    op_fsubr,    BI | SP | FP,
  265. ! "fmul",        op_fmul,    BI | SP | FP,
  266. ! "fdiv",        op_fdiv,    BI | SP | FP,
  267. ! "fdivr",    op_fdivr,    BI | SP | FP,
  268. ! "fchs",        op_fchs,    BI | SP | FP,
  269. ! "fld",        op_fld,        BI | SP | FP,
  270. ! "fild",        op_fild,    BI | SP | FP,
  271. ! "fst",        op_fst,        BI | SP | FP,
  272. ! "fstp",        op_fstp,    BI | SP | FP,
  273. ! "fstp st(0)",    op_fpop,    BI | SP | FP,
  274. ! "fcompp",    op_fcompp,    BI | SP | FP,
  275. ! "ftst",        op_ftst,    BI | SP | FP,
  276. ! "fnstsw",    op_fnstsw,    BI | SP | FP,
  277. ! #endif
  278.   "sahf",        op_sahf,    BI | SP,
  279.   0,        0,        0
  280.   };
  281. ***************
  282. *** 257,262 ****
  283. --- 261,276 ----
  284.           break;
  285.       }
  286.       }    
  287. + #ifndef NOFLOAT
  288. +     if (sa & FP) {
  289. +     /* assume that st(n) never appears explicitly as an operand here */
  290. +     if (len >= 8)
  291. +         oprintf("qword ptr ");
  292. +     else if (len >= 4)
  293. +         oprintf("dword ptr ");
  294. +     /* else fnstsw should not need a length? */
  295. +     }
  296. + #endif
  297.       switch (ap->mode) {
  298.         case am_immed:
  299.       oprintf("#");
  300. ***************
  301. *** 290,296 ****
  302.           oprintf("[%s+%s]",regname[ap->preg],regname[ap->sreg]);
  303.           break;
  304.         default:
  305. !     fatal("out386_bas/putamdoe","illegal address mode %d",ap->mode);
  306.       break;
  307.       }
  308.   }
  309. --- 304,310 ----
  310.           oprintf("[%s+%s]",regname[ap->preg],regname[ap->sreg]);
  311.           break;
  312.         default:
  313. !     fatal("out386_bas/putamode","illegal address mode %d",ap->mode);
  314.       break;
  315.       }
  316.   }
  317. ***************
  318. *** 414,427 ****
  319.   genfloat(val)
  320.       double          val;
  321.   {
  322. !     oprintf("\t.float %20.15e\n",val);
  323.   }
  324.   
  325.   void
  326.   gendouble(val)
  327.       double          val;
  328.   {
  329. !     oprintf("\t.double %20.15e\n",val);
  330.   }
  331.   #endif
  332.   
  333. --- 428,453 ----
  334.   genfloat(val)
  335.       double          val;
  336.   {
  337. ! #ifndef NO_FLOAT_PRINTF
  338. !     oprintf("\t.float %14.7e\n",val);
  339. ! #else
  340. !     float fval;
  341. !     fval = (float) val;
  342. !     /* this type transfer won't cross compile, of course. */
  343. !     oprintf("\t.long %d\n", ((long *)&fval)[0]);
  344. ! #endif
  345.   }
  346.   
  347.   void
  348.   gendouble(val)
  349.       double          val;
  350.   {
  351. ! #ifndef NO_FLOAT_PRINTF
  352. !     oprintf("\t.double %23.16e\n",val);
  353. ! #else
  354. !     /* this type transfer won't cross compile, of course. */
  355. !     oprintf("\t.long %d, %d\n", ((long *)&val)[0], ((long *)&val)[1]);
  356. ! #endif
  357.   }
  358.   #endif
  359.   
  360. ***************
  361. *** 585,594 ****
  362.       if (*s == '.')
  363.           return s;
  364.   #ifdef QDOS
  365. !     (void) strcpy(symbol, s);
  366. ! #else
  367. !     symbol[0] = '_';
  368. !     (void) strcpy(symbol + 1, s);
  369.   #endif
  370.       return symbol;
  371.   }
  372. --- 611,620 ----
  373.       if (*s == '.')
  374.           return s;
  375.   #ifdef QDOS
  376. !     VOIDCAST strcpy(symbol, s);
  377. ! #else
  378. !     symbol[0] = '_';
  379. !     VOIDCAST strcpy(symbol + 1, s);
  380.   #endif
  381.       return symbol;
  382.   }
  383. *** src/out386_gas.c.o    Mon Dec  7 13:14:05 1992
  384. --- src/out386_gas.c    Mon Dec  7 13:14:08 1992
  385. ***************
  386. *** 86,95 ****
  387.       if (*s == '.')
  388.           return s;
  389.   #ifdef QDOS
  390. !     (void) strcpy(symbol, s);
  391. ! #else
  392. !     symbol[0] = '_';
  393. !     (void) strcpy(symbol + 1, s);
  394.   #endif
  395.       return symbol;
  396.   }
  397. --- 86,95 ----
  398.       if (*s == '.')
  399.           return s;
  400.   #ifdef QDOS
  401. !     VOIDCAST strcpy(symbol, s);
  402. ! #else
  403. !     symbol[0] = '_';
  404. !     VOIDCAST strcpy(symbol + 1, s);
  405.   #endif
  406.       return symbol;
  407.   }
  408. ***************
  409. *** 538,548 ****
  410.   dumplits()
  411.   /*
  412.    * dump the string literal pool.
  413.    */
  414.   {
  415.       char           *cp;
  416.       int             len;
  417. !     cseg();
  418.       while (strtab != 0) {
  419.       nl();
  420.       put_label((unsigned int) strtab->label);
  421. --- 538,553 ----
  422.   dumplits()
  423.   /*
  424.    * dump the string literal pool.
  425. +  * if we are producing single copies of strings (which should therefore
  426. +  * be read only we put them in the text segement - else in the data segment.
  427.    */
  428.   {
  429.       char           *cp;
  430.       int             len;
  431. !     if (trad_option)
  432. !     dseg();
  433. !     else
  434. !     cseg();
  435.       while (strtab != 0) {
  436.       nl();
  437.       put_label((unsigned int) strtab->label);
  438. ***************
  439. *** 554,559 ****
  440. --- 559,566 ----
  441.       strtab = strtab->next;
  442.       }
  443.       nl();
  444. +     if (trad_option)
  445. +     cseg();
  446.   }
  447.   
  448.   void
  449. *** src/out68k_ack.c.o    Mon Dec  7 13:14:18 1992
  450. --- src/out68k_ack.c    Mon Dec  7 13:14:21 1992
  451. ***************
  452. *** 547,557 ****
  453.   dumplits()
  454.   /*
  455.    * dump the string literal pool.
  456.    */
  457.   {
  458.       char           *cp;
  459.       int             len;
  460. !     cseg();
  461.       while (strtab != 0) {
  462.       nl();
  463.       put_label((unsigned int) strtab->label);
  464. --- 547,562 ----
  465.   dumplits()
  466.   /*
  467.    * dump the string literal pool.
  468. +  * if we are producing single copies of strings (which should therefore
  469. +  * be read only we put them in the text segement - else in the data segment.
  470.    */
  471.   {
  472.       char           *cp;
  473.       int             len;
  474. !     if (trad_option)
  475. !     dseg();
  476. !     else
  477. !     cseg();
  478.       while (strtab != 0) {
  479.       nl();
  480.       put_label((unsigned int) strtab->label);
  481. ***************
  482. *** 563,568 ****
  483. --- 568,575 ----
  484.       strtab = strtab->next;
  485.       }
  486.       nl();
  487. +     if (trad_option)
  488. +     cseg();
  489.   }
  490.   
  491.   /*ARGSUSED*/
  492. ***************
  493. *** 578,584 ****
  494.       char           *s;
  495.   /* put the definition of a global name in the output file */
  496.   {
  497. !     oprintf(".define %s\n",outlate(s));
  498.   }
  499.   
  500.   void
  501. --- 585,591 ----
  502.       char           *s;
  503.   /* put the definition of a global name in the output file */
  504.   {
  505. !     oprintf(".extern %s\n",outlate(s));
  506.   }
  507.   
  508.   void
  509. ***************
  510. *** 648,657 ****
  511.       if (*string == '.')
  512.           return string;
  513.   #ifdef QDOS
  514. !     (void) strcpy(symname, string);
  515. ! #else
  516. !     symname[0] = '_';
  517. !     (void) strcpy(symname + 1, string);
  518.   #endif
  519.   
  520.       if (((k = strlen(symname)) > 8) && trans_option) {
  521. --- 655,664 ----
  522.       if (*string == '.')
  523.           return string;
  524.   #ifdef QDOS
  525. !     VOIDCAST strcpy(symname, string);
  526. ! #else
  527. !     symname[0] = '_';
  528. !     VOIDCAST strcpy(symname + 1, string);
  529.   #endif
  530.   
  531.       if (((k = strlen(symname)) > 8) && trans_option) {
  532. *** src/out68k_cpm.c.o    Mon Dec  7 13:14:31 1992
  533. --- src/out68k_cpm.c    Mon Dec  7 13:14:34 1992
  534. ***************
  535. *** 496,506 ****
  536.   dumplits()
  537.   /*
  538.    * dump the string literal pool.
  539.    */
  540.   {
  541.       char           *cp;
  542.       int             len;
  543. !     cseg();
  544.       while (strtab != 0) {
  545.       nl();
  546.       put_label((unsigned int) strtab->label);
  547. --- 496,511 ----
  548.   dumplits()
  549.   /*
  550.    * dump the string literal pool.
  551. +  * if we are producing single copies of strings (which should therefore
  552. +  * be read only we put them in the text segement - else in the data segment.
  553.    */
  554.   {
  555.       char           *cp;
  556.       int             len;
  557. !     if (trad_option)
  558. !     dseg();
  559. !     else
  560. !     cseg();
  561.       while (strtab != 0) {
  562.       nl();
  563.       put_label((unsigned int) strtab->label);
  564. ***************
  565. *** 512,517 ****
  566. --- 517,524 ----
  567.       strtab = strtab->next;
  568.       }
  569.       nl();
  570. +     if (trad_option)
  571. +     cseg();
  572.   }
  573.   
  574.   /*ARGSUSED*/
  575. ***************
  576. *** 604,613 ****
  577.       if (*string == '.')
  578.           return string;
  579.   #ifdef QDOS
  580. !     (void) strcpy(symname, string);
  581. ! #else
  582. !     symname[0] = '_';
  583. !     (void) strcpy(symname + 1, string);
  584.   #endif
  585.   
  586.       if (((k = strlen(symname)) > 8) && trans_option) {
  587. --- 611,620 ----
  588.       if (*string == '.')
  589.           return string;
  590.   #ifdef QDOS
  591. !     VOIDCAST strcpy(symname, string);
  592. ! #else
  593. !     symname[0] = '_';
  594. !     VOIDCAST strcpy(symname + 1, string);
  595.   #endif
  596.   
  597.       if (((k = strlen(symname)) > 8) && trans_option) {
  598. *** src/out68k_gas.c.o    Mon Dec  7 13:14:44 1992
  599. --- src/out68k_gas.c    Mon Dec  7 13:14:47 1992
  600. ***************
  601. *** 445,485 ****
  602.   dumplits()
  603.   /*
  604.    * dump the string literal pool.
  605.    */
  606.   {
  607.       char           *cp;
  608.       int             len;
  609. ! /*
  610. !  * The ACK assembler may produce a .text section of an uneven length.
  611. !  * This will eventually bomb the linker when it tries to relocate
  612. !  * something in a following (.data) section, which then is misaligned
  613. !  * as a whole in memory (perhaps this is just a bug in the linker).
  614. !  *
  615. !  * To avoid this (it can only happen if the string pool is the last
  616. !  * thing dumped to the assembler file) we count the total number of
  617. !  * bytes in the string pool and emit a zero filler byte if that
  618. !  * number was uneven.
  619. !  * This is perhaps an ugly hack, but in virtually all of the cases
  620. !  * this filler byte is inserted anyway by the assembler when
  621. !  * doing the alignment necessary for the next function body.
  622. !  */
  623. !     long        count=0;
  624. !     cseg();
  625.       while (strtab != 0) {
  626.       nl();
  627.       put_label((unsigned int) strtab->label);
  628.       cp = strtab->str;
  629.       len = strtab->len;
  630. -     count += (len+1);
  631.       while (len--)
  632.           genbyte(*cp++);
  633.       genbyte(0);
  634.       strtab = strtab->next;
  635.       }
  636. !     if (count & 1)
  637. !     genbyte(0);
  638. !     nl();
  639.   }
  640.   
  641.   void
  642. --- 445,474 ----
  643.   dumplits()
  644.   /*
  645.    * dump the string literal pool.
  646. +  * if we are producing single copies of strings (which should therefore
  647. +  * be read only we put them in the text segement - else in the data segment.
  648.    */
  649.   {
  650.       char           *cp;
  651.       int             len;
  652. !     if (trad_option)
  653. !     dseg();
  654. !     else
  655. !     cseg();
  656.       while (strtab != 0) {
  657.       nl();
  658.       put_label((unsigned int) strtab->label);
  659.       cp = strtab->str;
  660.       len = strtab->len;
  661.       while (len--)
  662.           genbyte(*cp++);
  663.       genbyte(0);
  664.       strtab = strtab->next;
  665.       }
  666. !     nl();
  667. !     if (trad_option)
  668. !     cseg();
  669.   }
  670.   
  671.   void
  672. ***************
  673. *** 549,558 ****
  674.       if (*s == '.')
  675.           return s;
  676.   #ifdef QDOS
  677. !     (void) strcpy(symbol, s);
  678. ! #else
  679. !     symbol[0] = '_';
  680. !     (void) strcpy(symbol + 1, s);
  681.   #endif
  682.       return symbol;
  683.   }
  684. --- 538,547 ----
  685.       if (*s == '.')
  686.           return s;
  687.   #ifdef QDOS
  688. !     VOIDCAST strcpy(symbol, s);
  689. ! #else
  690. !     symbol[0] = '_';
  691. !     VOIDCAST strcpy(symbol + 1, s);
  692.   #endif
  693.       return symbol;
  694.   }
  695. *** src/peep386.c.o    Tue Dec 01 23:27:19 1992
  696. --- src/peep386.c    Wed Dec 09 18:27:50 1992
  697. ***************
  698. *** 144,149 ****
  699. --- 144,152 ----
  700.    */
  701.   {
  702.       register struct ocode *ip;
  703. +     struct swtab      *sw;
  704. +     struct enode      *ep;
  705. +     int               i;
  706.   /*
  707.    * perform peephole optimizations
  708.    */
  709. ***************
  710. *** 160,165 ****
  711. --- 163,184 ----
  712.       ip = ip->fwd;
  713.       }
  714.       peep_head = 0;
  715. +     ep = mk_node(en_labcon, NIL_ENODE, NIL_ENODE);
  716. +     for(sw=swtables; sw; sw=sw->next) {
  717. +     nl();
  718. + #ifdef SEPERATE_I_D
  719. +     dseg();
  720. + #else
  721. +     cseg();
  722. + #endif
  723. +     put_align(AL_POINTER);
  724. +     put_label((unsigned) sw->tablab);
  725. +     for(i=0; i<sw->numlabs; i++) {
  726. +         ep->v.i = sw->labels[i];
  727. +         genptr(ep);
  728. +     }
  729. +     }
  730. +     swtables = NULL;
  731.   }
  732.   
  733.   static void
  734. ***************
  735. *** 382,387 ****
  736. --- 401,409 ----
  737.       }
  738.   }
  739.   
  740. + #define branch(ip)    ((ip->opcode >= op_je && ip->opcode <= op_jbe) || \
  741. +              (ip->opcode == op_bra))
  742.   static void
  743.   peep_label(ip)
  744.   /*
  745. ***************
  746. *** 391,435 ****
  747.       struct ocode   *ip;
  748.   {
  749.       struct ocode   *prev, *next, *target;
  750.       long            label;
  751. !     prev = ip->back;
  752. !     if ((next = ip->fwd) == 0 || next->opcode != op_bra)
  753. !     return;
  754. !     /*
  755. !      * To make this fast, assume that the label number is really
  756. !      * next->oper1->offset->v.i
  757. !      */
  758. !     label = next->oper1->offset->v.i;
  759. !     if (label == ip->oper1->offset->v.i)
  760.       return;
  761. !     target = peep_head;
  762. !     /*
  763. !      * look for the label
  764. !      */
  765. !     while (target != 0) {
  766. !     if (target->opcode == op_label
  767. !         && target->oper1->offset->v.i == label)
  768. !         break;
  769. !     target = target->fwd;
  770. !     }
  771. !     /* we should have found it */
  772. !     if (target == 0) {
  773. !        message(MSG_PEEPLABEL);
  774. !        return;
  775. !     }
  776. !     /* move label */
  777. !     peep_delete(ip);
  778. !     ip->fwd = target->fwd;
  779. !     ip->back = target;
  780. !     target->fwd = ip;
  781. !     if (ip->fwd != 0)
  782. !     ip->fwd->back = ip;
  783. !     /* possibly remove branches */
  784. !     /* in fact, prev is always != 0 if peep_delete has succeeded */
  785. !     if (prev != 0) {
  786. !     if (prev->opcode == op_bra || prev->opcode == op_jmp
  787. !         || prev->opcode == op_ret)
  788. !         peep_uctran(prev);
  789.       }
  790.   }
  791.   
  792. --- 413,498 ----
  793.       struct ocode   *ip;
  794.   {
  795.       struct ocode   *prev, *next, *target;
  796. +     struct swtab   *sw;
  797. +     int            i;
  798.       long            label;
  799. !     if ((next = ip->fwd) == 0)
  800.       return;
  801. !     switch (next->opcode) {
  802. !       case op_label:
  803. !     /* if a label is followed by a label then common them up */
  804. !     label = next->oper1->offset->v.i;
  805. !     for (target = peep_head; target != 0; target = target->fwd) {
  806. !         if (branch(target) && target->oper1->offset->v.i == label)
  807. !         target->oper1->offset->v.i = ip->oper1->offset->v.i;
  808. !     }
  809. !     for (sw=swtables; sw != 0; sw = sw->next) {
  810. !         for (i=0; i < sw->numlabs; i++) {
  811. !         if (sw->labels[i] == label) {
  812. !             sw->labels[i] = ip->oper1->offset->v.i;
  813. !             changes++;
  814. !         }
  815. !         }
  816. !     }
  817. !     peep_delete(next);
  818. !     break;
  819. !       case op_bra:
  820. !     prev = ip->back;
  821. !     /*
  822. !      * To make this fast, assume that the label number is really
  823. !      * next->oper1->offset->v.i
  824. !      */
  825. !     label = next->oper1->offset->v.i;
  826. !     if (label == ip->oper1->offset->v.i)
  827. !         return;
  828. !     target = peep_head;
  829. !     /*
  830. !      * look for the label
  831. !      */
  832. !     while (target != 0) {
  833. !         if (target->opcode == op_label
  834. !         && target->oper1->offset->v.i == label)
  835. !         break;
  836. !         target = target->fwd;
  837. !     }
  838. !     /* we should have found it */
  839. !     if (target == 0) {
  840. !        message(MSG_PEEPLABEL);
  841. !        return;
  842. !     }
  843. !     /* move label */
  844. !     peep_delete(ip);
  845. !     ip->fwd = target->fwd;
  846. !     ip->back = target;
  847. !     target->fwd = ip;
  848. !     if (ip->fwd != 0)
  849. !         ip->fwd->back = ip;
  850. !     /* possibly remove branches */
  851. !     /* in fact, prev is always != 0 if peep_delete has succeeded */
  852. !     if (prev != 0) {
  853. !         if (prev->opcode == op_bra || prev->opcode == op_jmp
  854. !         || prev->opcode == op_ret)
  855. !         peep_uctran(prev);
  856. !     }
  857. !     break;
  858. !       default:
  859. !     /* check that there are still references to this label */
  860. !     label = ip->oper1->offset->v.i;
  861. !     for (target = peep_head; target != 0; target = target->fwd) {
  862. !         if (branch(target) && target->oper1->offset->v.i == label)
  863. !         return;
  864. !     }
  865. !     for (sw=swtables; sw != 0; sw = sw->next) {
  866. !         for (i=0; i < sw->numlabs; i++) {
  867. !         if (sw->labels[i] == label)
  868. !             return;
  869. !         }
  870. !     }
  871. !     peep_delete(ip);
  872. !     break;
  873.       }
  874.   }
  875.   
  876. ***************
  877. *** 545,550 ****
  878. --- 608,615 ----
  879.   
  880.       p = ip->back;
  881.       previous_instruction(target);
  882. +     if (p==target)
  883. +     return;
  884.       /* now skip back over identical instruction sequences */
  885.       while (same_instruction(p,target)) {
  886.       p = p->back;
  887. *** src/peep68k.c.o    Mon Dec  7 13:15:21 1992
  888. --- src/peep68k.c    Mon Dec  7 13:15:27 1992
  889. ***************
  890. *** 153,158 ****
  891. --- 153,161 ----
  892.    */
  893.   {
  894.       register struct ocode *ip;
  895. +     struct swtab      *sw;
  896. +     struct enode      *ep;
  897. +     int               i;
  898.       opt3();            /* do the peephole optimizations */
  899.       ip = peep_head;
  900.       while (ip != 0) {
  901. ***************
  902. *** 163,168 ****
  903. --- 166,187 ----
  904.       ip = ip->fwd;
  905.       }
  906.       peep_head = 0;
  907. +     ep = mk_node(en_labcon, NIL_ENODE, NIL_ENODE);
  908. +     for(sw=swtables; sw; sw=sw->next) {
  909. +     nl();
  910. + #ifdef SEPERATE_I_D
  911. +     dseg();
  912. + #else
  913. +     cseg();
  914. + #endif
  915. +     put_align(AL_POINTER);
  916. +     put_label((unsigned) sw->tablab);
  917. +     for(i=0; i<sw->numlabs; i++) {
  918. +         ep->v.i = sw->labels[i];
  919. +         genptr(ep);
  920. +     }
  921. +     }
  922. +     swtables = NULL;
  923.   }
  924.   
  925.   static void
  926. ***************
  927. *** 716,721 ****
  928. --- 735,743 ----
  929.       }
  930.   }
  931.   
  932. + #define branch(ip)    (ip->opcode >= op_bra && ip->opcode <= op_bls)
  933.   static void
  934.   peep_label(ip)
  935.   /*
  936. ***************
  937. *** 725,769 ****
  938.       struct ocode   *ip;
  939.   {
  940.       struct ocode   *prev, *next, *target;
  941. !     long            label;
  942. !     prev = ip->back;
  943. !     if ((next = ip->fwd) == 0 || next->opcode != op_bra)
  944. !     return;
  945. !     /*
  946. !      * To make this fast, assume that the label number is really
  947. !      * next->oper1->offset->v.i
  948. !      */
  949. !     label = next->oper1->offset->v.i;
  950. !     if (label == ip->oper1->offset->v.i)
  951. !     return;
  952. !     target = peep_head;
  953. !     /*
  954. !      * look for the label
  955. !      */
  956. !     while (target != 0) {
  957. !     if (target->opcode == op_label
  958. !         && target->oper1->offset->v.i == label)
  959. !         break;
  960. !     target = target->fwd;
  961. !     }
  962. !     /* we should have found it */
  963. !     if (target == 0) {
  964. !        message(MSG_PEEPLABEL);
  965. !        return;
  966. !     }
  967. !     /* move label */
  968. !     peep_delete(ip);
  969. !     ip->fwd = target->fwd;
  970. !     ip->back = target;
  971. !     target->fwd = ip;
  972. !     if (ip->fwd != 0)
  973. !     ip->fwd->back = ip;
  974. !     /* possibly remove branches */
  975. !     /* in fact, prev is always != 0 if peep_delete has succeeded */
  976. !     if (prev != 0) {
  977. !     if (prev->opcode == op_bra || prev->opcode == op_jmp
  978. !         || prev->opcode == op_rts)
  979. !         peep_uctran(prev);
  980.       }
  981.   }
  982.   
  983. --- 747,836 ----
  984.       struct ocode   *ip;
  985.   {
  986.       struct ocode   *prev, *next, *target;
  987. !     struct swtab   *sw;
  988. !     int            i;
  989. !     long            label;
  990. !     if ((next = ip->fwd) == 0)
  991. !     return;
  992. !     switch (next->opcode) {
  993. !       case op_label:
  994. !     /* if a label is followed by a label then common them up */
  995. !     label = next->oper1->offset->v.i;
  996. !     for (target = peep_head; target != 0; target = target->fwd) {
  997. !         if (branch(target) && target->oper1->offset->v.i == label)
  998. !         target->oper1->offset->v.i = ip->oper1->offset->v.i;
  999. !         if (target->opcode == op_dbra && target->oper2->offset->v.i == label)
  1000. !         target->oper2->offset->v.i = ip->oper1->offset->v.i;
  1001. !     }
  1002. !     for (sw=swtables; sw != 0; sw = sw->next) {
  1003. !         for (i=0; i < sw->numlabs; i++) {
  1004. !         if (sw->labels[i] == label)
  1005. !             sw->labels[i] = ip->oper1->offset->v.i;
  1006. !         }
  1007. !     }
  1008. !     peep_delete(next);
  1009. !     break;
  1010. !       case op_bra:
  1011. !     prev = ip->back;
  1012. !     /*
  1013. !      * To make this fast, assume that the label number is really
  1014. !      * next->oper1->offset->v.i
  1015. !      */
  1016. !     label = next->oper1->offset->v.i;
  1017. !     if (label == ip->oper1->offset->v.i)
  1018. !         return;
  1019. !     target = peep_head;
  1020. !     /*
  1021. !      * look for the label
  1022. !      */
  1023. !     while (target != 0) {
  1024. !         if (target->opcode == op_label
  1025. !         && target->oper1->offset->v.i == label)
  1026. !         break;
  1027. !         target = target->fwd;
  1028. !     }
  1029. !     /* we should have found it */
  1030. !     if (target == 0) {
  1031. !        message(MSG_PEEPLABEL);
  1032. !        return;
  1033. !     }
  1034. !     /* move label */
  1035. !     if (target->fwd == ip)
  1036. !         return;
  1037. !     peep_delete(ip);
  1038. !     ip->fwd = target->fwd;
  1039. !     ip->back = target;
  1040. !     target->fwd = ip;
  1041. !     if (ip->fwd != 0)
  1042. !         ip->fwd->back = ip;
  1043. !     /* possibly remove branches */
  1044. !     /* in fact, prev is always != 0 if peep_delete has succeeded */
  1045. !     if (prev != 0) {
  1046. !         if (prev->opcode == op_bra || prev->opcode == op_jmp
  1047. !         || prev->opcode == op_rts)
  1048. !         peep_uctran(prev);
  1049. !     }
  1050. !     break;
  1051. !       default:
  1052. !     /* check that there are still references to this label */
  1053. !     label = ip->oper1->offset->v.i;
  1054. !     for (target = peep_head; target != 0; target = target->fwd) {
  1055. !         if (branch(target) && target->oper1->offset->v.i == label)
  1056. !         return;
  1057. !         if (target->opcode == op_dbra && target->oper2->offset->v.i == label)
  1058. !         return;
  1059. !     }
  1060. !     for (sw=swtables; sw != 0; sw = sw->next) {
  1061. !         for (i=0; i < sw->numlabs; i++) {
  1062. !         if (sw->labels[i] == label)
  1063. !             return;
  1064. !         }
  1065. !     }
  1066. !     peep_delete(ip);
  1067. !     break;
  1068.       }
  1069.   }
  1070.   
  1071. ***************
  1072. *** 891,896 ****
  1073. --- 958,965 ----
  1074.   
  1075.       p = ip->back;
  1076.       previous_instruction(target);
  1077. +     if (p==target)
  1078. +     return;
  1079.       /* now skip back over identical instruction sequences */
  1080.       while (same_instruction(p,target)) {
  1081.       p = p->back;
  1082. *** src/proto.h.o    Mon Dec  7 13:15:40 1992
  1083. --- src/proto.h    Thu Nov 26 22:02:30 1992
  1084. ***************
  1085. *** 16,22 ****
  1086.   /* decl.c */
  1087.   char *strsave P_((char *s));
  1088.   struct typ *mk_type P_((enum e_bt bt, long siz));
  1089. ! void decl P_((struct stab *table));
  1090.   void decl1 P_((void));
  1091.   void compile P_((void));
  1092.   void dodecl P_((enum e_sc defclass));
  1093. --- 16,22 ----
  1094.   /* decl.c */
  1095.   char *strsave P_((char *s));
  1096.   struct typ *mk_type P_((enum e_bt bt, long siz));
  1097. ! void decl P_((void));
  1098.   void decl1 P_((void));
  1099.   void compile P_((void));
  1100.   void dodecl P_((enum e_sc defclass));
  1101. ***************
  1102. *** 28,36 ****
  1103.   struct typ *exprnc P_((struct enode **node));
  1104.   struct typ *expression P_((struct enode **node));
  1105.   struct typ *cast_op P_((struct enode **ep, struct typ *tp1, struct typ *tp2, int flag));
  1106. ! long strip_icon P_((long i, enum e_bt type));
  1107. ! int castbegin P_((enum e_sym st));
  1108. ! struct typ *traceexpr P_((struct enode **node));
  1109.   /* func.c */
  1110.   void funcbody P_((struct sym *sp, char *names[], int nparms));
  1111.   /* gen68k.c */ /* gen68kd.c */ /* gen386.c */
  1112. --- 28,38 ----
  1113.   struct typ *exprnc P_((struct enode **node));
  1114.   struct typ *expression P_((struct enode **node));
  1115.   struct typ *cast_op P_((struct enode **ep, struct typ *tp1, struct typ *tp2, int flag));
  1116. ! #ifdef TRACE
  1117. ! void traceexpr    P_((struct enode  **node));
  1118. ! #endif /* TRACE */
  1119. ! long strip_icon P_((long i, enum e_bt type));
  1120. ! int castbegin P_((enum e_sym st));
  1121.   /* func.c */
  1122.   void funcbody P_((struct sym *sp, char *names[], int nparms));
  1123.   /* gen68k.c */ /* gen68kd.c */ /* gen386.c */
  1124. ***************
  1125. *** 85,90 ****
  1126. --- 87,93 ----
  1127.   #ifndef NOFLOAT
  1128.   double floatexpr P_((void));
  1129.   #endif
  1130. + long arithexpr P_((void));
  1131.   long intexpr P_((void));
  1132.   /* list.c */
  1133.   void list_table P_((struct stab *t, int i));
  1134. *** src/searchkw.c.o    Mon Dec  7 13:16:04 1992
  1135. --- src/searchkw.c    Mon Dec  7 13:16:06 1992
  1136. ***************
  1137. *** 32,115 ****
  1138.       enum e_sym      stype;
  1139.   }               keywords[] = {
  1140.   
  1141. !     {
  1142. !     "int", kw_int
  1143. !     }, {
  1144. !     "char", kw_char
  1145. !     }, {
  1146. !     "long", kw_long
  1147. !     },
  1148. !     {
  1149. !     "float", kw_float
  1150. !     }, {
  1151. !     "double", kw_double
  1152. !     }, {
  1153. !     "return", kw_return
  1154. !     },
  1155. !     {
  1156. !     "struct", kw_struct
  1157. !     }, {
  1158. !     "union", kw_union
  1159. !     }, {
  1160. !     "typedef", kw_typedef
  1161. !     },
  1162. !     {
  1163. !     "enum", kw_enum
  1164. !     }, {
  1165. !     "static", kw_static
  1166. !     }, {
  1167. !     "auto", kw_auto
  1168. !     },
  1169. !     {
  1170. !     "sizeof", kw_sizeof
  1171. !     }, {
  1172. !     "do", kw_do
  1173. !     }, {
  1174. !     "if", kw_if
  1175. !     },
  1176. !     {
  1177. !     "else", kw_else
  1178. !     }, {
  1179. !     "for", kw_for
  1180. !     }, {
  1181. !     "switch", kw_switch
  1182. !     },
  1183. !     {
  1184. !     "while", kw_while
  1185. !     }, {
  1186. !     "short", kw_short
  1187. !     }, {
  1188. !     "extern", kw_extern
  1189. !     },
  1190. !     {
  1191. !     "case", kw_case
  1192. !     }, {
  1193. !     "goto", kw_goto
  1194. !     }, {
  1195. !     "default", kw_default
  1196. !     },
  1197. !     {
  1198. !     "register", kw_register
  1199. !     }, {
  1200. !     "unsigned", kw_unsigned
  1201. !     },
  1202. !     {
  1203. !     "break", kw_break
  1204. !     }, {
  1205. !     "continue", kw_continue
  1206. !     }, {
  1207. !     "void", kw_void
  1208. !     },
  1209. !     {
  1210. !     "signed", kw_signed
  1211. !     }, {
  1212. !     "const", kw_const
  1213. !     }, {
  1214. !     "volatile", kw_volatile
  1215. !     },
  1216. !     {
  1217. !     0, 0
  1218. !     }
  1219.   };
  1220.   
  1221.   /*
  1222. --- 32,72 ----
  1223.       enum e_sym      stype;
  1224.   }               keywords[] = {
  1225.   
  1226. !     { "int", kw_int },
  1227. !     { "char", kw_char },
  1228. !     { "long", kw_long },
  1229. !     { "float", kw_float },
  1230. !     { "double", kw_double },
  1231. !     { "return", kw_return },
  1232. !     { "struct", kw_struct },
  1233. !     { "union", kw_union },
  1234. !     { "typedef", kw_typedef },
  1235. !     { "enum", kw_enum },
  1236. !     { "static", kw_static },
  1237. !     { "auto", kw_auto },
  1238. !     { "sizeof", kw_sizeof },
  1239. !     { "do", kw_do },
  1240. !     { "if", kw_if },
  1241. !     { "else", kw_else },
  1242. !     { "for", kw_for },
  1243. !     { "switch", kw_switch },
  1244. !         { "while", kw_while },
  1245. !     { "short", kw_short },
  1246. !     { "extern", kw_extern },
  1247. !         { "case", kw_case },
  1248. !     { "goto", kw_goto },
  1249. !     { "default", kw_default },
  1250. !         { "register", kw_register },
  1251. !     { "unsigned", kw_unsigned },
  1252. !         { "break", kw_break },
  1253. !     { "continue", kw_continue },
  1254. !     { "void", kw_void },
  1255. !         { "signed", kw_signed },
  1256. !     { "const", kw_const },
  1257. !     { "volatile", kw_volatile },
  1258. !     { 0, 0 }
  1259.   };
  1260.   
  1261.   /*
  1262. ***************
  1263. *** 136,146 ****
  1264.           switch ( (--kwbp)->stype ) {
  1265.           case kw_volatile:
  1266.               volatile_found = 1;
  1267.           case kw_signed:
  1268.           case kw_const:
  1269.               if (trad_option)
  1270.                   return;
  1271. !             /* else fall through */
  1272.           default:
  1273.               lastst = kwbp->stype;
  1274.               return;
  1275. --- 93,104 ----
  1276.           switch ( (--kwbp)->stype ) {
  1277.           case kw_volatile:
  1278.               volatile_found = 1;
  1279. +             /* FALLTHRU */
  1280.           case kw_signed:
  1281.           case kw_const:
  1282.               if (trad_option)
  1283.                   return;
  1284. !             /* FALLTHRU */
  1285.           default:
  1286.               lastst = kwbp->stype;
  1287.               return;
  1288. *** src/stmt.c.o    Mon Dec  7 13:16:15 1992
  1289. --- src/stmt.c    Mon Dec  7 13:16:18 1992
  1290. ***************
  1291. *** 301,308 ****
  1292.       if (snp->exp != 0) {
  1293.         if (ret_type->type == bt_void)
  1294.       message(ERR_VOIDFUNC);
  1295. !       else
  1296. !     (void) cast_op(&(snp->exp), tp, ret_type, 0);
  1297.       } else if (ret_type->type != bt_void)
  1298.         message(WARN_VALRETURN);
  1299.       return_found = 1;
  1300. --- 301,310 ----
  1301.       if (snp->exp != 0) {
  1302.         if (ret_type->type == bt_void)
  1303.       message(ERR_VOIDFUNC);
  1304. !       else if (tp->type == bt_void)
  1305. !     message(ERR_VOIDRETURN);
  1306. !       else
  1307. !     VOIDCAST cast_op(&(snp->exp), tp, ret_type, 0);
  1308.       } else if (ret_type->type != bt_void)
  1309.         message(WARN_VALRETURN);
  1310.       return_found = 1;
  1311. ***************
  1312. *** 390,396 ****
  1313.       sp->tp->val_flag) {
  1314.       message(ERR_ILLINIT);
  1315.       } else {
  1316. !     (void) cast_op(&ep2, tp, sp->tp, 0);
  1317.   
  1318.       ep1 = mk_node(en_autocon, NIL_ENODE, NIL_ENODE);
  1319.       ep1->v.i = sp->value.i;
  1320. --- 392,398 ----
  1321.       sp->tp->val_flag) {
  1322.       message(ERR_ILLINIT);
  1323.       } else {
  1324. !     VOIDCAST cast_op(&ep2, tp, sp->tp, 0);
  1325.   
  1326.       ep1 = mk_node(en_autocon, NIL_ENODE, NIL_ENODE);
  1327.       ep1->v.i = sp->value.i;
  1328. ***************
  1329. *** 583,596 ****
  1330.       return 0;
  1331.   }
  1332.   
  1333. ! static struct snode   *
  1334. ! statement()
  1335. ! /*
  1336. !  * statement figures out which of the statement processors should be called
  1337. !  * and transfers control to the proper routine.
  1338.    */
  1339.   {
  1340.       struct snode   *snp;
  1341.       switch (lastst) {
  1342.         case semicolon:
  1343.       getsym();
  1344. --- 585,620 ----
  1345.       return 0;
  1346.   }
  1347.   
  1348. ! #ifdef TRACE
  1349. ! static struct snode   *
  1350. ! tracestmt()
  1351. ! /*
  1352. !  * tracestmt adds calls to a run-time tracing/debugging routine.
  1353.    */
  1354.   {
  1355.       struct snode   *snp;
  1356. +     snp = (struct snode *) xalloc((int) sizeof(struct snode));
  1357. +     snp->stype = st_compound;
  1358. +     snp->s1 = (struct snode *) xalloc((int) sizeof(struct snode));
  1359. +     snp->s1->stype = st_expr;
  1360. +     traceexpr(&(snp->s1->exp));
  1361. +     return snp;
  1362. + }
  1363. + #endif /* TRACE */
  1364. + static struct snode   *
  1365. + statement()
  1366. + /*
  1367. +  * statement figures out which of the statement processors should be called
  1368. +  * and transfers control to the proper routine.
  1369. +  */
  1370. + {
  1371. +     struct snode   *snp;
  1372. + #ifdef TRACE
  1373. +     struct snode   *tsnp;
  1374. +     if (trace_option)
  1375. +     tsnp = tracestmt();
  1376. + #endif
  1377.       switch (lastst) {
  1378.         case semicolon:
  1379.       getsym();
  1380. ***************
  1381. *** 644,648 ****
  1382.       }
  1383.       if (snp != 0)
  1384.       snp->next = 0;
  1385. !     return snp;
  1386. ! }
  1387. --- 668,678 ----
  1388.       }
  1389.       if (snp != 0)
  1390.       snp->next = 0;
  1391. ! #ifdef TRACE
  1392. !     if (trace_option) {
  1393. !     tsnp->s1->next = snp;
  1394. !     return tsnp;
  1395. !     } else
  1396. ! #endif /* TRACE */
  1397. !     return snp;
  1398. ! }
  1399. *** src/version.h.o    Mon Dec  7 13:16:36 1992
  1400. --- src/version.h    Mon Dec  7 13:13:47 1992
  1401. ***************
  1402. *** 1,3 ****
  1403. ! #define VERSION            "4.1"
  1404. ! #define LAST_CHANGE_DATE    "04 Oct 92"
  1405.   
  1406. --- 1,3 ----
  1407. ! #define VERSION            "4.2"
  1408. ! #define LAST_CHANGE_DATE    "05 Dec 92"
  1409.   
  1410.