diff options
Diffstat (limited to 'usr.bin/unifdef/unifdef.c')
-rw-r--r-- | usr.bin/unifdef/unifdef.c | 638 |
1 files changed, 0 insertions, 638 deletions
diff --git a/usr.bin/unifdef/unifdef.c b/usr.bin/unifdef/unifdef.c deleted file mode 100644 index 0fe80fc..0000000 --- a/usr.bin/unifdef/unifdef.c +++ /dev/null @@ -1,638 +0,0 @@ -/* - * Copyright (c) 1985, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Dave Yost. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1985, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)unifdef.c 8.1 (Berkeley) 6/6/93"; -#endif /* not lint */ - -/* - * unifdef - remove ifdef'ed lines - * - * Warning: will not work correctly if input contains null characters. - * - * Wishlist: - * provide an option which will append the name of the - * appropriate symbol after #else's and #endif's - * provide an option which will check symbols after - * #else's and #endif's to see that they match their - * corresponding #ifdef or #ifndef - */ - -#include <stdio.h> -#include <ctype.h> - -#define BSS -FILE *input; -#ifndef YES -#define YES 1 -#define NO 0 -#endif/*YES */ -typedef int Bool; - -char *progname BSS; -char *filename BSS; -char text BSS; /* -t option in effect: this is a text file */ -char lnblank BSS; /* -l option in effect: blank deleted lines */ -char complement BSS; /* -c option in effect: complement the operation */ - -#define MAXSYMS 100 -char *symname[MAXSYMS] BSS; /* symbol name */ -char true[MAXSYMS] BSS; /* -Dsym */ -char ignore[MAXSYMS] BSS; /* -iDsym or -iUsym */ -char insym[MAXSYMS] BSS; /* state: false, inactive, true */ -#define SYM_INACTIVE 0 /* symbol is currently inactive */ -#define SYM_FALSE 1 /* symbol is currently false */ -#define SYM_TRUE 2 /* symbol is currently true */ - -char nsyms BSS; -char incomment BSS; /* inside C comment */ - -#define QUOTE_NONE 0 -#define QUOTE_SINGLE 1 -#define QUOTE_DOUBLE 2 -char inquote BSS; /* inside single or double quotes */ - -int exitstat BSS; -char *skipcomment (); -char *skipquote (); - -main (argc, argv) -int argc; -char **argv; -{ - char **curarg; - register char *cp; - register char *cp1; - char ignorethis; - - progname = argv[0][0] ? argv[0] : "unifdef"; - - for (curarg = &argv[1]; --argc > 0; curarg++) { - if (*(cp1 = cp = *curarg) != '-') - break; - if (*++cp1 == 'i') { - ignorethis = YES; - cp1++; - } else - ignorethis = NO; - if ( ( *cp1 == 'D' - || *cp1 == 'U' - ) - && cp1[1] != '\0' - ) { - register int symind; - - if ((symind = findsym (&cp1[1])) < 0) { - if (nsyms >= MAXSYMS) { - prname (); - fprintf (stderr, "too many symbols.\n"); - exit (2); - } - symind = nsyms++; - symname[symind] = &cp1[1]; - insym[symind] = SYM_INACTIVE; - } - ignore[symind] = ignorethis; - true[symind] = *cp1 == 'D' ? YES : NO; - } else if (ignorethis) - goto unrec; - else if (strcmp (&cp[1], "t") == 0) - text = YES; - else if (strcmp (&cp[1], "l") == 0) - lnblank = YES; - else if (strcmp (&cp[1], "c") == 0) - complement = YES; - else { - unrec: - prname (); - fprintf (stderr, "unrecognized option: %s\n", cp); - goto usage; - } - } - if (nsyms == 0) { - usage: - fprintf (stderr, "\ -Usage: %s [-l] [-t] [-c] [[-Dsym] [-Usym] [-iDsym] [-iUsym]]... [file]\n\ - At least one arg from [-D -U -iD -iU] is required\n", progname); - 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 { - filename = "[stdin]"; - input = stdin; - pfile(); - } - - (void) fflush (stdout); - exit (exitstat); -} - -/* types of input lines: */ -typedef int Linetype; -#define LT_PLAIN 0 /* ordinary line */ -#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_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_ELSE 5 /* #else */ -#define LT_ENDIF 6 /* #endif */ -#define LT_LEOF 7 /* end of file */ -extern Linetype checkline (); - -typedef int Reject_level; -Reject_level reject BSS; /* 0 or 1: pass thru; 1 or 2: ignore comments */ -#define REJ_NO 0 -#define REJ_IGNORE 1 -#define REJ_YES 2 - -int linenum BSS; /* current line number */ -int stqcline BSS; /* start of current coment or quote */ -char *errs[] = { -#define NO_ERR 0 - "", -#define END_ERR 1 - "", -#define ELSE_ERR 2 - "Inappropriate else", -#define ENDIF_ERR 3 - "Inappropriate endif", -#define IEOF_ERR 4 - "Premature EOF in ifdef", -#define CEOF_ERR 5 - "Premature EOF in comment", -#define Q1EOF_ERR 6 - "Premature EOF in quoted character", -#define Q2EOF_ERR 7 - "Premature EOF in quoted string" -}; - -/* States for inif arg to doif */ -#define IN_NONE 0 -#define IN_IF 1 -#define IN_ELSE 2 - -pfile () -{ - reject = REJ_NO; - (void) doif (-1, IN_NONE, reject, 0); - return; -} - -int -doif (thissym, inif, prevreject, depth) -register int thissym; /* index of the symbol who was last ifdef'ed */ -int inif; /* YES or NO we are inside an ifdef */ -Reject_level prevreject;/* previous value of reject */ -int depth; /* depth of ifdef's */ -{ - register Linetype lineval; - register Reject_level thisreject; - int doret; /* tmp return value of doif */ - int cursym; /* index of the symbol returned by checkline */ - int stline; /* line number when called this time */ - - stline = linenum; - for (;;) { - switch (lineval = checkline (&cursym)) { - case LT_PLAIN: - flushline (YES); - break; - - case LT_TRUE: - case LT_FALSE: - thisreject = reject; - if (lineval == LT_TRUE) - insym[cursym] = SYM_TRUE; - else { - if (reject != REJ_YES) - reject = ignore[cursym] ? REJ_IGNORE : REJ_YES; - insym[cursym] = SYM_FALSE; - } - if (ignore[cursym]) - flushline (YES); - else { - exitstat = 1; - flushline (NO); - } - if ((doret = doif (cursym, IN_IF, thisreject, depth + 1)) != NO_ERR) - return error (doret, stline, depth); - break; - - case LT_IF: - case LT_OTHER: - flushline (YES); - if ((doret = doif (-1, IN_IF, reject, depth + 1)) != NO_ERR) - return error (doret, stline, depth); - break; - - case LT_ELSE: - if (inif != IN_IF) - return error (ELSE_ERR, linenum, depth); - inif = IN_ELSE; - if (thissym >= 0) { - if (insym[thissym] == SYM_TRUE) { - reject = ignore[thissym] ? REJ_IGNORE : REJ_YES; - insym[thissym] = SYM_FALSE; - } else { /* (insym[thissym] == SYM_FALSE) */ - reject = prevreject; - insym[thissym] = SYM_TRUE; - } - if (!ignore[thissym]) { - flushline (NO); - break; - } - } - flushline (YES); - break; - - case LT_ENDIF: - if (inif == IN_NONE) - return error (ENDIF_ERR, linenum, depth); - if (thissym >= 0) { - insym[thissym] = SYM_INACTIVE; - reject = prevreject; - if (!ignore[thissym]) { - flushline (NO); - return NO_ERR; - } - } - flushline (YES); - return NO_ERR; - - case LT_LEOF: { - int err; - err = incomment - ? CEOF_ERR - : inquote == QUOTE_SINGLE - ? Q1EOF_ERR - : inquote == QUOTE_DOUBLE - ? Q2EOF_ERR - : NO_ERR; - if (inif != IN_NONE) { - if (err != NO_ERR) - (void) error (err, stqcline, depth); - return error (IEOF_ERR, stline, depth); - } else if (err != NO_ERR) - return error (err, stqcline, depth); - else - return NO_ERR; - } - } - } -} - -#define endsym(c) (!isalpha (c) && !isdigit (c) && c != '_') - -#define MAXLINE 256 -char tline[MAXLINE] BSS; - -Linetype -checkline (cursym) -int *cursym; /* if LT_TRUE or LT_FALSE returned, set this to sym index */ -{ - register char *cp; - register char *symp; - char *scp; - Linetype retval; -# define KWSIZE 8 - char keyword[KWSIZE]; - - linenum++; - if (getlin (tline, sizeof tline, input, NO) == EOF) - return LT_LEOF; - - retval = LT_PLAIN; - if ( *(cp = tline) != '#' - || incomment - || inquote == QUOTE_SINGLE - || inquote == QUOTE_DOUBLE - ) - goto eol; - - cp = skipcomment (++cp); - symp = keyword; - while (!endsym (*cp)) { - *symp = *cp++; - if (++symp >= &keyword[KWSIZE]) - 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; - } - { - int symind; - - if ((symind = findsym (scp)) >= 0) - retval = (retval ^ true[*cursym = symind]) - ? LT_FALSE : LT_TRUE; - else - retval = LT_OTHER; - } - } else if (strcmp (keyword, "if") == 0) - retval = LT_IF; - else if (strcmp (keyword, "else") == 0) - retval = LT_ELSE; - else if (strcmp (keyword, "endif") == 0) - retval = LT_ENDIF; - - 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 = 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 - * position that is not whitespace. - */ -char * -skipcomment (cp) -register char *cp; -{ - if (incomment) - goto inside; - for (;; cp++) { - while (*cp == ' ' || *cp == '\t') - cp++; - if (text) - return cp; - if ( cp[0] != '/' - || cp[1] != '*' - ) - return cp; - cp += 2; - if (!incomment) { - incomment = YES; - stqcline = linenum; - } - 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 - * position that is not whitespace. - */ -char * -skipquote (cp, type) -register char *cp; -register int type; -{ - register char qchar; - - qchar = type == QUOTE_SINGLE ? '\'' : '"'; - - if (inquote == type) - goto inside; - for (;; cp++) { - if (*cp != qchar) - return cp; - cp++; - inquote = type; - stqcline = linenum; - inside: - for (; ; cp++) { - if (*cp == qchar) - break; - if ( *cp == '\0' - || *cp == '\\' && *++cp == '\0' - ) - return cp; - } - inquote = QUOTE_NONE; - } -} - -/* - * findsym - look for the symbol in the symbol table. - * if found, return symbol table index, - * else return -1. - */ -int -findsym (str) -char *str; -{ - register char *cp; - register char *symp; - register int symind; - register char chr; - - for (symind = 0; symind < nsyms; ++symind) { - if (insym[symind] == SYM_INACTIVE) { - for ( symp = symname[symind], cp = str - ; *symp && *cp == *symp - ; cp++, symp++ - ) - continue; - chr = *cp; - if (*symp == '\0' && endsym (chr)) - return symind; - } - } - return -1; -} - -/* - * getlin - expands tabs if asked for - * and (if compiled in) treats form-feed as an end-of-line - */ -int -getlin (line, maxline, inp, expandtabs) -register char *line; -int maxline; -FILE *inp; -int expandtabs; -{ - int tmp; - register int num; - register int chr; -#ifdef FFSPECIAL - static char havechar = NO; /* have leftover char from last time */ - static char svchar BSS; -#endif/*FFSPECIAL */ - - num = 0; -#ifdef FFSPECIAL - if (havechar) { - havechar = NO; - chr = svchar; - goto ent; - } -#endif/*FFSPECIAL */ - while (num + 8 < maxline) { /* leave room for tab */ - chr = getc (inp); - if (isprint (chr)) { -#ifdef FFSPECIAL - ent: -#endif/*FFSPECIAL */ - *line++ = chr; - num++; - } else - switch (chr) { - case EOF: - return EOF; - - case '\t': - if (expandtabs) { - num += tmp = 8 - (num & 7); - do - *line++ = ' '; - while (--tmp); - break; - } - default: - *line++ = chr; - num++; - break; - - case '\n': - *line = '\n'; - num++; - goto end; - -#ifdef FFSPECIAL - case '\f': - if (++num == 1) - *line = '\f'; - else { - *line = '\n'; - havechar = YES; - svchar = chr; - } - goto end; -#endif/*FFSPECIAL */ - } - } - end: - *++line = '\0'; - return num; -} - -flushline (keep) -Bool keep; -{ - if ((keep && reject != REJ_YES) ^ complement) { - register char *line = tline; - register FILE *out = stdout; - register char chr; - - while (chr = *line++) - putc (chr, out); - } else if (lnblank) - putc ('\n', stdout); - return; -} - -prname () -{ - fprintf (stderr, "%s: ", progname); - return; -} - -int -error (err, line, depth) -int err; /* type of error & index into error string array */ -int line; /* line number */ -int depth; /* how many ifdefs we are inside */ -{ - if (err == END_ERR) - return err; - - prname (); - -#ifndef TESTING - fprintf (stderr, "Error in %s line %d: %s.\n", filename, line, errs[err]); -#else/* TESTING */ - fprintf (stderr, "Error in %s line %d: %s. ", filename, line, errs[err]); - fprintf (stderr, "ifdef depth: %d\n", depth); -#endif/*TESTING */ - - exitstat = 2; - return depth > 1 ? IEOF_ERR : END_ERR; -} |