/* * Most controls the fraction of source files that a header file must be * included in for it to appear in HFILES= rather than have an explicit * dependency */ #define Most 0.66 /* * Default collumn to wrap file lists at, 78 gives wide but short mkfiles, * some people prefer a value of 1 which gives one file name per line * and thus long, narrow mkfiles. * A command line option can override this anyway. */ #define Defwrap 78 /* * Catch self-referential dependencies, stop recuring at this depth, * ANSI requires at least 15, GCC imposes a limit of 200. */ #define Maxdepth 16 /* * max nesting depth of #if, #ifdef, #ifndef statments, ANSI * requires 4095. */ #define Ifstack 4096 enum { Tunk = 0, /* unknown file type */ Thdr, /* header file */ Tsrc, /* general source */ Tyacc, /* yacc source */ Tlex, /* lex source */ Tman1, /* man page, command */ Tman3, /* man page, library */ Tdir /* directory */ }; typedef struct File File; struct File { /* files we are interested in */ File *next; char *name; /* file name */ int ref; /* reference count for missed source files */ int type; /* enum above */ int sysdir; /* a "system" header file */ int global; /* this dependency is handled in HFILES= */ }; typedef struct Depend Depend; struct Depend { /* dependency graph */ Depend *next; /* next on list */ File *file; /* real file info */ Depend *child; /* dependent file(s) */ }; typedef struct List List; struct List { /* general name list */ List *next; char *name; }; typedef struct Symb Symb; struct Symb { /* preprocessor symbol */ Symb *next; char *name; /* name */ char *val; /* value */ }; typedef struct State State; struct State { /* pre-processor parser state */ Biobuf *bp; /* include file */ int line; /* current line for debug */ char *file; /* current file for debug */ Depend **dep; /* dependency list to attach any includes to */ List *langincdirs; /* language specific include directories */ int stk[Ifstack]; /* #ifdef/#if state stack */ int sp; /* stack pointer */ }; typedef struct Lang Lang; struct Lang { char *ext; /* file name extension */ int type; /* type *enum above */ List **incdirp; /* system include dirs to check */ void (*parser)(State *s); /* parse func */ }; extern Biobuf *op; extern int Debug; extern int Wrap; extern List *Lochints; extern List *Glbhints; extern List *Incdir; extern List *Pragmalib; extern char *Objname; extern char Objletter; extern int Autoconf; extern char *findinc(char *, char, List *, int *); extern void wrap(int *, char *, ...); extern File *addfile(char *, int); extern int scanfile(Depend **, File *, char *, int); extern void parse_cpp(State *); extern void parse_f77(State *); extern int rmsym(char *); extern void setsym(char *, char *); extern char *looksym(char *, List *); extern void freesyms(Symb *); extern void dumpvars(void); extern void includehint(char *); extern void filehint(char *); extern char *macrohint(char *, List *); extern void prhints(int *); extern void scanincludes(char *); extern void gnu_pkgvers(void); extern int expr(State *, char *); extern void *emallocz(long, int); extern void *erealloc(void *, long); extern char *estrdup(char *); extern void wrap(int *, char *, ...); extern int trimfmt(Fmt *); extern int addlist(List **, char *); extern uint hash(char *, int); extern void parse_ar(char *); extern int inlibrary(char *);