[BACK]Return to unifdef.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / unifdef

Diff for /src/usr.bin/unifdef/unifdef.c between version 1.2 and 1.3

version 1.2, 1996/06/26 05:42:10 version 1.3, 1998/11/16 21:58:29
Line 1 
Line 1 
 /*      $OpenBSD$       */  /*      $OpenBSD$       */
 /*      $NetBSD: unifdef.c,v 1.4 1994/12/20 01:44:07 jtc Exp $  */  /*      $NetBSD: unifdef.c,v 1.6 1998/10/08 01:31:59 wsanchez Exp $     */
   
 /*  /*
  * Copyright (c) 1985, 1993   * Copyright (c) 1985, 1993
Line 41 
Line 41 
 static char copyright[] =  static char copyright[] =
 "@(#) Copyright (c) 1985, 1993\n\  "@(#) Copyright (c) 1985, 1993\n\
         The Regents of the University of California.  All rights reserved.\n";          The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */  #endif                          /* not lint */
   
 #ifndef lint  #ifndef lint
 #if 0  #if 0
 static char sccsid[] = "@(#)unifdef.c   8.1 (Berkeley) 6/6/93";  static char sccsid[] = "@(#)unifdef.c   8.1 (Berkeley) 6/6/93";
 #endif  #endif
 static char rcsid[] = "$OpenBSD$";  static char rcsid[] = "$OpenBSD$";
 #endif /* not lint */  #endif                          /* not lint */
   
 /*  /*
  * unifdef - remove ifdef'ed lines   * unifdef - remove ifdef'ed lines
Line 67 
Line 67 
 #include <ctype.h>  #include <ctype.h>
   
 #define BSS  #define BSS
 FILE *input;  FILE   *input;
 #ifndef YES  #ifndef YES
 #define YES 1  #define YES 1
 #define NO  0  #define NO  0
 #endif/*YES */  #endif                          /* YES */
   #define C_COMMENT   1
   #define CXX_COMMENT 2
 typedef int Bool;  typedef int Bool;
   
 char *progname BSS;  char   *progname BSS;
 char *filename BSS;  char   *filename BSS;
 char text BSS;          /* -t option in effect: this is a text file */  char text BSS;                  /* -t option in effect: this is a text file */
 char lnblank BSS;       /* -l option in effect: blank deleted lines */  char lnblank BSS;               /* -l option in effect: blank deleted lines */
 char complement BSS;    /* -c option in effect: complement the operation */  char complement BSS;            /* -c option in effect: complement the
                                    * operation */
   
 #define MAXSYMS 100  #define MAXSYMS 100
 char *symname[MAXSYMS] BSS; /* symbol name */  char   *symname[MAXSYMS] BSS;   /* symbol name */
 char true[MAXSYMS] BSS;     /* -Dsym */  char    true[MAXSYMS] BSS;      /* -Dsym */
 char ignore[MAXSYMS] BSS;   /* -iDsym or -iUsym */  char    ignore[MAXSYMS] BSS;    /* -iDsym or -iUsym */
 char insym[MAXSYMS] BSS;    /* state: false, inactive, true */  char    insym[MAXSYMS] BSS;     /* state: false, inactive, true */
 #define SYM_INACTIVE 0      /* symbol is currently inactive */  #define SYM_INACTIVE 0          /* symbol is currently inactive */
 #define SYM_FALSE    1      /* symbol is currently false */  #define SYM_FALSE    1          /* symbol is currently false */
 #define SYM_TRUE     2      /* symbol is currently true  */  #define SYM_TRUE     2          /* symbol is currently true  */
   
 char nsyms BSS;  char nsyms BSS;
 char incomment BSS;         /* inside C comment */  char incomment BSS;             /* inside C comment */
   
 #define QUOTE_NONE   0  #define QUOTE_NONE   0
 #define QUOTE_SINGLE 1  #define QUOTE_SINGLE 1
 #define QUOTE_DOUBLE 2  #define QUOTE_DOUBLE 2
 char inquote BSS;           /* inside single or double quotes */  char inquote BSS;               /* inside single or double quotes */
 int exitstat BSS;  int exitstat BSS;
   
 int     error __P((int, int, int));  int error __P((int, int, int));
 int     findsym __P((char *));  int findsym __P((char *));
 void    flushline __P((Bool));  void flushline __P((Bool));
 int     getlin __P((char *, int, FILE *, int));  int getlin __P((char *, int, FILE *, int));
 void    pfile __P((void));  void pfile __P((void));
 void    prname __P((void));  void prname __P((void));
 char   *skipcomment __P((char *));  char   *skipcomment __P((char *));
 char   *skipquote __P((char *, int));  char   *skipquote __P((char *, int));
   
 int  int
 main (argc, argv)  main(argc, argv)
 int argc;          int     argc;
 char **argv;          char  **argv;
 {  {
     char **curarg;          char  **curarg;
     register char *cp;          char *cp;
     register char *cp1;          char *cp1;
     char ignorethis;          char    ignorethis;
   
     progname = argv[0][0] ? argv[0] : "unifdef";          progname = argv[0][0] ? argv[0] : "unifdef";
   
     for (curarg = &argv[1]; --argc > 0; curarg++) {          for (curarg = &argv[1]; --argc > 0; curarg++) {
         if (*(cp1 = cp = *curarg) != '-')                  if (*(cp1 = cp = *curarg) != '-')
             break;                          break;
         if (*++cp1 == 'i') {                  if (*++cp1 == 'i') {
             ignorethis = YES;                          ignorethis = YES;
             cp1++;                          cp1++;
         } else                  } else
             ignorethis = NO;                          ignorethis = NO;
         if (   (   *cp1 == 'D'                  if ((*cp1 == 'D'
                 || *cp1 == 'U'                          || *cp1 == 'U'
                )                      )
             && cp1[1] != '\0'                      && cp1[1] != '\0'
            ) {                      ) {
             register int symind;                          int symind;
   
             if ((symind = findsym (&cp1[1])) < 0) {                          if ((symind = findsym(&cp1[1])) < 0) {
                 if (nsyms >= MAXSYMS) {                                  if (nsyms >= MAXSYMS) {
                     prname ();                                          prname();
                     fprintf (stderr, "too many symbols.\n");                                          fprintf(stderr, "too many symbols.\n");
                     exit (2);                                          exit(2);
                 }                                  }
                 symind = nsyms++;                                  symind = nsyms++;
                 symname[symind] = &cp1[1];                                  symname[symind] = &cp1[1];
                 insym[symind] = SYM_INACTIVE;                                  insym[symind] = SYM_INACTIVE;
             }                          }
             ignore[symind] = ignorethis;                          ignore[symind] = ignorethis;
             true[symind] = *cp1 == 'D' ? YES : NO;                          true[symind] = *cp1 == 'D' ? YES : NO;
         } else if (ignorethis)                  } else
             goto unrec;                          if (ignorethis)
         else if (strcmp (&cp[1], "t") == 0)                                  goto unrec;
             text = YES;                          else
         else if (strcmp (&cp[1], "l") == 0)                                  if (strcmp(&cp[1], "t") == 0)
             lnblank = YES;                                          text = YES;
         else if (strcmp (&cp[1], "c") == 0)                                  else
             complement = YES;                                          if (strcmp(&cp[1], "l") == 0)
         else {                                                  lnblank = YES;
  unrec:                                          else
             prname ();                                                  if (strcmp(&cp[1], "c") == 0)
             fprintf (stderr, "unrecognized option: %s\n", cp);                                                          complement = YES;
             goto usage;                                                  else {
                                           unrec:
                                                           prname();
                                                           fprintf(stderr, "unrecognized option: %s\n", cp);
                                                           goto usage;
                                                   }
         }          }
     }          if (nsyms == 0) {
     if (nsyms == 0) {  usage:
  usage:                  fprintf(stderr, "\
         fprintf (stderr, "\  
 Usage: %s [-l] [-t] [-c] [[-Dsym] [-Usym] [-iDsym] [-iUsym]]... [file]\n\  Usage: %s [-l] [-t] [-c] [[-Dsym] [-Usym] [-iDsym] [-iUsym]]... [file]\n\
     At least one arg from [-D -U -iD -iU] is required\n", progname);      At least one arg from [-D -U -iD -iU] is required\n", progname);
         exit (2);                  exit(2);
     }  
   
     if (argc > 1) {  
         prname ();  
         fprintf (stderr, "can only do one file.\n");  
     } else if (argc == 1) {  
         filename = *curarg;  
         if ((input = fopen (filename, "r")) != NULL) {  
             pfile();  
             (void) fclose (input);  
         } else {  
             prname ();  
             fprintf (stderr, "can't open ");  
             perror(*curarg);  
         }          }
     } else {          if (argc > 1) {
         filename = "[stdin]";                  prname();
         input = stdin;                  fprintf(stderr, "can only do one file.\n");
         pfile();          } else
     }                  if (argc == 1) {
                           filename = *curarg;
                           if ((input = fopen(filename, "r")) != NULL) {
                                   pfile();
                                   (void) fclose(input);
                           } else {
                                   prname();
                                   fprintf(stderr, "can't open ");
                                   perror(*curarg);
                           }
                   } else {
                           filename = "[stdin]";
                           input = stdin;
                           pfile();
                   }
   
     (void) fflush (stdout);          (void) fflush(stdout);
     exit (exitstat);          exit(exitstat);
 }  }
   
 /* types of input lines: */  /* types of input lines: */
 typedef int Linetype;  typedef int Linetype;
 #define LT_PLAIN       0   /* ordinary line */  #define LT_PLAIN       0        /* ordinary line */
 #define LT_TRUE        1   /* a true  #ifdef of a symbol known to us */  #define LT_TRUE        1        /* a true  #ifdef of a symbol known to us */
 #define LT_FALSE       2   /* a false #ifdef of a symbol known to us */  #define LT_FALSE       2        /* a false #ifdef of a symbol known to us */
 #define LT_OTHER       3   /* an #ifdef of a symbol not known to us */  #define LT_OTHER       3        /* an #ifdef of a symbol not known to us */
 #define LT_IF          4   /* an #ifdef of a symbol not known to us */  #define LT_IF          4        /* an #ifdef of a symbol not known to us */
 #define LT_ELSE        5   /* #else */  #define LT_ELSE        5        /* #else */
 #define LT_ENDIF       6   /* #endif */  #define LT_ENDIF       6        /* #endif */
 #define LT_LEOF        7   /* end of file */  #define LT_LEOF        7        /* end of file */
 Linetype checkline __P((int *));  Linetype checkline __P((int *));
   
 typedef int Reject_level;  typedef int Reject_level;
 Reject_level reject BSS;    /* 0 or 1: pass thru; 1 or 2: ignore comments */  Reject_level reject BSS;        /* 0 or 1: pass thru; 1 or 2: ignore comments */
 #define REJ_NO          0  #define REJ_NO          0
 #define REJ_IGNORE      1  #define REJ_IGNORE      1
 #define REJ_YES         2  #define REJ_YES         2
 int doif __P((int, int, Reject_level, int));  int doif __P((int, int, Reject_level, int));
   
 int linenum BSS;    /* current line number */  int linenum BSS;                /* current line number */
 int stqcline BSS;   /* start of current coment or quote */  int stqcline BSS;               /* start of current coment or quote */
 char *errs[] = {  char   *errs[] = {
 #define NO_ERR      0  #define NO_ERR      0
                         "",          "",
 #define END_ERR     1  #define END_ERR     1
                         "",          "",
 #define ELSE_ERR    2  #define ELSE_ERR    2
                         "Inappropriate else",          "Inappropriate else",
 #define ENDIF_ERR   3  #define ENDIF_ERR   3
                         "Inappropriate endif",          "Inappropriate endif",
 #define IEOF_ERR    4  #define IEOF_ERR    4
                         "Premature EOF in ifdef",          "Premature EOF in ifdef",
 #define CEOF_ERR    5  #define CEOF_ERR    5
                         "Premature EOF in comment",          "Premature EOF in comment",
 #define Q1EOF_ERR   6  #define Q1EOF_ERR   6
                         "Premature EOF in quoted character",          "Premature EOF in quoted character",
 #define Q2EOF_ERR   7  #define Q2EOF_ERR   7
                         "Premature EOF in quoted string"          "Premature EOF in quoted string"
 };  };
   
 /* States for inif arg to doif */  /* States for inif arg to doif */
 #define IN_NONE 0  #define IN_NONE 0
 #define IN_IF   1  #define IN_IF   1
 #define IN_ELSE 2  #define IN_ELSE 2
   
 void  void
 pfile ()  pfile()
 {  {
     reject = REJ_NO;          reject = REJ_NO;
     (void) doif (-1, IN_NONE, reject, 0);          (void) doif(-1, IN_NONE, reject, 0);
     return;          return;
 }  }
   
 int  int
 doif (thissym, inif, prevreject, depth)  doif(thissym, inif, prevreject, depth)
 register int thissym;   /* index of the symbol who was last ifdef'ed */          int thissym;    /* index of the symbol who was last ifdef'ed */
 int inif;               /* YES or NO we are inside an ifdef */          int     inif;           /* YES or NO we are inside an ifdef */
 Reject_level prevreject;/* previous value of reject */          Reject_level prevreject;/* previous value of reject */
 int depth;              /* depth of ifdef's */          int     depth;          /* depth of ifdef's */
 {  {
     register Linetype lineval;          Linetype lineval;
     register Reject_level thisreject;          Reject_level thisreject;
     int doret;          /* tmp return value of doif */          int     doret;          /* tmp return value of doif */
     int cursym;         /* index of the symbol returned by checkline */          int     cursym;         /* index of the symbol returned by checkline */
     int stline;         /* line number when called this time */          int     stline;         /* line number when called this time */
   
     stline = linenum;          stline = linenum;
     for (;;) {          for (;;) {
         switch (lineval = checkline (&cursym)) {                  switch (lineval = checkline(&cursym)) {
         case LT_PLAIN:                  case LT_PLAIN:
             flushline (YES);                          flushline(YES);
             break;                          break;
   
         case LT_TRUE:                  case LT_TRUE:
         case LT_FALSE:                  case LT_FALSE:
             thisreject = reject;                          thisreject = reject;
             if (lineval == LT_TRUE)                          if (lineval == LT_TRUE)
                 insym[cursym] = SYM_TRUE;                                  insym[cursym] = SYM_TRUE;
             else {                          else {
                 if (reject != REJ_YES)                                  if (reject != REJ_YES)
                     reject = ignore[cursym] ? REJ_IGNORE : REJ_YES;                                          reject = ignore[cursym] ? REJ_IGNORE : REJ_YES;
                 insym[cursym] = SYM_FALSE;                                  insym[cursym] = SYM_FALSE;
             }                          }
             if (ignore[cursym])                          if (ignore[cursym])
                 flushline (YES);                                  flushline(YES);
             else {                          else {
                 exitstat = 1;                                  exitstat = 1;
                 flushline (NO);                                  flushline(NO);
             }                          }
             if ((doret = doif (cursym, IN_IF, thisreject, depth + 1)) != NO_ERR)                          if ((doret = doif(cursym, IN_IF, thisreject, depth + 1)) != NO_ERR)
                 return error (doret, stline, depth);                                  return error(doret, stline, depth);
             break;                          break;
   
         case LT_IF:                  case LT_IF:
         case LT_OTHER:                  case LT_OTHER:
             flushline (YES);                          flushline(YES);
             if ((doret = doif (-1, IN_IF, reject, depth + 1)) != NO_ERR)                          if ((doret = doif(-1, IN_IF, reject, depth + 1)) != NO_ERR)
                 return error (doret, stline, depth);                                  return error(doret, stline, depth);
             break;                          break;
   
         case LT_ELSE:                  case LT_ELSE:
             if (inif != IN_IF)                          if (inif != IN_IF)
                 return error (ELSE_ERR, linenum, depth);                                  return error(ELSE_ERR, linenum, depth);
             inif = IN_ELSE;                          inif = IN_ELSE;
             if (thissym >= 0) {                          if (thissym >= 0) {
                 if (insym[thissym] == SYM_TRUE) {                                  if (insym[thissym] == SYM_TRUE) {
                     reject = ignore[thissym] ? REJ_IGNORE : REJ_YES;                                          reject = ignore[thissym] ? REJ_IGNORE : REJ_YES;
                     insym[thissym] = SYM_FALSE;                                          insym[thissym] = SYM_FALSE;
                 } else { /* (insym[thissym] == SYM_FALSE) */                                  } else {        /* (insym[thissym] ==
                     reject = prevreject;                                                   * SYM_FALSE) */
                     insym[thissym] = SYM_TRUE;                                          reject = prevreject;
                 }                                          insym[thissym] = SYM_TRUE;
                 if (!ignore[thissym]) {                                  }
                     flushline (NO);                                  if (!ignore[thissym]) {
                     break;                                          flushline(NO);
                 }                                          break;
             }                                  }
             flushline (YES);                          }
             break;                          flushline(YES);
                           break;
   
         case LT_ENDIF:                  case LT_ENDIF:
             if (inif == IN_NONE)                          if (inif == IN_NONE)
                 return error (ENDIF_ERR, linenum, depth);                                  return error(ENDIF_ERR, linenum, depth);
             if (thissym >= 0) {                          if (thissym >= 0) {
                 insym[thissym] = SYM_INACTIVE;                                  insym[thissym] = SYM_INACTIVE;
                 reject = prevreject;                                  reject = prevreject;
                 if (!ignore[thissym]) {                                  if (!ignore[thissym]) {
                     flushline (NO);                                          flushline(NO);
                     return NO_ERR;                                          return NO_ERR;
                 }                                  }
             }                          }
             flushline (YES);                          flushline(YES);
             return NO_ERR;                          return NO_ERR;
   
         case LT_LEOF: {                  case LT_LEOF:{
             int err;                                  int     err;
             err =   incomment                                  err = incomment
                   ? CEOF_ERR                                      ? CEOF_ERR
                   : inquote == QUOTE_SINGLE                                      : inquote == QUOTE_SINGLE
                   ? Q1EOF_ERR                                      ? Q1EOF_ERR
                   : inquote == QUOTE_DOUBLE                                      : inquote == QUOTE_DOUBLE
                   ? Q2EOF_ERR                                      ? Q2EOF_ERR
                   : NO_ERR;                                      : NO_ERR;
             if (inif != IN_NONE) {                                  if (inif != IN_NONE) {
                 if (err != NO_ERR)                                          if (err != NO_ERR)
                     (void) error (err, stqcline, depth);                                                  (void) error(err, stqcline, depth);
                 return error (IEOF_ERR, stline, depth);                                          return error(IEOF_ERR, stline, depth);
             } else if (err != NO_ERR)                                  } else
                 return error (err, stqcline, depth);                                          if (err != NO_ERR)
             else                                                  return error(err, stqcline, depth);
                 return NO_ERR;                                          else
             }                                                  return NO_ERR;
                           }
                   }
         }          }
     }  
 }  }
   
 #define endsym(c) (!isalpha (c) && !isdigit (c) && c != '_')  #define endsym(c) (!isalpha (c) && !isdigit (c) && c != '_')
   
 #define MAXLINE 256  #define MAXLINE 256
 char tline[MAXLINE] BSS;  char    tline[MAXLINE] BSS;
   
 Linetype  Linetype
 checkline (cursym)  checkline(cursym)
 int *cursym;    /* if LT_TRUE or LT_FALSE returned, set this to sym index */          int    *cursym;         /* if LT_TRUE or LT_FALSE returned, set this
                                    * to sym index */
 {  {
     register char *cp;          char *cp;
     register char *symp;          char *symp;
     char *scp;          char   *scp;
     Linetype retval;          Linetype retval;
 #   define KWSIZE 8  #define KWSIZE 8
     char keyword[KWSIZE];          char    keyword[KWSIZE];
   
     linenum++;          linenum++;
     if (getlin (tline, sizeof tline, input, NO) == EOF)          if (getlin(tline, sizeof tline, input, NO) == EOF)
         return LT_LEOF;                  return LT_LEOF;
   
     retval = LT_PLAIN;          retval = LT_PLAIN;
     if (   *(cp = tline) != '#'          if (*(cp = tline) != '#'
         || incomment              || incomment
         || inquote == QUOTE_SINGLE              || inquote == QUOTE_SINGLE
         || inquote == QUOTE_DOUBLE              || inquote == QUOTE_DOUBLE
        )              )
         goto eol;                  goto eol;
   
     cp = skipcomment (++cp);          cp = skipcomment(++cp);
     symp = keyword;          symp = keyword;
     while (!endsym (*cp)) {          while (!endsym(*cp)) {
         *symp = *cp++;                  *symp = *cp++;
         if (++symp >= &keyword[KWSIZE])                  if (++symp >= &keyword[KWSIZE])
             goto eol;                          goto eol;
     }  
     *symp = '\0';  
   
     if (strcmp (keyword, "ifdef") == 0) {  
         retval = YES;  
         goto ifdef;  
     } else if (strcmp (keyword, "ifndef") == 0) {  
         retval = NO;  
  ifdef:  
         scp = cp = skipcomment (++cp);  
         if (incomment) {  
             retval = LT_PLAIN;  
             goto eol;  
         }          }
         {          *symp = '\0';
             int symind;  
   
             if ((symind = findsym (scp)) >= 0)          if (strcmp(keyword, "ifdef") == 0) {
                 retval = (retval ^ true[*cursym = symind])                  retval = YES;
                          ? LT_FALSE : LT_TRUE;                  goto ifdef;
             else          } else
                 retval = LT_OTHER;                  if (strcmp(keyword, "ifndef") == 0) {
         }                          retval = NO;
     } else if (strcmp (keyword, "if") == 0)          ifdef:
         retval = LT_IF;                          scp = cp = skipcomment(++cp);
     else if (strcmp (keyword, "else") == 0)                          if (incomment) {
         retval = LT_ELSE;                                  retval = LT_PLAIN;
     else if (strcmp (keyword, "endif") == 0)                                  goto eol;
         retval = LT_ENDIF;                          } {
                                   int     symind;
   
  eol:                                  if ((symind = findsym(scp)) >= 0)
     if (!text && reject != REJ_IGNORE)                                          retval = (retval ^ true[*cursym = symind])
         for (; *cp; ) {                                              ? LT_FALSE : LT_TRUE;
             if (incomment)                                  else
                 cp = skipcomment (cp);                                          retval = LT_OTHER;
             else if (inquote == QUOTE_SINGLE)                          }
                 cp = skipquote (cp, QUOTE_SINGLE);                  } else
             else if (inquote == QUOTE_DOUBLE)                          if (strcmp(keyword, "if") == 0)
                 cp = skipquote (cp, QUOTE_DOUBLE);                                  retval = LT_IF;
             else if (*cp == '/' && cp[1] == '*')                          else
                 cp = skipcomment (cp);                                  if (strcmp(keyword, "else") == 0)
             else if (*cp == '\'')                                          retval = LT_ELSE;
                 cp = skipquote (cp, QUOTE_SINGLE);                                  else
             else if (*cp == '"')                                          if (strcmp(keyword, "endif") == 0)
                 cp = skipquote (cp, QUOTE_DOUBLE);                                                  retval = LT_ENDIF;
             else  
                 cp++;  
         }  
     return retval;  
 }  
   
   eol:
           if (!text && reject != REJ_IGNORE)
                   for (; *cp;) {
                           if (incomment)
                                   cp = skipcomment(cp);
                           else
                                   if (inquote == QUOTE_SINGLE)
                                           cp = skipquote(cp, QUOTE_SINGLE);
                                   else
                                           if (inquote == QUOTE_DOUBLE)
                                                   cp = skipquote(cp, QUOTE_DOUBLE);
                                           else
                                                   if (*cp == '/' && (cp[1] == '*' || cp[1] == '/'))
                                                           cp = skipcomment(cp);
                                                   else
                                                           if (*cp == '\'')
                                                                   cp = skipquote(cp, QUOTE_SINGLE);
                                                           else
                                                                   if (*cp == '"')
                                                                           cp = skipquote(cp, QUOTE_DOUBLE);
                                                                   else
                                                                           cp++;
                   }
           return retval;
   }
 /*  /*
  *  Skip over comments and stop at the next charaacter   *  Skip over comments and stop at the next charaacter
  *  position that is not whitespace.   *  position that is not whitespace.
  */   */
 char *  char   *
 skipcomment (cp)  skipcomment(cp)
 register char *cp;          char *cp;
 {  {
     if (incomment)          if (incomment)
         goto inside;                  goto inside;
     for (;; cp++) {          for (;; cp++) {
         while (*cp == ' ' || *cp == '\t')                  while (*cp == ' ' || *cp == '\t')
             cp++;                          cp++;
         if (text)                  if (text)
             return cp;                          return cp;
         if (   cp[0] != '/'                  if (cp[0] != '/')
             || cp[1] != '*'                          return cp;
            )  
             return cp;                  if (cp[1] == '*') {
         cp += 2;                          if (!incomment) {
         if (!incomment) {                                  incomment = C_COMMENT;
             incomment = YES;                                  stqcline = linenum;
             stqcline = linenum;                          }
                   } else if (cp[1] == '/') {
                           if (!incomment) {
                                   incomment = CXX_COMMENT;
                                   stqcline = linenum;
                           }
                   } else
                           return cp;
   
                   cp += 2;
   inside:
                   if (incomment == C_COMMENT) {
                           for (;;) {
                                   for (; *cp != '*'; cp++)
                                           if (*cp == '\0')
                                                   return cp;
                                   if (*++cp == '/') {
                                           incomment = NO;
                                           break;
                                   }
                           }
                   }
                   else if (incomment == CXX_COMMENT) {
                           for (; *cp != '\n'; cp++)
                                   if (*cp == '\0')
                                           return cp;
                           incomment = NO;
                   }
         }          }
  inside:  
         for (;;) {  
             for (; *cp != '*'; cp++)  
                 if (*cp == '\0')  
                     return cp;  
             if (*++cp == '/') {  
                 incomment = NO;  
                 break;  
             }  
         }  
     }  
 }  }
   
 /*  /*
  *  Skip over a quoted string or character and stop at the next charaacter   *  Skip over a quoted string or character and stop at the next charaacter
  *  position that is not whitespace.   *  position that is not whitespace.
  */   */
 char *  char   *
 skipquote (cp, type)  skipquote(cp, type)
 register char *cp;          char *cp;
 register int type;          int type;
 {  {
     register char qchar;          char qchar;
   
     qchar = type == QUOTE_SINGLE ? '\'' : '"';          qchar = type == QUOTE_SINGLE ? '\'' : '"';
   
     if (inquote == type)          if (inquote == type)
         goto inside;                  goto inside;
     for (;; cp++) {          for (;; cp++) {
         if (*cp != qchar)                  if (*cp != qchar)
             return cp;                          return cp;
         cp++;                  cp++;
         inquote = type;                  inquote = type;
         stqcline = linenum;                  stqcline = linenum;
  inside:  inside:
         for (; ; cp++) {                  for (;; cp++) {
             if (*cp == qchar)                          if (*cp == qchar)
                 break;                                  break;
             if (   *cp == '\0'                          if (*cp == '\0' || (*cp == '\\' && *++cp == '\0'))
                 || *cp == '\\' && *++cp == '\0'                                  return cp;
                )                  }
                 return cp;                  inquote = QUOTE_NONE;
         }          }
         inquote = QUOTE_NONE;  
     }  
 }  }
   
 /*  /*
  *  findsym - look for the symbol in the symbol table.   *  findsym - look for the symbol in the symbol table.
  *            if found, return symbol table index,   *            if found, return symbol table index,
  *            else return -1.   *            else return -1.
  */   */
 int  int
 findsym (str)  findsym(str)
 char *str;          char   *str;
 {  {
     register char *cp;          char *cp;
     register char *symp;          char *symp;
     register int symind;          int symind;
     register char chr;          char chr;
   
     for (symind = 0; symind < nsyms; ++symind) {          for (symind = 0; symind < nsyms; ++symind) {
         if (insym[symind] == SYM_INACTIVE) {                  if (insym[symind] == SYM_INACTIVE) {
             for ( symp = symname[symind], cp = str                          for (symp = symname[symind], cp = str
                 ; *symp && *cp == *symp                              ; *symp && *cp == *symp
                 ; cp++, symp++                              ; cp++, symp++
                 )                              )
                 continue;                                  continue;
             chr = *cp;                          chr = *cp;
             if (*symp == '\0' && endsym (chr))                          if (*symp == '\0' && endsym(chr))
                 return symind;                                  return symind;
                   }
         }          }
     }          return -1;
     return -1;  
 }  }
   
 /*  /*
  *   getlin - expands tabs if asked for   *   getlin - expands tabs if asked for
  *            and (if compiled in) treats form-feed as an end-of-line   *            and (if compiled in) treats form-feed as an end-of-line
  */   */
 int  int
 getlin (line, maxline, inp, expandtabs)  getlin(line, maxline, inp, expandtabs)
 register char *line;          char *line;
 int maxline;          int     maxline;
 FILE *inp;          FILE   *inp;
 int expandtabs;          int     expandtabs;
 {  {
     int tmp;          int     tmp;
     register int num;          int num;
     register int chr;          int chr;
 #ifdef  FFSPECIAL  #ifdef  FFSPECIAL
     static char havechar = NO;  /* have leftover char from last time */          static char havechar = NO;      /* have leftover char from last time */
     static char svchar BSS;          static char svchar BSS;
 #endif/*FFSPECIAL */  #endif                          /* FFSPECIAL */
   
     num = 0;          num = 0;
 #ifdef  FFSPECIAL  #ifdef  FFSPECIAL
     if (havechar) {          if (havechar) {
         havechar = NO;                  havechar = NO;
         chr = svchar;                  chr = svchar;
         goto ent;                  goto ent;
     }          }
 #endif/*FFSPECIAL */  #endif                          /* FFSPECIAL */
     while (num + 8 < maxline) {   /* leave room for tab */          while (num + 8 < maxline) {     /* leave room for tab */
         chr = getc (inp);                  chr = getc(inp);
         if (isprint (chr)) {                  if (isprint(chr)) {
 #ifdef  FFSPECIAL  #ifdef  FFSPECIAL
  ent:          ent:
 #endif/*FFSPECIAL */  #endif                          /* FFSPECIAL */
             *line++ = chr;                          *line++ = chr;
             num++;                          num++;
         } else                  } else
             switch (chr) {                          switch (chr) {
             case EOF:                          case EOF:
                 return EOF;                                  return EOF;
   
             case '\t':                          case '\t':
                 if (expandtabs) {                                  if (expandtabs) {
                     num += tmp = 8 - (num & 7);                                          num += tmp = 8 - (num & 7);
                     do                                          do
                         *line++ = ' ';                                                  *line++ = ' ';
                     while (--tmp);                                          while (--tmp);
                     break;                                          break;
                 }                                  }
             default:                          default:
                 *line++ = chr;                                  *line++ = chr;
                 num++;                                  num++;
                 break;                                  break;
   
             case '\n':                          case '\n':
                 *line = '\n';                                  *line = '\n';
                 num++;                                  num++;
                 goto end;                                  goto end;
   
 #ifdef  FFSPECIAL  #ifdef  FFSPECIAL
             case '\f':                          case '\f':
                 if (++num == 1)                                  if (++num == 1)
                     *line = '\f';                                          *line = '\f';
                 else {                                  else {
                     *line = '\n';                                          *line = '\n';
                     havechar = YES;                                          havechar = YES;
                     svchar = chr;                                          svchar = chr;
                 }                                  }
                 goto end;                                  goto end;
 #endif/*FFSPECIAL */  #endif                          /* FFSPECIAL */
             }                          }
     }          }
  end:  end:
     *++line = '\0';          *++line = '\0';
     return num;          return num;
 }  }
   
 void  void
 flushline (keep)  flushline(keep)
 Bool keep;          Bool    keep;
 {  {
     if ((keep && reject != REJ_YES) ^ complement) {          if ((keep && reject != REJ_YES) ^ complement) {
         register char *line = tline;                  char *line = tline;
         register FILE *out = stdout;                  FILE *out = stdout;
         register char chr;                  char chr;
   
         while (chr = *line++)                  while ((chr = *line++))
             putc (chr, out);                          putc(chr, out);
     } else if (lnblank)          } else
         putc ('\n', stdout);                  if (lnblank)
     return;                          putc('\n', stdout);
           return;
 }  }
   
 void  void
 prname ()  prname()
 {  {
     fprintf (stderr, "%s: ", progname);          fprintf(stderr, "%s: ", progname);
     return;          return;
 }  }
   
 int  int
 error (err, line, depth)  error(err, line, depth)
 int err;        /* type of error & index into error string array */          int     err;            /* type of error & index into error string
 int line;       /* line number */                                   * array */
 int depth;      /* how many ifdefs we are inside */          int     line;           /* line number */
           int     depth;          /* how many ifdefs we are inside */
 {  {
     if (err == END_ERR)          if (err == END_ERR)
         return err;                  return err;
   
     prname ();          prname();
   
 #ifndef TESTING  #ifndef TESTING
     fprintf (stderr, "Error in %s line %d: %s.\n", filename, line, errs[err]);          fprintf(stderr, "Error in %s line %d: %s.\n", filename, line, errs[err]);
 #else/* TESTING */  #else                           /* TESTING */
     fprintf (stderr, "Error in %s line %d: %s. ", filename, line, errs[err]);          fprintf(stderr, "Error in %s line %d: %s. ", filename, line, errs[err]);
     fprintf (stderr, "ifdef depth: %d\n", depth);          fprintf(stderr, "ifdef depth: %d\n", depth);
 #endif/*TESTING */  #endif                          /* TESTING */
   
     exitstat = 2;          exitstat = 2;
     return depth > 1 ? IEOF_ERR : END_ERR;          return depth > 1 ? IEOF_ERR : END_ERR;
 }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3