[BACK]Return to cpp.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Diff for /OpenXM_contrib2/asir2000/parse/cpp.c between version 1.5 and 1.8

version 1.5, 2015/08/06 10:01:53 version 1.8, 2018/03/29 01:32:54
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/parse/cpp.c,v 1.4 2000/12/05 01:24:56 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/parse/cpp.c,v 1.7 2015/08/14 13:51:56 fujimoto Exp $
 */  */
 #include <stdio.h>  #include <stdio.h>
 #include <ctype.h>  #include <ctype.h>
Line 328  void read_formals(void)
Line 328  void read_formals(void)
        nargs ++;         nargs ++;
        c = getnonspace();         c = getnonspace();
        if (c == ')')         if (c == ')')
         { return;    { return;
         }    }
        else if (c != ',')         else if (c != ',')
         { err_head();    { err_head();
           fprintf(stderr,"invalid macro parameter delimiter\n");      fprintf(stderr,"invalid macro parameter delimiter\n");
         }    }
      }       }
     else      else
      { c = Get();       { c = Get();
        if ((c == ')') && (nargs == 0))         if ((c == ')') && (nargs == 0))
         { return;    { return;
         }    }
        else         else
         { Push(c);    { Push(c);
         }    }
        err_head();         err_head();
        fprintf(stderr,"missing/illegal macro parameter\n");         fprintf(stderr,"missing/illegal macro parameter\n");
        while (1)         while (1)
         { c = Get();    { c = Get();
           if (c == ')')      if (c == ')')
            { return;       { return;
            }  
           if (isbsymchar(c))  
            { Push(c);  
              break;  
            }  
         }  
      }       }
       if (isbsymchar(c))
        { Push(c);
          break;
        }
   }    }
        }
     }
 }  }
   
 void do_define(int sharp, int redef)  void do_define(int sharp, int redef)
Line 376  void do_define(int sharp, int redef)
Line 376  void do_define(int sharp, int redef)
   { char e = '\0';    { char e = '\0';
     if (sharp)      if (sharp)
      { while (1)       { while (1)
         { c = e;    { c = e;
           e = Get();      e = Get();
           if (e == '\n')      if (e == '\n')
            { if (c == '\\')       { if (c == '\\')
               { maybe_print('\n');          { maybe_print('\n');
               }          }
              else         else
               { break;          { break;
               }          }
            }  
         }  
      }       }
     }
        }
     else      else
      { do       { do
         { c = e;    { c = e;
           e = Get();      e = Get();
         } while ((c != '@') || (e == '@'));    } while ((c != '@') || (e == '@'));
        Push(e);         Push(e);
      }       }
     return;      return;
Line 429  void do_define(int sharp, int redef)
Line 429  void do_define(int sharp, int redef)
   { while (1)    { while (1)
      { c = Get();       { c = Get();
        if (quoted && (c == '\n'))         if (quoted && (c == '\n'))
         { quoted = 0;    { quoted = 0;
           maybe_print('\n');      maybe_print('\n');
         }    }
        else if (quoted)         else if (quoted)
         { accum_char(acc,'\\');    { accum_char(acc,'\\');
           accum_char(acc,c);      accum_char(acc,c);
           quoted = 0;      quoted = 0;
         }    }
        else if (c == '/')         else if (c == '/')
         { char d = Get();    { char d = Get();
           accum_char(acc,'/');      accum_char(acc,'/');
           if (d == '*')      if (d == '*')
            { accum_char(acc,'*');       { accum_char(acc,'*');
              incomment = 1;         incomment = 1;
            }       }
           else      else
            { Push(d);       { Push(d);
            }       }
         }    }
        else if (incomment)         else if (incomment)
         { accum_char(acc,c);    { accum_char(acc,c);
           if (c == '*')      if (c == '*')
            { char d = Get();       { char d = Get();
              if (d == '/')         if (d == '/')
               { accum_char(acc,'/');          { accum_char(acc,'/');
                 incomment = 0;      incomment = 0;
               }          }
              else         else
               { Push(d);          { Push(d);
               }          }
            }       }
           else if (c == '\n')      else if (c == '\n')
            { maybe_print('\n');       { maybe_print('\n');
            }       }
         }    }
        else if (c == '\\')         else if (c == '\\')
         { quoted = 1;    { quoted = 1;
         }    }
        else if (c == '\n')         else if (c == '\n')
         { break;    { break;
         }    }
        else         else
         { accum_char(acc,c);    { accum_char(acc,c);
         }    }
      }       }
   }    }
  else   else
   { while (1)    { while (1)
      { c = Get();       { c = Get();
        if (quoted && (c == '@'))         if (quoted && (c == '@'))
         { accum_char(acc,'@');    { accum_char(acc,'@');
           quoted = 0;      quoted = 0;
         }    }
        else if (quoted)         else if (quoted)
         { Push(c);    { Push(c);
           break;      break;
         }    }
        else if (c == '/')         else if (c == '/')
         { char d = Get();    { char d = Get();
           accum_char(acc,'/');      accum_char(acc,'/');
           if (d == '*')      if (d == '*')
            { accum_char(acc,'*');       { accum_char(acc,'*');
              incomment = 1;         incomment = 1;
            }       }
           else      else
            { Push(d);       { Push(d);
            }       }
         }    }
        else if (incomment)         else if (incomment)
         { accum_char(acc,c);    { accum_char(acc,c);
           if (c == '*')      if (c == '*')
            { char d = Get();       { char d = Get();
              if (d == '/')         if (d == '/')
               { accum_char(acc,'/');          { accum_char(acc,'/');
                 incomment = 0;      incomment = 0;
               }          }
              else         else
               { Push(d);          { Push(d);
               }          }
            }       }
           else if (c == '\n')      else if (c == '\n')
            { maybe_print('\n');       { maybe_print('\n');
            }       }
         }    }
        else if (c == '@')         else if (c == '@')
         { quoted = 1;    { quoted = 1;
         }    }
        else         else
         { if (c == '\n')    { if (c == '\n')
            { maybe_print('\n');       { maybe_print('\n');
            }  
           accum_char(acc,c);  
         }  
      }       }
       accum_char(acc,c);
   }    }
        }
     }
  repl = (unsigned char *) accum_result(acc);   repl = (unsigned char *) accum_result(acc);
  f = repl;   f = repl;
  t = repl;   t = repl;
Line 533  void do_define(int sharp, int redef)
Line 533  void do_define(int sharp, int redef)
        c = *g;         c = *g;
        *g = '\0';         *g = '\0';
        for (i=0;i<nargs;i++)         for (i=0;i<nargs;i++)
         { if (strcmp((char *)f,argnames[i]) == 0)    { if (strcmp((char *)f,argnames[i]) == 0)
            { break;       { break;
            }       }
         }    }
        if (i < nargs)         if (i < nargs)
         { *t++ = 0x80 | i;    { *t++ = 0x80 | i;
           f = g;      f = g;
         }    }
        else         else
         { while (*t++ = *f++) ;    { while (*t++ = *f++) ;
           f --;      f --;
           t --;      t --;
         }    }
        *g = c;         *g = c;
      }       }
     else if ((f[0] == '/') && (f[1] == '*'))      else if ((f[0] == '/') && (f[1] == '*'))
