home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / inline / patch1 < prev    next >
Text File  |  1987-09-14  |  5KB  |  176 lines

  1. Subject:  v11i043:  Inline code expander for C, Patch1
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rs@uunet.UU.NET
  5.  
  6. Submitted-by: omepd!mcg
  7. Posting-number: Volume 11, Issue 43
  8. Archive-name: inline/Patch1
  9.  
  10. [  This is not a shar; you can feed this right into patch.  --r$  ]
  11.  
  12. System: inline
  13. Patch #: 1
  14. Priority: HIGH
  15. Subject: expression rewriting sometimes generates bogus code
  16. From: mcg@omepd.intel.com
  17.  
  18. Description:
  19.     Under certain circumstances, typically if() statements lacking
  20.     else clauses but with other following code, either syntactically
  21.     or semantically incorrect code was generated by rewrite().
  22.  
  23. Fix:    From rn, say "| patch -d DIR", where DIR is your patch source
  24.     directory.  Outside of rn, say "cd DIR; patch <thisarticle".
  25.     If you don't have the patch program, apply the following by hand,
  26.     or get patch.
  27.  
  28.     If patch indicates that patchlevel is the wrong version, you may need
  29.     to apply one or more previous patches, or the patch may already
  30.     have been applied.  See the patchlevel.h file to find out what has or
  31.     has not been applied.  In any event, don't continue with the patch.
  32.  
  33.  
  34. Index: patchlevel.h
  35. Prereq: 0
  36. 3c3
  37. < #define PATCHLEVEL 0
  38. ---
  39. > #define PATCHLEVEL 1
  40.  
  41. Index: rewrite.c
  42. Prereq: 1.3
  43. *** rewrite.c.old    Thu Jul 16 10:54:21 1987
  44. --- rewrite.c    Thu Jul 16 10:54:21 1987
  45. ***************
  46. *** 1,17 ****
  47.   /*
  48.    * inline code expander - rewrite a procedure into an expression if possible
  49.    *
  50.    * (c) 1986 - copyright 1986, s. mcgeady, all rights reserved
  51.    */
  52.   
  53. ! /* $Header: rewrite.c,v 1.3 87/05/12 10:53:05 mcg Rel $ */
  54.   
  55.   #include "inline.h"
  56.   #include "tokens.h"
  57.   
  58.   extern struct token *dostmt();        /* see expand.c */
  59.   extern struct token *doexpr();        /* see expand.c */
  60.   
  61.   
  62.   /*
  63.    * This module takes arbitrary sequences of C statements (assumed to be
  64. --- 1,17 ----
  65.   /*
  66.    * inline code expander - rewrite a procedure into an expression if possible
  67.    *
  68.    * (c) 1986 - copyright 1986, s. mcgeady, all rights reserved
  69.    */
  70.   
  71. ! /* $Header: rewrite.c,v 1.4 87/07/16 10:51:50 mcg Rel $ */
  72.   
  73.   #include "inline.h"
  74.   #include "tokens.h"
  75.   
  76.   extern struct token *dostmt();        /* see expand.c */
  77.   extern struct token *doexpr();        /* see expand.c */
  78.   
  79.   
  80.   /*
  81.    * This module takes arbitrary sequences of C statements (assumed to be
  82. ***************
  83. *** 131,179 ****
  84.   
  85.               block.tl_head = skipws(block.tl_tail->t_next);
  86.               block.tl_tail = dostmt(block.tl_head,0);
  87.   
  88.               if ((ntok = rewrite(node,&block,0)) < 0) {
  89.                   return(-1);
  90.               }
  91.               /* if no tokens added - i.e. empty block */
  92.               if (ntok == 0) {
  93.                   addtok(expr,newtok(mem,T_NUM,"0"));
  94.               }
  95.   
  96.               addtok(expr,newtok(mem,T_COLON,NIL));
  97.               addtok(expr,newtok(mem,T_WS," "));
  98.   
  99.               tx = skipws(block.tl_tail->t_next);
  100. !             if (tx && tx != tl->tl_tail) {
  101. !                 if (tx->t_tok != T_ELSE) {
  102. !                     /* no else - treat rest of block like else */
  103. !                     block.tl_head = tx;
  104. !                     tx = block.tl_tail = tl->tl_tail;
  105. !                     if ((ntok = rewrite(node,&block,0)) < 0) {
  106. !                         return(-1);
  107. !                     }
  108. !                 } else {
  109. !                     block.tl_head = skipws(tx->t_next);
  110. !                     tx = block.tl_tail = dostmt(block.tl_head,0);
  111. !                     if ((ntok = rewrite(node,&block,0)) < 0) {
  112. !                         return(-1);
  113. !                     }
  114.                   }
  115.               } else {
  116. -                 ntok = 0;
  117. -             }
  118. -             /* if no tokens added - i.e. empty block */
  119. -             if (ntok == 0) {
  120.                   addtok(expr,newtok(mem,T_NUM,"0"));
  121.               }
  122. -             ntok = 1;
  123.               nonempty++;
  124.               /*FALLTHROUGH*/
  125.   
  126.           case T_SEMIC:
  127.               if (ntok == 0) {
  128.                   break;
  129.               }
  130.               /* if there was a preceding expression, insert a comma */
  131.               if (estart && estart->t_tok == T_RPAREN) {
  132.                   instok(estart,tt = newtok(mem,T_COMMA,NIL));
  133. --- 131,168 ----
  134.   
  135.               block.tl_head = skipws(block.tl_tail->t_next);
  136.               block.tl_tail = dostmt(block.tl_head,0);
  137.   
  138.               if ((ntok = rewrite(node,&block,0)) < 0) {
  139.                   return(-1);
  140.               }
  141.               /* if no tokens added - i.e. empty block */
  142.               if (ntok == 0) {
  143.                   addtok(expr,newtok(mem,T_NUM,"0"));
  144. +                 ntok++;
  145.               }
  146.   
  147.               addtok(expr,newtok(mem,T_COLON,NIL));
  148.               addtok(expr,newtok(mem,T_WS," "));
  149.   
  150.               tx = skipws(block.tl_tail->t_next);
  151. !             if (tx && tx != tl->tl_tail && tx->t_tok == T_ELSE) {
  152. !                 block.tl_head = skipws(tx->t_next);
  153. !                 tx = block.tl_tail = dostmt(block.tl_head,0);
  154. !                 if ((ntok = rewrite(node,&block,0)) < 0) {
  155. !                     return(-1);
  156.                   }
  157.               } else {
  158.                   addtok(expr,newtok(mem,T_NUM,"0"));
  159. +                 ntok++;
  160. +                 tx = block.tl_tail->t_next;
  161.               }
  162.               nonempty++;
  163.               /*FALLTHROUGH*/
  164.   
  165.           case T_SEMIC:
  166.               if (ntok == 0) {
  167.                   break;
  168.               }
  169.               /* if there was a preceding expression, insert a comma */
  170.               if (estart && estart->t_tok == T_RPAREN) {
  171.                   instok(estart,tt = newtok(mem,T_COMMA,NIL));
  172.  
  173.  
  174. -------------------------------------------------------------------------
  175.  
  176.