version 1.2, 1996/06/26 05:42:10 |
version 1.3, 1998/11/16 21:58:29 |
|
|
/* $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 |
|
|
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 |
|
|
#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; |
} |
} |