Line 590  void do_dump(void)
Line 590  void do_dump(void)
  extern int fstackdepth;   extern int fstackdepth;
   
  fprintf(stderr,   fprintf(stderr,
         "\n\n\tDump of definition table (%d entries in %d buckets):\n\n",    "\n\n\tDump of definition table (%d entries in %d buckets):\n\n",
                                                 n_in_table,symtbl_size);              n_in_table,symtbl_size);
  for (i=0;i<symtbl_size;i++)   for (i=0;i<symtbl_size;i++)
   { fprintf(stderr,"Bucket %d:\n",i);    { fprintf(stderr,"Bucket %d:\n",i);
     for (d=symtbl[i];d;d=d->link)      for (d=symtbl[i];d;d=d->link)
Line 733  void read_actuals(DEF *d)
Line 733  void read_actuals(DEF *d)
        c = Get();         c = Get();
        accum_char(acc,c);         accum_char(acc,c);
        if (comment)         if (comment)
         { if ((last == '*') && (c == '/'))    { if ((last == '*') && (c == '/'))
            { comment = 0;       { comment = 0;
            }       }
         }    }
        else         else
         { if (backslash)    { if (backslash)
            { backslash = 0;       { backslash = 0;
            }  
           else if (quote && (c == quote))  
            { quote = 0;  
            }  
           else if (c == '\\')  
            { backslash = 1;  
            }  
           else if (quote)  
            {  
            }  
           else if ((last == '/') && (c == '*'))  
            { comment = 1;  
            }  
           else if ((c == '\'') || (c == '"'))  
            { quote = c;  
            }  
           else if (c == '(')  
            { pc ++;  
            }  
           else if (c == ')')  
            { if (pc > 0)  
               { pc --;  
               }  
              else  
               { accum_regret(acc);  
                 break;  
               }  
            }  
           else if ((c == ',') && (pc == 0))  
            { accum_regret(acc);  
              break;  
            }  
         }  
      }       }
       else if (quote && (c == quote))
        { quote = 0;
        }
       else if (c == '\\')
        { backslash = 1;
        }
       else if (quote)
        {
        }
       else if ((last == '/') && (c == '*'))
        { comment = 1;
        }
       else if ((c == '\'') || (c == '"'))
        { quote = c;
        }
       else if (c == '(')
        { pc ++;
        }
       else if (c == ')')
        { if (pc > 0)
           { pc --;
           }
          else
           { accum_regret(acc);
       break;
           }
        }
       else if ((c == ',') && (pc == 0))
        { accum_regret(acc);
          break;
        }
     }
        }
     if (i < n)      if (i < n)
      { actuals[i] = accum_result(acc);       { actuals[i] = accum_result(acc);
        actlens[i] = strlen(actuals[i]);         actlens[i] = strlen(actuals[i]);
Line 823  void expand_def(DEF *d)
Line 823  void expand_def(DEF *d)
     else if (d->nargs > 0)      else if (d->nargs > 0)
      { int i;       { int i;
        for (i=0;i<d->nargs;i++)         for (i=0;i<d->nargs;i++)
         { outputc((char)(i?',':'('));    { outputc((char)(i?',':'('));
           outputs(actuals[i]);      outputs(actuals[i]);
         }    }
        outputc(')');         outputc(')');
      }       }
     outputs("-->");      outputs("-->");
Line 842  void expand_def(DEF *d)
Line 842  void expand_def(DEF *d)
        int i;         int i;
        i = *cp & ~0x80;         i = *cp & ~0x80;
        for (dp=actuals[i];*dp;dp++)         for (dp=actuals[i];*dp;dp++)
         { accum_char(result,*dp);    { accum_char(result,*dp);
         }    }
      }       }
     else      else
      { accum_char(result,*cp);       { accum_char(result,*cp);
Line 867  void expand_def(DEF *d)
Line 867  void expand_def(DEF *d)
   { if (!incomm && (last == '/') && (*ep == '*'))    { if (!incomm && (last == '/') && (*ep == '*'))
      { incomm = 1;       { incomm = 1;
        if (!keep_comments || (strncmp(ep,"**/",3) == 0))         if (!keep_comments || (strncmp(ep,"**/",3) == 0))
         { accum_regret(result);    { accum_regret(result);
           ok = 0;      ok = 0;
         }    }
      }       }
     if (ok)      if (ok)
      { accum_char(result,*ep);       { accum_char(result,*ep);
Line 914  void expand_def(DEF *d)
Line 914  void expand_def(DEF *d)
 #define AND TWOCHAR('&','&')  #define AND TWOCHAR('&','&')
 #define OR  TWOCHAR('|','|')  #define OR  TWOCHAR('|','|')
   
 #define ALLBINS         \  #define ALLBINS    \
         BIN('*',*)      \    BIN('*',*)  \
         BIN('/',/)      \    BIN('/',/)  \
         BIN('%',%)      \    BIN('%',%)  \
         BIN('+',+)      \    BIN('+',+)  \
         BIN(LSH,<<)     \    BIN(LSH,<<)  \
         BIN(RSH,>>)     \    BIN(RSH,>>)  \
         BIN('<',<)      \    BIN('<',<)  \
         BIN('>',>)      \    BIN('>',>)  \
         BIN(LEQ,<=)     \    BIN(LEQ,<=)  \
         BIN(GEQ,>=)     \    BIN(GEQ,>=)  \
         BIN(EQL,==)     \    BIN(EQL,==)  \
         BIN(NEQ,!=)     \    BIN(NEQ,!=)  \
         BIN('&',&)      \    BIN('&',&)  \
         BIN('^',^)      \    BIN('^',^)  \
         BIN('|',|)      \    BIN('|',|)  \
         BIN(AND,&&)     \    BIN(AND,&&)  \
         BIN(OR ,||)    BIN(OR ,||)
   
 char *Index(char *s, int c);  char *Index(char *s, int c);
   
Line 951  void free_expr(NODE *n)
Line 951  void free_expr(NODE *n)
        break;         break;
     case '-':      case '-':
        if (n->left)         if (n->left)
         { free_expr(n->left);    { free_expr(n->left);
         }    }
        free_expr(n->right);         free_expr(n->right);
        break;         break;
     case '!':      case '!':
Line 982  int exec_free(NODE *n)
Line 982  int exec_free(NODE *n)
        break;         break;
     case '-':      case '-':
        if (n->left)         if (n->left)
         { rv = exec_free(n->left);    { rv = exec_free(n->left);
         }    }
        else         else
         { rv = 0;    { rv = 0;
         }    }
        rv -= exec_free(n->right);         rv -= exec_free(n->right);
        break;         break;
     case '!':      case '!':
Line 1017  int exec_nofree(NODE *n)
Line 1017  int exec_nofree(NODE *n)
        break;         break;
     case '-':      case '-':
        if (n->left)         if (n->left)
         { rv = exec_nofree(n->left);    { rv = exec_nofree(n->left);
         }    }
        else         else
         { rv = 0;    { rv = 0;
         }    }
        rv -= exec_nofree(n->right);         rv -= exec_nofree(n->right);
        break;         break;
     case '!':      case '!':
Line 1103  int get_quote_char(void)
Line 1103  int get_quote_char(void)
      { d = (d << 3) + c - '0';       { d = (d << 3) + c - '0';
        c = Get();         c = Get();
        if ((c >= '0') && (c <= '7'))         if ((c >= '0') && (c <= '7'))
         { d = (d << 3) + c - '0';    { d = (d << 3) + c - '0';
         }    }
        else         else
         { Push(c);    { Push(c);
         }    }
      }       }
     else      else
      { Push(c);       { Push(c);
Line 1158  NODE *read_expr_11(void)
Line 1158  NODE *read_expr_11(void)
        NODE *read_expr_(void);         NODE *read_expr_(void);
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
        if (debugging)         if (debugging)
         { outputs("()");    { outputs("()");
         }    }
 #endif  #endif
        n = read_expr_();         n = read_expr_();
        c = getnhsexpand();         c = getnhsexpand();
        if (c != ')')         if (c != ')')
         { err_head();    { err_head();
           fprintf(stderr,"expression syntax error -- missing ) supplied\n");      fprintf(stderr,"expression syntax error -- missing ) supplied\n");
           Push(c);      Push(c);
         }    }
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
        if (debugging)         if (debugging)
         { outputs("~");    { outputs("~");
         }    }
 #endif  #endif
        return(n);         return(n);
      }       }
Line 1179  NODE *read_expr_11(void)
Line 1179  NODE *read_expr_11(void)
      { int base;       { int base;
        static char digits[] = "0123456789abcdefABCDEF";         static char digits[] = "0123456789abcdefABCDEF";
        static char values[] =         static char values[] =
                 "\0\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\12\13\14\15\16\17";      "\0\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\12\13\14\15\16\17";
        char *d;         char *d;
        int v;         int v;
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
        if (debugging)         if (debugging)
         { outputs("N");    { outputs("N");
         }    }
 #endif  #endif
        base = 10;         base = 10;
        if (c == '0')         if (c == '0')
         { base = 8;    { base = 8;
           c = Get();      c = Get();
           if ((c == 'x') || (c == 'X'))      if ((c == 'x') || (c == 'X'))
            { base = 16;       { base = 16;
              c = Get();         c = Get();
            }       }
         }    }
        v = 0;         v = 0;
        while (1)         while (1)
         { d = Index(digits,c);    { d = Index(digits,c);
           if (d == 0)      if (d == 0)
            { Push(c);       { Push(c);
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputd(v);          { outputd(v);
                 outputs("~");      outputs("~");
               }          }
 #endif  #endif
              return(newleaf(v));         return(newleaf(v));
            }  
           else if (values[d-digits] >= base)  
            { err_head();  
              fprintf(stderr,"warning: illegal %sdigit `%c'\n",  
                         (base==16)?"hex ":(base==8)?"octal ":"",c);  
            }  
           v = (v * base) + values[d-digits];  
           c = Get();  
         }  
      }       }
       else if (values[d-digits] >= base)
        { err_head();
          fprintf(stderr,"warning: illegal %sdigit `%c'\n",
         (base==16)?"hex ":(base==8)?"octal ":"",c);
        }
       v = (v * base) + values[d-digits];
       c = Get();
     }
        }
     else if (c == '\'')      else if (c == '\'')
      { int i;       { int i;
        int j;         int j;
Line 1225  NODE *read_expr_11(void)
Line 1225  NODE *read_expr_11(void)
        i = 0;         i = 0;
        n = 0;         n = 0;
        while (1)         while (1)
         { j = get_quote_char();    { j = get_quote_char();
           if (j < 0)      if (j < 0)
            { break;       { break;
            }       }
           i = (i << 8) | j;      i = (i << 8) | j;
           n ++;      n ++;
         }    }
        if (n > 4)         if (n > 4)
         { err_head();    { err_head();
           fprintf(stderr,"warning: too many characters in character constant\n");      fprintf(stderr,"warning: too many characters in character constant\n");
         }    }
        return(newleaf(i));         return(newleaf(i));
      }       }
     else if ((c == '\n') && !sharp)      else if ((c == '\n') && !sharp)
Line 1244  NODE *read_expr_11(void)
Line 1244  NODE *read_expr_11(void)
     else      else
      { char *id;       { char *id;
        if (complain)         if (complain)
         { err_head();    { err_head();
           fprintf(stderr,"expression syntax error -- number expected\n");      fprintf(stderr,"expression syntax error -- number expected\n");
         }    }
        if (isbsymchar(c))         if (isbsymchar(c))
         { Push(c);    { Push(c);
           id = read_ident();      id = read_ident();
         }    }
        else         else
         { id = 0;    { id = 0;
         }    }
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
        if (debugging)         if (debugging)
         { outputs("0(");    { outputs("0(");
           outputc(c);      outputc(c);
           outputs(":");      outputs(":");
           outputs(id?id:"(none)");      outputs(id?id:"(none)");
           outputs(")~");      outputs(")~");
         }    }
 #endif  #endif
        if (id)         if (id)
         { free(id);    { free(id);
         }    }
        return(newleaf(0));         return(newleaf(0));
      }       }
   }    }
Line 1289  NODE *read_expr_10(void)
Line 1289  NODE *read_expr_10(void)
        case '~':         case '~':
        case '!':         case '!':
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputc(c);       { outputc(c);
            }       }
 #endif  #endif
           n = read_expr_10();      n = read_expr_10();
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           return(newnode(0,c,n));      return(newnode(0,c,n));
           break;      break;
        case 'd':         case 'd':
           Push(c);      Push(c);
           input_mark();      input_mark();
           w = read_ident();      w = read_ident();
           if (strcmp(w,"defined") == 0)      if (strcmp(w,"defined") == 0)
            { c = getnonspace();       { c = getnonspace();
              if (c == '(')         if (c == '(')
               { char *id;          { char *id;
                 id = read_ident();      id = read_ident();
                 if (id)      if (id)
                  { c = getnonspace();       { c = getnonspace();
                    if (c == ')')         if (c == ')')
                     { input_unmark();          { input_unmark();
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
                       if (debugging)            if (debugging)
                        { outputs("ifdef");             { outputs("ifdef");
                        }             }
 #endif  #endif
                       return(newname(id));            return(newname(id));
                     }          }
                  }       }
               }          }
              else if (isbsymchar(c))         else if (isbsymchar(c))
               { char *id;          { char *id;
                 Push(c);      Push(c);
                 id = read_ident();      id = read_ident();
                 if (id)      if (id)
                  { input_unmark();       { input_unmark();
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
                    if (debugging)         if (debugging)
                     { outputs("ifdef");          { outputs("ifdef");
                     }          }
 #endif  #endif
                    return(newname(id));         return(newname(id));
                  }       }
               }          }
            }       }
           input_recover();      input_recover();
           n = read_expr_11();      n = read_expr_11();
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           return(n);      return(n);
           break;      break;
        default:         default:
           Push(c);      Push(c);
           n = read_expr_11();      n = read_expr_11();
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           return(n);      return(n);
           break;      break;
      }       }
   }    }
 }  }
Line 1380  NODE *read_expr_9(void)
Line 1380  NODE *read_expr_9(void)
        case '/':         case '/':
        case '%':         case '%':
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputc(c);       { outputc(c);
            }       }
 #endif  #endif
           r = read_expr_10();      r = read_expr_10();
           l = newnode(l,c,r);      l = newnode(l,c,r);
           break;      break;
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1418  NODE *read_expr_8(void)
Line 1418  NODE *read_expr_8(void)
      { case '+':       { case '+':
        case '-':         case '-':
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputc(c);       { outputc(c);
            }       }
 #endif  #endif
           r = read_expr_9();      r = read_expr_9();
           l = newnode(l,c,r);      l = newnode(l,c,r);
           break;      break;
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1456  NODE *read_expr_7(void)
Line 1456  NODE *read_expr_7(void)
     switch (c)      switch (c)
      { case '<':       { case '<':
        case '>':         case '>':
           d = Get();      d = Get();
           if (d == c)      if (d == c)
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
                 outputc(d);      outputc(d);
               }          }
 #endif  #endif
              r = read_expr_8();         r = read_expr_8();
              l = newnode(l,(c=='<')?LSH:RSH,r);         l = newnode(l,(c=='<')?LSH:RSH,r);
              break;         break;
            }       }
           Push(d);      Push(d);
           /* fall through ... */      /* fall through ... */
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1502  NODE *read_expr_6(void)
Line 1502  NODE *read_expr_6(void)
     switch (c)      switch (c)
      { case '<':       { case '<':
        case '>':         case '>':
           d = Get();      d = Get();
           if (d == '=')      if (d == '=')
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
                 outputc(d);      outputc(d);
               }          }
 #endif  #endif
              r = read_expr_7();         r = read_expr_7();
              l = newnode(l,(c=='<')?LEQ:GEQ,r);         l = newnode(l,(c=='<')?LEQ:GEQ,r);
            }       }
           else      else
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
               }          }
 #endif  #endif
              Push(d);         Push(d);
              r = read_expr_7();         r = read_expr_7();
              l = newnode(l,c,r);         l = newnode(l,c,r);
            }       }
           break;      break;
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1557  NODE *read_expr_5(void)
Line 1557  NODE *read_expr_5(void)
     switch (c)      switch (c)
      { case '=':       { case '=':
        case '!':         case '!':
           d = Get();      d = Get();
           if (d == '=')      if (d == '=')
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
                 outputc(d);      outputc(d);
               }          }
 #endif  #endif
              r = read_expr_6();         r = read_expr_6();
              l = newnode(l,(c=='=')?EQL:NEQ,r);         l = newnode(l,(c=='=')?EQL:NEQ,r);
              break;         break;
            }       }
           Push(d);      Push(d);
           /* fall through ... */      /* fall through ... */
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1602  NODE *read_expr_4(void)
Line 1602  NODE *read_expr_4(void)
   { c = getnhsexpand();    { c = getnhsexpand();
     switch (c)      switch (c)
      { case '&':       { case '&':
           d = Get();      d = Get();
           if (d != '&')      if (d != '&')
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
                 outputc(d);      outputc(d);
               }          }
 #endif  #endif
              r = read_expr_5();         r = read_expr_5();
              l = newnode(l,c,r);         l = newnode(l,c,r);
              break;         break;
            }       }
           Push(d);      Push(d);
           /* fall through ... */      /* fall through ... */
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1647  NODE *read_expr_3(void)
Line 1647  NODE *read_expr_3(void)
     switch (c)      switch (c)
      { case '^':       { case '^':
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputc(c);       { outputc(c);
            }       }
 #endif  #endif
           r = read_expr_4();      r = read_expr_4();
           l = newnode(l,c,r);      l = newnode(l,c,r);
           break;      break;
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1684  NODE *read_expr_2(void)
Line 1684  NODE *read_expr_2(void)
   { c = getnhsexpand();    { c = getnhsexpand();
     switch (c)      switch (c)
      { case '|':       { case '|':
           d = Get();      d = Get();
           if (d != '|')      if (d != '|')
            { Push(d);       { Push(d);
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
               }          }
 #endif  #endif
              r = read_expr_3();         r = read_expr_3();
              l = newnode(l,c,r);         l = newnode(l,c,r);
              break;         break;
            }       }
           Push(d);      Push(d);
           /* fall through ... */      /* fall through ... */
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1728  NODE *read_expr_1(void)
Line 1728  NODE *read_expr_1(void)
   { c = getnhsexpand();    { c = getnhsexpand();
     switch (c)      switch (c)
      { case '&':       { case '&':
           d = Get();      d = Get();
           if (d == c)      if (d == c)
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
                 outputc(d);      outputc(d);
               }          }
 #endif  #endif
              r = read_expr_2();         r = read_expr_2();
              l = newnode(l,AND,r);         l = newnode(l,AND,r);
              break;         break;
            }       }
           Push(d);      Push(d);
           /* fall through ... */      /* fall through ... */
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1773  NODE *read_expr_0(void)
Line 1773  NODE *read_expr_0(void)
   { c = getnhsexpand();    { c = getnhsexpand();
     switch (c)      switch (c)
      { case '|':       { case '|':
           d = Get();      d = Get();
           if (d == c)      if (d == c)
            {       {
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
              if (debugging)         if (debugging)
               { outputc(c);          { outputc(c);
                 outputc(d);      outputc(d);
               }          }
 #endif  #endif
              r = read_expr_1();         r = read_expr_1();
              l = newnode(l,OR,r);         l = newnode(l,OR,r);
              break;         break;
            }       }
           Push(d);      Push(d);
           /* fall through ... */      /* fall through ... */
        default:         default:
 #ifdef DEBUG_EXPR  #ifdef DEBUG_EXPR
           if (debugging)      if (debugging)
            { outputs("~");       { outputs("~");
            }       }
 #endif  #endif
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1818  NODE *read_expr_(void)
Line 1818  NODE *read_expr_(void)
     switch (c)      switch (c)
      { case '\n':       { case '\n':
        case ')':         case ')':
           Push(c);      Push(c);
           return(l);      return(l);
           break;      break;
        case ',':         case ',':
           r = read_expr_0();      r = read_expr_0();
           l = newnode(l,c,r);      l = newnode(l,c,r);
           break;      break;
        default:         default:
           err_head();      err_head();
           fprintf(stderr,"expression syntax error -- bad operator `%c'\n",c);      fprintf(stderr,"expression syntax error -- bad operator `%c'\n",c);
           return(l);      return(l);
           break;      break;
      }       }
   }    }
 }  }
Line 1906  void dump_expr(NODE *n)
Line 1906  void dump_expr(NODE *n)
        break;         break;
     case '-':      case '-':
        if (n->left)         if (n->left)
         { dump_expr(n->left);    { dump_expr(n->left);
         }    }
        outputc('-');         outputc('-');
        dump_expr(n->right);         dump_expr(n->right);
        break;         break;
Line 1925  void dump_expr(NODE *n)
Line 1925  void dump_expr(NODE *n)
        outputc(')');         outputc(')');
        break;         break;
 #define BIN(key,op) case key:dump_expr(n->left);\  #define BIN(key,op) case key:dump_expr(n->left);\
                          putx(key);\         putx(key);\
                          dump_expr(n->right);\         dump_expr(n->right);\
                 break;      break;
     ALLBINS      ALLBINS
 #undef BIN  #undef BIN
   }    }
Line 1970  void do_if(int expr_sharp)
Line 1970  void do_if(int expr_sharp)
     if (sharp)      if (sharp)
      { d = '\0';       { d = '\0';
        do         do
         { c = d;    { c = d;
           d = Get();      d = Get();
         } while ((c == '\\') || (d != '\n'));    } while ((c == '\\') || (d != '\n'));
      }       }
     return;      return;
   }    }
Line 1985  void do_if(int expr_sharp)
Line 1985  void do_if(int expr_sharp)
        iffalse();         iffalse();
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputc('>');    { outputc('>');
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        return;         return;
      }       }
Line 2033  void do_ifdef(int expr_sharp)
Line 2033  void do_ifdef(int expr_sharp)
      {       {
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs("no ident ");    { outputs("no ident ");
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        iffalse();         iffalse();
      }       }
Line 2043  void do_ifdef(int expr_sharp)
Line 2043  void do_ifdef(int expr_sharp)
      {       {
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs(w);    { outputs(w);
           outputc(' ');      outputc(' ');
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        if (find_def(w))         if (find_def(w))
         { iftrue();    { iftrue();
         }    }
        else         else
         { iffalse();    { iffalse();
         }    }
        free(w);         free(w);
      }       }
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
Line 2095  void do_ifndef(int expr_sharp)
Line 2095  void do_ifndef(int expr_sharp)
      {       {
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs("no ident ");    { outputs("no ident ");
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        iftrue();         iftrue();
      }       }
Line 2105  void do_ifndef(int expr_sharp)
Line 2105  void do_ifndef(int expr_sharp)
      {       {
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs(w);    { outputs(w);
           outputc(' ');      outputc(' ');
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        if (find_def(w))         if (find_def(w))
         { iffalse();    { iffalse();
         }    }
        else         else
         { iftrue();    { iftrue();
         }    }
        free(w);         free(w);
      }       }
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
Line 2145  void do_else(int expr_sharp)
Line 2145  void do_else(int expr_sharp)
      {       {
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs("top ");    { outputs("top ");
           output_ifstate(ifstack->condstate);      output_ifstate(ifstack->condstate);
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        switch (ifstack->condstate)         switch (ifstack->condstate)
         { case IFSTATE_TRUE:    { case IFSTATE_TRUE:
              ifstack->condstate = IFSTATE_STAYFALSE;         ifstack->condstate = IFSTATE_STAYFALSE;
              break;         break;
           case IFSTATE_FALSE:      case IFSTATE_FALSE:
              ifstack->condstate = IFSTATE_TRUE;         ifstack->condstate = IFSTATE_TRUE;
              break;         break;
         }    }
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs(" now ");    { outputs(" now ");
           output_ifstate(ifstack->condstate);      output_ifstate(ifstack->condstate);
           outputc('>');      outputc('>');
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
      }       }
     else      else
      {       {
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs(" no if>");    { outputs(" no if>");
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        err_head();         err_head();
        fprintf(stderr,"if-less else\n");         fprintf(stderr,"if-less else\n");
Line 2245  void do_elif(int expr_sharp)
Line 2245  void do_elif(int expr_sharp)
     if (sharp)      if (sharp)
      { d = '\0';       { d = '\0';
        do         do
         { c = d;    { c = d;
           d = Get();      d = Get();
         } while ((c == '\\') || (d != '\n'));    } while ((c == '\\') || (d != '\n'));
      }       }
     return;      return;
   }    }
Line 2260  void do_elif(int expr_sharp)
Line 2260  void do_elif(int expr_sharp)
        ifstack->condstate = IFSTATE_STAYFALSE;         ifstack->condstate = IFSTATE_STAYFALSE;
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
        if (debugging)         if (debugging)
         { outputs("forcing STAYFALSE>");    { outputs("forcing STAYFALSE>");
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        return;         return;
      }       }
Line 2289  void do_elif(int expr_sharp)
Line 2289  void do_elif(int expr_sharp)
        break;         break;
     case IFSTATE_FALSE:      case IFSTATE_FALSE:
        if (e)         if (e)
         { ifstack->condstate = IFSTATE_TRUE;    { ifstack->condstate = IFSTATE_TRUE;
         }    }
        break;         break;
   }    }
 #ifdef DEBUG_IF  #ifdef DEBUG_IF
Line 2440  void do_include(int expr_sharp)
Line 2440  void do_include(int expr_sharp)
        DEF *d;         DEF *d;
        cp = init_accum();         cp = init_accum();
        while (issymchar(c))         while (issymchar(c))
         { accum_char(cp,c);    { accum_char(cp,c);
           c = Get();      c = Get();
         }    }
        Push(c);         Push(c);
        cp = accum_result(cp);         cp = accum_result(cp);
        d = find_def(cp);         d = find_def(cp);
        if (d)         if (d)
         { expand_def(d);    { expand_def(d);
           n_hits ++;      n_hits ++;
         }    }
        else         else
         { char *dp;    { char *dp;
           for (dp=cp+strlen(cp);dp>cp;dp--) Push(*dp);      for (dp=cp+strlen(cp);dp>cp;dp--) Push(*dp);
           n_misses ++;      n_misses ++;
         }    }
      }       }
     else      else
      { break;       { break;
Line 2465  void do_include(int expr_sharp)
Line 2465  void do_include(int expr_sharp)
   { while (1)    { while (1)
      { c = Get();       { c = Get();
        if (c == '\n')         if (c == '\n')
         { Push('\n');    { Push('\n');
           c = '"';      c = '"';
           err_head();      err_head();
           fprintf(stderr,"warning: unterminated %cinclude filename\n",      fprintf(stderr,"warning: unterminated %cinclude filename\n",
                                                         sharp?'#':'@');                sharp?'#':'@');
         }    }
        if (c == '"')         if (c == '"')
         { break;    { break;
         }    }
        accum_char(acc,c);         accum_char(acc,c);
      }       }
     if (sharp)      if (sharp)
Line 2485  void do_include(int expr_sharp)
Line 2485  void do_include(int expr_sharp)
   { while (1)    { while (1)
      { c = Get();       { c = Get();
        if (c == '\n')         if (c == '\n')
         { Push('\n');    { Push('\n');
           c = '>';      c = '>';
           err_head();      err_head();
           fprintf(stderr,"warning: unterminated %cinclude filename\n",      fprintf(stderr,"warning: unterminated %cinclude filename\n",
                                                         sharp?'#':'@');                sharp?'#':'@');
         }    }
        if (c == '>')         if (c == '>')
         { break;    { break;
         }    }
        accum_char(acc,c);         accum_char(acc,c);
      }       }
     if (sharp)      if (sharp)
Line 2516  void do_include(int expr_sharp)
Line 2516  void do_include(int expr_sharp)
 #define DELIM '/'  #define DELIM '/'
 #endif  #endif
   
 #if defined(VISUAL) || defined(__MINGW32__) || defined(__MINGW64__)  #if defined(VISUAL) || defined(__MINGW32__)
 #if defined(DELIM)  #if defined(DELIM)
 #undef DELIM  #undef DELIM
 #endif  #endif
Line 2552  void read_include_file(char *name, int dohere, int exp
Line 2552  void read_include_file(char *name, int dohere, int exp
      { int i;       { int i;
        n = temp;         n = temp;
        for (i=0;i<nIfiles;i++)         for (i=0;i<nIfiles;i++)
         { sprintf(temp,"%s%c%s",Ifiles[i],DELIM,name);    { sprintf(temp,"%s%c%s",Ifiles[i],DELIM,name);
           f = fopen(temp,"r");      f = fopen(temp,"r");
           if (f != NULL)      if (f != NULL)
            { break;       { break;
            }  
         }  
      }       }
   }    }
        }
     }
  if (f == NULL)   if (f == NULL)
   { err_head();    { err_head();
     fprintf(stderr,"can't find include file %s\n",name);      fprintf(stderr,"can't find include file %s\n",name);
Line 2617  char *cur_incldir;
Line 2617  char *cur_incldir;
 int cur_lineno;  int cur_lineno;
   
 typedef struct _mark {  typedef struct _mark {
           struct _mark *link;      struct _mark *link;
           char *acc;      char *acc;
           int startdepth;      int startdepth;
           int incs[MAXFILES];      int incs[MAXFILES];
           int nincs;      int nincs;
           int nignore; } MARK;      int nignore; } MARK;
   
 static MARK *marks;  static MARK *marks;
 static int atline;  static int atline;
Line 2689  char Get(void)
Line 2689  char Get(void)
  while (1)   while (1)
   { if (cur_npushed > 0)    { if (cur_npushed > 0)
      { do       { do
         { c = GET();    { c = GET();
         } while (c == NOEXPAND);    } while (c == NOEXPAND);
        if (c == MARKLINE)         if (c == MARKLINE)
         { mark_get_line();    { mark_get_line();
           continue;      continue;
         }    }
        mark_got_from_pushback(c);         mark_got_from_pushback(c);
 #ifdef DEBUG_IO  #ifdef DEBUG_IO
        if (debugging)         if (debugging)
         { outputc('(');    { outputc('(');
           outputs(unctrl(c));      outputs(unctrl(c));
           outputc(')');      outputc(')');
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        break;         break;
      }       }
     else      else
      { c = getc(cur_fstack);       { c = getc(cur_fstack);
        if (feof(cur_fstack))         if (feof(cur_fstack))
         { if (fstackdepth > 0)    { if (fstackdepth > 0)
            {       {
 #ifdef DEBUG_INCL  #ifdef DEBUG_INCL
              if (debugging)         if (debugging)
               { outputs("--eof:");          { outputs("--eof:");
                 outputs(cur_fn);      outputs(cur_fn);
                 outputs("--");      outputs("--");
               }          }
 #endif  #endif
              fclose(cur_fstack);         fclose(cur_fstack);
              free(cur_fn);         free(cur_fn);
              free(cur_incldir);         free(cur_incldir);
              change_fstackdepth(-1);         change_fstackdepth(-1);
              mark_file_ending();         mark_file_ending();
              out_at(cur_lineno,cur_fn);         out_at(cur_lineno,cur_fn);
              autodef_file(curfile());         autodef_file(curfile());
              autodef_line(curline());         autodef_line(curline());
              continue;         continue;
            }       }
           else      else
            { flush_final_nl();       { flush_final_nl();
              save_stats();         save_stats();
 #if 0  #if 0
              exit(0);         exit(0);
 #endif  #endif
              longjmp(cpp_env,1);         longjmp(cpp_env,1);
            }       }
         }    }
        mark_got_from_file(c);         mark_got_from_file(c);
 #ifdef DEBUG_IO  #ifdef DEBUG_IO
        if (debugging)         if (debugging)
         { outputc('<');    { outputc('<');
           outputs(unctrl(c));      outputs(unctrl(c));
           outputc('>');      outputc('>');
           fflush(outfile);      fflush(outfile);
         }    }
 #endif  #endif
        break;         break;
      }       }
Line 2856  char getnhsexpand(void)
Line 2856  char getnhsexpand(void)
     if (expr_sharp && (c == '\\'))      if (expr_sharp && (c == '\\'))
      { c = Get();       { c = Get();
        if (c == '\n')         if (c == '\n')
         { continue;    { continue;
         }    }
        else         else
         { Push(c);    { Push(c);
           c = '\\';      c = '\\';
         }    }
      }       }
     break;      break;
   }    }
Line 2880  char getexpand(void)
Line 2880  char getexpand(void)
      { char d;       { char d;
        d = Get();         d = Get();
        if (d == '*')         if (d == '*')
         { d = '\0';    { d = '\0';
           do      do
            { c = d;       { c = d;
              d = Get();         d = Get();
            } while ((c != '*') || (d != '/'));       } while ((c != '*') || (d != '/'));
           continue;      continue;
         }    }
        else         else
         { Push(d);    { Push(d);
           return('/');      return('/');
         }    }
      }       }
     else if (c == NOEXPAND)      else if (c == NOEXPAND)
      { c = Get();       { c = Get();
        if (issymchar(c))         if (issymchar(c))
         { Push(NOEXPAND);    { Push(NOEXPAND);
         }    }
        return(c);         return(c);
      }       }
     else if (! isbsymchar(c))      else if (! isbsymchar(c))
Line 2916  char getexpand(void)
Line 2916  char getexpand(void)
     else      else
      { int i;       { int i;
        for (i=strlen(str)-1;i>0;i--)         for (i=strlen(str)-1;i>0;i--)
         { Push(str[i]);    { Push(str[i]);
         }    }
        Push(NOEXPAND);         Push(NOEXPAND);
        c = str[0];         c = str[0];
        free(str);         free(str);
Line 3001  void outputc(char c)
Line 3001  void outputc(char c)
      { atline += nnls;       { atline += nnls;
        nnls = 0;         nnls = 0;
        if (no_line_lines)         if (no_line_lines)
         { fprintf(outfile,"\n");    { fprintf(outfile,"\n");
         }    }
        else         else
         { fprintf(outfile,"\n# %d \"%s\"\n",atline,atfile);    { fprintf(outfile,"\n# %d \"%s\"\n",atline,atfile);
         }    }
        done_line = 1;         done_line = 1;
      }       }
     for (;nnls;nnls--)      for (;nnls;nnls--)
Line 3107  void input_recover(void)
Line 3107  void input_recover(void)
     while (m->nincs > 0)      while (m->nincs > 0)
      { l = m->incs[--m->nincs];       { l = m->incs[--m->nincs];
        for (;i>=l;i--)         for (;i>=l;i--)
         { Push(txt[i]);    { Push(txt[i]);
         }    }
        Push(MARKLEND);         Push(MARKLEND);
        c = txt[i];         c = txt[i];
        for (i--;txt[i]!=c;i--)         for (i--;txt[i]!=c;i--)
         { Push(txt[i]);    { Push(txt[i]);
         }    }
        Push('A');         Push('A');
        Push('@');         Push('@');
        Push('@');         Push('@');
Line 3163  void mark_file_ending(void)
Line 3163  void mark_file_ending(void)
      { to = m->incs[--m->nincs];       { to = m->incs[--m->nincs];
        acc = m->acc;         acc = m->acc;
        for (i=accum_howfar(acc);i>to;i--)         for (i=accum_howfar(acc);i>to;i--)
         { accum_regret(acc);    { accum_regret(acc);
         }    }
      }       }
   }    }
 }  }
Line 3298  int incldep;
Line 3298  int incldep;
 char *incldep_o;  char *incldep_o;
 int do_at_ctrls;  int do_at_ctrls;
 extern char *predefs[];  extern char *predefs[];
   
 #if defined(SYSV)  #if defined(SYSV)
 void main(ac,av)  void main(ac,av)
 #else  #else
Line 3315  void cpp_main(int ac, char **av)
Line 3315  void cpp_main(int ac, char **av)
  int i;   int i;
   
  if ( setjmp(cpp_env) ) {   if ( setjmp(cpp_env) ) {
         if ( inf != stdin )     if ( inf != stdin )
                 fclose(inf);       fclose(inf);
         if ( outf == stdout )     if ( outf == stdout )
                 fflush(outf);       fflush(outf);
         else     else
                 fclose(outf);       fclose(outf);
         return;     return;
  }   }
   
  init_symtbl();   init_symtbl();
 #define predef(str) ( (cp=copyofstr("1")), \  #define predef(str) ( (cp=copyofstr("1")), \
                       check_malloc(cp), \            check_malloc(cp), \
                       define((str),-1,(unsigned char *)cp,DEF_PREDEF) )            define((str),-1,(unsigned char *)cp,DEF_PREDEF) )
  for (i=0;predefs[i];i++)   for (i=0;predefs[i];i++)
   { predef(predefs[i]);    { predef(predefs[i]);
   }    }
Line 3344  void cpp_main(int ac, char **av)
Line 3344  void cpp_main(int ac, char **av)
   { if (**av == '-')    { if (**av == '-')
      { rest = 0;       { rest = 0;
        if (!strcmp(*av,"-undef"))         if (!strcmp(*av,"-undef"))
         { undef_predefs();    { undef_predefs();
         }    }
        else         else
         { for (++*av;(**av)&&!rest;++*av)    { for (++*av;(**av)&&!rest;++*av)
            { switch (**av)       { switch (**av)
               { case 'C':          { case 'C':
                    keep_comments = 1;         keep_comments = 1;
                    break;         break;
                 case 'D':      case 'D':
                    rest = 1;         rest = 1;
                    ++*av;         ++*av;
                    if (strcmp(*av,"@") == 0)         if (strcmp(*av,"@") == 0)
                     { do_at_ctrls = 1;          { do_at_ctrls = 1;
                     }          }
                    else         else
                     { cp = Index(*av,'=');          { cp = Index(*av,'=');
                       if (cp)            if (cp)
                        { if (cp != *av)             { if (cp != *av)
                           { char *dp;          { char *dp;
                             *cp++ = '\0';            *cp++ = '\0';
                             dp = copyofstr(cp);            dp = copyofstr(cp);
                             check_malloc(dp);            check_malloc(dp);
                             define(*av,-1,(unsigned char *)dp,DEF_CMDLINE);            define(*av,-1,(unsigned char *)dp,DEF_CMDLINE);
                           }          }
                          else         else
                           { fprintf(stderr,"Must give a name for -D\n");          { fprintf(stderr,"Must give a name for -D\n");
                           }          }
                        }             }
                       else            else
                        { char *dp;             { char *dp;
                          dp = copyofstr("1");         dp = copyofstr("1");
                          check_malloc(dp);         check_malloc(dp);
                          define(*av,-1,(unsigned char *)dp,DEF_CMDLINE);         define(*av,-1,(unsigned char *)dp,DEF_CMDLINE);
                        }             }
                     }          }
                    break;         break;
                 case 'E':      case 'E':
                    break;         break;
                 case 'I':      case 'I':
                    rest = 1;         rest = 1;
                    ++*av;         ++*av;
                    if (**av)         if (**av)
                     { Ifile(*av);          { Ifile(*av);
                     }          }
                    else         else
                     { fprintf(stderr,"Must give a directory name for -I\n");          { fprintf(stderr,"Must give a directory name for -I\n");
                     }          }
                    break;         break;
                 case 'M':      case 'M':
                    incldep = 1;         incldep = 1;
                    break;         break;
                 case 'P':      case 'P':
                    no_line_lines = 1;         no_line_lines = 1;
                    break;         break;
                 case 'R':      case 'R':
                    break;         break;
                 case 'U':      case 'U':
                    rest = 1;         rest = 1;
                    ++*av;         ++*av;
                    if (**av)         if (**av)
                     { undef(*av);          { undef(*av);
                     }          }
                    else         else
                     { fprintf(stderr,"Must give a name for -U\n");          { fprintf(stderr,"Must give a name for -U\n");
                     }          }
                    break;         break;
                 default:      default:
                    fprintf(stderr,"Unknown flag -%c\n",**av);         fprintf(stderr,"Unknown flag -%c\n",**av);
                    break;         break;
               }          }
            }  
         }  
      }       }
     }
        }
     else      else
      { switch (argno++)       { switch (argno++)
         { case 0:    { case 0:
              if (strcmp(*av,"-") != 0)         if (strcmp(*av,"-") != 0)
               { FILE *f;          { FILE *f;
                 f = fopen(*av,"r");      f = fopen(*av,"r");
                 if (f == NULL)      if (f == NULL)
                  { fprintf(stderr,"Cannot open source file %s\n",*av);       { fprintf(stderr,"Cannot open source file %s\n",*av);
                  }  
                 else  
                  { inf = f;  
                    inname = *av;  
                  }  
               }  
              break;  
           case 1:  
              if (strcmp(*av,"-") != 0)  
               { FILE *f;  
                 f = fopen(*av,"w");  
                 if (f == NULL)  
                  { fprintf(stderr,"Can't create %s\n",*av);  
                  }  
                 else  
                  { outf = f;  
                  }  
               }  
              break;  
           default:  
              fprintf(stderr,"Extra name %s ignored\n",*av);  
              break;  
         }  
      }       }
       else
        { inf = f;
          inname = *av;
        }
           }
          break;
       case 1:
          if (strcmp(*av,"-") != 0)
           { FILE *f;
       f = fopen(*av,"w");
       if (f == NULL)
        { fprintf(stderr,"Can't create %s\n",*av);
        }
       else
        { outf = f;
        }
           }
          break;
       default:
          fprintf(stderr,"Extra name %s ignored\n",*av);
          break;
   }    }
        }
     }
  if (incldep && !inname[0])   if (incldep && !inname[0])
   { fprintf(stderr,"No input file for -M flag\n");    { fprintf(stderr,"No input file for -M flag\n");
 #if 0  #if 0
     exit(1);      exit(1);
 #endif  #endif
         longjmp(cpp_env,1);    longjmp(cpp_env,1);
   }    }
  if (do_at_ctrls)   if (do_at_ctrls)
   { predef("at_sign_ctrls");    { predef("at_sign_ctrls");
Line 3516  void cpp_main(int ac, char **av)
Line 3516  void cpp_main(int ac, char **av)
     if (!incldep && (isdigit(c) || (c == '.')))      if (!incldep && (isdigit(c) || (c == '.')))
      { haddigit = 0;       { haddigit = 0;
        while (isdigit(c) || (c == '.'))         while (isdigit(c) || (c == '.'))
         { haddigit |= isdigit(c);    { haddigit |= isdigit(c);
           maybe_print(c);      maybe_print(c);
           c = Get();      c = Get();
         }    }
        if (haddigit && ((c == 'e') || (c == 'E')))         if (haddigit && ((c == 'e') || (c == 'E')))
         { maybe_print(c);    { maybe_print(c);
           c = Get();      c = Get();
           while (isdigit(c))      while (isdigit(c))
            { maybe_print(c);       { maybe_print(c);
              c = Get();         c = Get();
            }       }
         }    }
        Push(c);         Push(c);
        continue;         continue;
      }       }
     if (quote)      if (quote)
      { if (c == '\\')       { if (c == '\\')
         { maybe_print(c);    { maybe_print(c);
           backslash = 1;      backslash = 1;
           continue;      continue;
         }    }
        else if ((c == quote) || (c == '\n'))         else if ((c == quote) || (c == '\n'))
         { maybe_print(c);    { maybe_print(c);
           quote = 0;      quote = 0;
           continue;      continue;
         }    }
        else         else
         { maybe_print(c);    { maybe_print(c);
           continue;      continue;
         }    }
      }       }
     if (c == '\\') /* this weirdness is Reiser semantics.... */      if (c == '\\') /* this weirdness is Reiser semantics.... */
      { backslash = 1;       { backslash = 1;
Line 3564  void cpp_main(int ac, char **av)
Line 3564  void cpp_main(int ac, char **av)
      }       }
     else if (! incldep)      else if (! incldep)
      { if (isbsymchar(c) && !in_false_if())       { if (isbsymchar(c) && !in_false_if())
         { char *cp;    { char *cp;
           DEF *d;      DEF *d;
           cp = init_accum();      cp = init_accum();
           while (issymchar(c))      while (issymchar(c))
            { accum_char(cp,c);       { accum_char(cp,c);
              c = Get();         c = Get();
            }       }
           Push(c);      Push(c);
           cp = accum_result(cp);      cp = accum_result(cp);
 #ifdef DEBUG_MAIN  #ifdef DEBUG_MAIN
           if (debugging)      if (debugging)
            { outputs("<word:");       { outputs("<word:");
              outputs(cp);         outputs(cp);
              outputs(">");         outputs(">");
            }       }
 #endif  #endif
           d = find_def(cp);      d = find_def(cp);
           if (d)      if (d)
            { expand_def(d);       { expand_def(d);
              n_hits ++;         n_hits ++;
            }       }
           else      else
            { for (;*cp;cp++)       { for (;*cp;cp++)
               { maybe_print(*cp);          { maybe_print(*cp);
               }          }
              n_misses ++;         n_misses ++;
            }       }
         }    }
        else if (c == '/')         else if (c == '/')
         { char d;    { char d;
           d = Get();      d = Get();
           if (d == '*')      if (d == '*')
            { d = '\0';       { d = '\0';
              if (keep_comments)         if (keep_comments)
               { maybe_print('/');          { maybe_print('/');
                 maybe_print('*');      maybe_print('*');
               }          }
              do         do
               { c = d;          { c = d;
                 d = Get();      d = Get();
                 if ((d == '\n') || keep_comments)      if ((d == '\n') || keep_comments)
                  { maybe_print(d);       { maybe_print(d);
                  }       }
               } while ((c != '*') || (d != '/'));          } while ((c != '*') || (d != '/'));
            }       }
           else      else
            { Push(d);       { Push(d);
              maybe_print(c);         maybe_print(c);
            }       }
         }    }
        else         else
         { maybe_print(c);    { maybe_print(c);
         }    }
      }       }
   }    }
 }  }
Line 3644  void do_pragma(void)
Line 3644  void do_pragma(void)
 }  }
   
 char *predefs[] = {  char *predefs[] = {
                     "mc68000",          "mc68000",
                     "unix",          "unix",
                     "NeXT",          "NeXT",
                     "__MACH__",          "__MACH__",
                     0          0
 };  };
   
 void do_set(void)  void do_set(void)
Line 3729  void do_sharp(void)
Line 3729  void do_sharp(void)
     if (strcmp(w,"") == 0)      if (strcmp(w,"") == 0)
      { c = Get();       { c = Get();
        if (c != '\n')         if (c != '\n')
         { Push(c);    { Push(c);
         }    }
        else         else
         { isnull = 1;    { isnull = 1;
         }    }
      }       }
     if (!isnull && !in_false_if())      if (!isnull && !in_false_if())
      { err_head();       { err_head();
Line 3766  void flush_sharp_line(void)
Line 3766  void flush_sharp_line(void)
      }       }
     if (comment)      if (comment)
      { if (c == '\\')       { if (c == '\\')
         { backslash = 1;    { backslash = 1;
         }    }
        else if ((c == '/') && (lastc == '*'))         else if ((c == '/') && (lastc == '*'))
         { comment = 0;    { comment = 0;
         }    }
        continue;         continue;
      }       }
     if (quote)      if (quote)
      { if (c == '\\')       { if (c == '\\')
         { backslash = 1;    { backslash = 1;
         }    }
        else if (c == quote)         else if (c == quote)
         { quote = 0;    { quote = 0;
         }    }
      }       }
     switch (c)      switch (c)
      { case '\\':       { case '\\':
           backslash = 1;      backslash = 1;
           continue;      continue;
           break;      break;
        case '"': case '\'':         case '"': case '\'':
           quote = c;      quote = c;
           continue;      continue;
           break;      break;
        case '*':         case '*':
           comment = (lastc == '/');      comment = (lastc == '/');
           continue;      continue;
           break;      break;
        default:         default:
           continue;      continue;
           break;      break;
        case '\n':         case '\n':
           break;      break;
      }       }
     break;      break;
   }    }
Line 3825  void save_stats(void)
Line 3825  void save_stats(void)
  f = fopen("/@larry/u1/mouse/Mouse-C/cpp.stats","a");   f = fopen("/@larry/u1/mouse/Mouse-C/cpp.stats","a");
  if (f)   if (f)
   { fprintf(f,"%d def, %d undef, %d hits, %d misses\n",    { fprintf(f,"%d def, %d undef, %d hits, %d misses\n",
                         n_defines,n_undefines,n_hits,n_misses);        n_defines,n_undefines,n_hits,n_misses);
     fclose(f);      fclose(f);
   }    }
 }  }
Line 4003  void undef_predefs(void)
Line 4003  void undef_predefs(void)
     while (*D)      while (*D)
      { d = *D;       { d = *D;
        if (d->how == DEF_PREDEF)         if (d->how == DEF_PREDEF)
         { free(d->name);    { free(d->name);
           free((char *)d->repl);      free((char *)d->repl);
           *D = d->link;      *D = d->link;
           OLD(d);      OLD(d);
           n_in_table --;      n_in_table --;
         }    }
        else         else
         { D = &d->link;    { D = &d->link;
         }    }
      }       }
   }    }
 }  }
   
 char *_unctrl[0400] = { "^@",  char *_unctrl[0400] = { "^@",
                         "^A",        "^A",
                         "^B",        "^B",
                         "^C",        "^C",
                         "^D",        "^D",
                         "^E",        "^E",
                         "^F",        "^F",
                         "^G",        "^G",
                         "^H",        "^H",
                         "^I",        "^I",
                         "^J",        "^J",
                         "^K",        "^K",
                         "^L",        "^L",
                         "^M",        "^M",
                         "^N",        "^N",
                         "^O",        "^O",
                         "^P",        "^P",
                         "^Q",        "^Q",
                         "^R",        "^R",
                         "^S",        "^S",
                         "^T",        "^T",
                         "^U",        "^U",
                         "^V",        "^V",
                         "^W",        "^W",
                         "^X",        "^X",
                         "^Y",        "^Y",
                         "^Z",        "^Z",
                         "^[",        "^[",
                         "^\\",        "^\\",
                         "^]",        "^]",
                         "^^",        "^^",
                         "^_",        "^_",
                         " ",        " ",
                         "!",        "!",
                         "\"",        "\"",
                         "#",        "#",
                         "$",        "$",
                         "%",        "%",
                         "&",        "&",
                         "'",        "'",
                         "(",        "(",
                         ")",        ")",
                         "*",        "*",
                         "+",        "+",
                         ",",        ",",
                         "-",        "-",
                         ".",        ".",
                         "/",        "/",
                         "0",        "0",
                         "1",        "1",
                         "2",        "2",
                         "3",        "3",
                         "4",        "4",
                         "5",        "5",
                         "6",        "6",
                         "7",        "7",
                         "8",        "8",
                         "9",        "9",
                         ":",        ":",
                         ";",        ";",
                         "<",        "<",
                         "=",        "=",
                         ">",        ">",
                         "?",        "?",
                         "@",        "@",
                         "A",        "A",
                         "B",        "B",
                         "C",        "C",
                         "D",        "D",
                         "E",        "E",
                         "F",        "F",
                         "G",        "G",
                         "H",        "H",
                         "I",        "I",
                         "J",        "J",
                         "K",        "K",
                         "L",        "L",
                         "M",        "M",
                         "N",        "N",
                         "O",        "O",
                         "P",        "P",
                         "Q",        "Q",
                         "R",        "R",
                         "S",        "S",
                         "T",        "T",
                         "U",        "U",
                         "V",        "V",
                         "W",        "W",
                         "X",        "X",
                         "Y",        "Y",
                         "Z",        "Z",
                         "[",        "[",
                         "\\",        "\\",
                         "]",        "]",
                         "^",        "^",
                         "_",        "_",
                         "`",        "`",
                         "a",        "a",
                         "b",        "b",
                         "c",        "c",
                         "d",        "d",
                         "e",        "e",
                         "f",        "f",
                         "g",        "g",
                         "h",        "h",
                         "i",        "i",
                         "j",        "j",
                         "k",        "k",
                         "l",        "l",
                         "m",        "m",
                         "n",        "n",
                         "o",        "o",
                         "p",        "p",
                         "q",        "q",
                         "r",        "r",
                         "s",        "s",
                         "t",        "t",
                         "u",        "u",
                         "v",        "v",
                         "w",        "w",
                         "x",        "x",
                         "y",        "y",
                         "z",        "z",
                         "{"/*}*/,        "{"/*}*/,
                         "|",        "|",
                         /*{*/"}",        /*{*/"}",
                         "~",        "~",
                         "^?",        "^?",
                         "|^@",        "|^@",
                         "|^A",        "|^A",
                         "|^B",        "|^B",
                         "|^C",        "|^C",
                         "|^D",        "|^D",
                         "|^E",        "|^E",
                         "|^F",        "|^F",
                         "|^G",        "|^G",
                         "|^H",        "|^H",
                         "|^I",        "|^I",
                         "|^J",        "|^J",
                         "|^K",        "|^K",
                         "|^L",        "|^L",
                         "|^M",        "|^M",
                         "|^N",        "|^N",
                         "|^O",        "|^O",
                         "|^P",        "|^P",
                         "|^Q",        "|^Q",
                         "|^R",        "|^R",
                         "|^S",        "|^S",
                         "|^T",        "|^T",
                         "|^U",        "|^U",
                         "|^V",        "|^V",
                         "|^W",        "|^W",
                         "|^X",        "|^X",
                         "|^Y",        "|^Y",
                         "|^Z",        "|^Z",
                         "|^[",        "|^[",
                         "|^\\",        "|^\\",
                         "|^]",        "|^]",
                         "|^^",        "|^^",
                         "|^_",        "|^_",
                         "| ",        "| ",
                         "|!",        "|!",
                         "|\"",        "|\"",
                         "|#",        "|#",
                         "|$",        "|$",
                         "|%",        "|%",
                         "|&",        "|&",
                         "|'",        "|'",
                         "|(",        "|(",
                         "|)",        "|)",
                         "|*",        "|*",
                         "|+",        "|+",
                         "|,",        "|,",
                         "|-",        "|-",
                         "|.",        "|.",
                         "|/",        "|/",
                         "|0",        "|0",
                         "|1",        "|1",
                         "|2",        "|2",
                         "|3",        "|3",
                         "|4",        "|4",
                         "|5",        "|5",
                         "|6",        "|6",
                         "|7",        "|7",
                         "|8",        "|8",
                         "|9",        "|9",
                         "|:",        "|:",
                         "|;",        "|;",
                         "|<",        "|<",
                         "|=",        "|=",
                         "|>",        "|>",
                         "|?",        "|?",
                         "|@",        "|@",
                         "|A",        "|A",
                         "|B",        "|B",
                         "|C",        "|C",
                         "|D",        "|D",
                         "|E",        "|E",
                         "|F",        "|F",
                         "|G",        "|G",
                         "|H",        "|H",
                         "|I",        "|I",
                         "|J",        "|J",
                         "|K",        "|K",
                         "|L",        "|L",
                         "|M",        "|M",
                         "|N",        "|N",
                         "|O",        "|O",
                         "|P",        "|P",
                         "|Q",        "|Q",
                         "|R",        "|R",
                         "|S",        "|S",
                         "|T",        "|T",
                         "|U",        "|U",
                         "|V",        "|V",
                         "|W",        "|W",
                         "|X",        "|X",
                         "|Y",        "|Y",
                         "|Z",        "|Z",
                         "|[",        "|[",
                         "|\\",        "|\\",
                         "|]",        "|]",
                         "|^",        "|^",
                         "|_",        "|_",
                         "|`",        "|`",
                         "|a",        "|a",
                         "|b",        "|b",
                         "|c",        "|c",
                         "|d",        "|d",
                         "|e",        "|e",
                         "|f",        "|f",
                         "|g",        "|g",
                         "|h",        "|h",
                         "|i",        "|i",
                         "|j",        "|j",
                         "|k",        "|k",
                         "|l",        "|l",
                         "|m",        "|m",
                         "|n",        "|n",
                         "|o",        "|o",
                         "|p",        "|p",
                         "|q",        "|q",
                         "|r",        "|r",
                         "|s",        "|s",
                         "|t",        "|t",
                         "|u",        "|u",
                         "|v",        "|v",
                         "|w",        "|w",
                         "|x",        "|x",
                         "|y",        "|y",
                         "|z",        "|z",
                         "|{"/*}*/,        "|{"/*}*/,
                         "||",        "||",
                         /*{*/"|}",        /*{*/"|}",
                         "|~",        "|~",
                         "|^?" };        "|^?" };
   
 char *_Unctrl[0400] = { "^@",  char *_Unctrl[0400] = { "^@",
                         "^A",        "^A",
                         "^B",        "^B",
                         "^C",        "^C",
                         "^D",        "^D",
                         "^E",        "^E",
                         "^F",        "^F",
                         "^G",        "^G",
                         "^H",        "^H",
                         "^I",        "^I",
                         "^J",        "^J",
                         "^K",        "^K",
                         "^L",        "^L",
                         "^M",        "^M",
                         "^N",        "^N",
                         "^O",        "^O",
                         "^P",        "^P",
                         "^Q",        "^Q",
                         "^R",        "^R",
                         "^S",        "^S",
                         "^T",        "^T",
                         "^U",        "^U",
                         "^V",        "^V",
                         "^W",        "^W",
                         "^X",        "^X",
                         "^Y",        "^Y",
                         "^Z",        "^Z",
                         "^[",        "^[",
                         "^\\",        "^\\",
                         "^]",        "^]",
                         "^^",        "^^",
                         "^_",        "^_",
                         "sp",        "sp",
                         "!",        "!",
                         "\"",        "\"",
                         "#",        "#",
                         "$",        "$",
                         "%",        "%",
                         "&",        "&",
                         "'",        "'",
                         "(",        "(",
                         ")",        ")",
                         "*",        "*",
                         "+",        "+",
                         ",",        ",",
                         "-",        "-",
                         ".",        ".",
                         "/",        "/",
                         "0",        "0",
                         "1",        "1",
                         "2",        "2",
                         "3",        "3",
                         "4",        "4",
                         "5",        "5",
                         "6",        "6",
                         "7",        "7",
                         "8",        "8",
                         "9",        "9",
                         ":",        ":",
                         ";",        ";",
                         "<",        "<",
                         "=",        "=",
                         ">",        ">",
                         "?",        "?",
                         "@",        "@",
                         "A",        "A",
                         "B",        "B",
                         "C",        "C",
                         "D",        "D",
                         "E",        "E",
                         "F",        "F",
                         "G",        "G",
                         "H",        "H",
                         "I",        "I",
                         "J",        "J",
                         "K",        "K",
                         "L",        "L",
                         "M",        "M",
                         "N",        "N",
                         "O",        "O",
                         "P",        "P",
                         "Q",        "Q",
                         "R",        "R",
                         "S",        "S",
                         "T",        "T",
                         "U",        "U",
                         "V",        "V",
                         "W",        "W",
                         "X",        "X",
                         "Y",        "Y",
                         "Z",        "Z",
                         "[",        "[",
                         "\\",        "\\",
                         "]",        "]",
                         "^",        "^",
                         "_",        "_",
                         "`",        "`",
                         "a",        "a",
                         "b",        "b",
                         "c",        "c",
                         "d",        "d",
                         "e",        "e",
                         "f",        "f",
                         "g",        "g",
                         "h",        "h",
                         "i",        "i",
                         "j",        "j",
                         "k",        "k",
                         "l",        "l",
                         "m",        "m",
                         "n",        "n",
                         "o",        "o",
                         "p",        "p",
                         "q",        "q",
                         "r",        "r",
                         "s",        "s",
                         "t",        "t",
                         "u",        "u",
                         "v",        "v",
                         "w",        "w",
                         "x",        "x",
                         "y",        "y",
                         "z",        "z",
                         "{"/*}*/,        "{"/*}*/,
                         "|",        "|",
                         /*{*/"}",        /*{*/"}",
                         "~",        "~",
                         "^?",        "^?",
                         "|^@",        "|^@",
                         "|^A",        "|^A",
                         "|^B",        "|^B",
                         "|^C",        "|^C",
                         "|^D",        "|^D",
                         "|^E",        "|^E",
                         "|^F",        "|^F",
                         "|^G",        "|^G",
                         "|^H",        "|^H",
                         "|^I",        "|^I",
                         "|^J",        "|^J",
                         "|^K",        "|^K",
                         "|^L",        "|^L",
                         "|^M",        "|^M",
                         "|^N",        "|^N",
                         "|^O",        "|^O",
                         "|^P",        "|^P",
                         "|^Q",        "|^Q",
                         "|^R",        "|^R",
                         "|^S",        "|^S",
                         "|^T",        "|^T",
                         "|^U",        "|^U",
                         "|^V",        "|^V",
                         "|^W",        "|^W",
                         "|^X",        "|^X",
                         "|^Y",        "|^Y",
                         "|^Z",        "|^Z",
                         "|^[",        "|^[",
                         "|^\\",        "|^\\",
                         "|^]",        "|^]",
                         "|^^",        "|^^",
                         "|^_",        "|^_",
                         "|sp",        "|sp",
                         "|!",        "|!",
                         "|\"",        "|\"",
                         "|#",        "|#",
                         "|$",        "|$",
                         "|%",        "|%",
                         "|&",        "|&",
                         "|'",        "|'",
                         "|(",        "|(",
                         "|)",        "|)",
                         "|*",        "|*",
                         "|+",        "|+",
                         "|,",        "|,",
                         "|-",        "|-",
                         "|.",        "|.",
                         "|/",        "|/",
                         "|0",        "|0",
                         "|1",        "|1",
                         "|2",        "|2",
                         "|3",        "|3",
                         "|4",        "|4",
                         "|5",        "|5",
                         "|6",        "|6",
                         "|7",        "|7",
                         "|8",        "|8",
                         "|9",        "|9",
                         "|:",        "|:",
                         "|;",        "|;",
                         "|<",        "|<",
                         "|=",        "|=",
                         "|>",        "|>",
                         "|?",        "|?",
                         "|@",        "|@",
                         "|A",        "|A",
                         "|B",        "|B",
                         "|C",        "|C",
                         "|D",        "|D",
                         "|E",        "|E",
                         "|F",        "|F",
                         "|G",        "|G",
                         "|H",        "|H",
                         "|I",        "|I",
                         "|J",        "|J",
                         "|K",        "|K",
                         "|L",        "|L",
                         "|M",        "|M",
                         "|N",        "|N",
                         "|O",        "|O",
                         "|P",        "|P",
                         "|Q",        "|Q",
                         "|R",        "|R",
                         "|S",        "|S",
                         "|T",        "|T",
                         "|U",        "|U",
                         "|V",        "|V",
                         "|W",        "|W",
                         "|X",        "|X",
                         "|Y",        "|Y",
                         "|Z",        "|Z",
                         "|[",        "|[",
                         "|\\",        "|\\",
                         "|]",        "|]",
                         "|^",        "|^",
                         "|_",        "|_",
                         "|`",        "|`",
                         "|a",        "|a",
                         "|b",        "|b",
                         "|c",        "|c",
                         "|d",        "|d",
                         "|e",        "|e",
                         "|f",        "|f",
                         "|g",        "|g",
                         "|h",        "|h",
                         "|i",        "|i",
                         "|j",        "|j",
                         "|k",        "|k",
                         "|l",        "|l",
                         "|m",        "|m",
                         "|n",        "|n",
                         "|o",        "|o",
                         "|p",        "|p",
                         "|q",        "|q",
                         "|r",        "|r",
                         "|s",        "|s",
                         "|t",        "|t",
                         "|u",        "|u",
                         "|v",        "|v",
                         "|w",        "|w",
                         "|x",        "|x",
                         "|y",        "|y",
                         "|z",        "|z",
                         "|{"/*}*/,        "|{"/*}*/,
                         "||",        "||",
                         /*{*/"|}",        /*{*/"|}",
                         "|~",        "|~",
                         "|^?" };        "|^?" };
   
 void do_undef(int expr_sharp)  void do_undef(int expr_sharp)
 {  {
Line 4542  void do_undef(int expr_sharp)
Line 4542  void do_undef(int expr_sharp)
      }       }
     else      else
      { if (undef(mac))       { if (undef(mac))
         { n_undefines ++;    { n_undefines ++;
         }    }
      }       }
   }    }
  if (sharp)   if (sharp)
Line 4588  void do_endwhile(void)
Line 4588  void do_endwhile(void)
   
 char *Index(char *s, int c)  char *Index(char *s, int c)
 {  {
         return strchr(s,c);    return strchr(s,c);
 }  }
   
 char *Rindex(char *s, int c)  char *Rindex(char *s, int c)
 {  {
         return strrchr(s,c);    return strrchr(s,c);
 }  }
   
 void Bcopy(char *from, char *to, int len)  void Bcopy(char *from, char *to, int len)
 {  {
 #if defined(GO32)  #if defined(GO32)
         bcopy(from,to,len);    bcopy(from,to,len);
 #else  #else
         memmove((void *)from,(void *)to,(int)len);    memmove((void *)from,(void *)to,(int)len);
 #endif  #endif
 }  }

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.8

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>