From 97527faa1b2b9f66be7171454161f273b986ee46 Mon Sep 17 00:00:00 2001 From: Egbert Eich Date: Sun, 14 Mar 2004 08:27:26 +0000 Subject: Importing vendor version xf86-4_4_99_1 on Sun Mar 14 00:26:39 PST 2004 --- cppsetup.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- def.h | 89 +++++++++++----------- ifparser.c | 144 ++++++++++++++++++++--------------- ifparser.h | 49 ++++-------- imakemdep.h | 2 +- include.c | 2 +- main.c | 24 +++--- makedepend.man | 2 +- parse.c | 231 ++++++++++++++++++++++++++++++++++++++++----------------- pr.c | 2 +- 10 files changed, 537 insertions(+), 233 deletions(-) diff --git a/cppsetup.c b/cppsetup.c index c7ac256..3c0ddf2 100644 --- a/cppsetup.c +++ b/cppsetup.c @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/cppsetup.c,v 3.10 2001/12/14 19:53:20 dawes Exp $ */ +/* $XFree86: xc/config/makedepend/cppsetup.c,v 3.12 2004/03/05 16:02:58 tsi Exp $ */ #include "def.h" @@ -86,8 +86,8 @@ cppsetup(char *line, struct filepointer *filep, struct inclist *inc) pend = p; ptrtab = slotab+COFF; - *--inp = SALT; - outp=inp; + *--inp = SALT; + outp=inp; value = yyparse(); *p = savec; return(value); @@ -181,26 +181,231 @@ my_eval_defined (IfParser *ip, const char *var, int len) return 0; } + +int +variable_has_args (IfParser *ip, const char *var, int len) +{ + struct symtab **s = lookup_variable (ip, var, len); + + if (!s) + return 0; + + if ((*s)->s_args) + return 1; + else + return 0; +} + +/* + * this is tiny linked list implementation for temporarily storing + * and retriving pairs of macro parameter names and passed in macro arguments. + */ +typedef struct keyword_type_rec keyword_type; +struct keyword_type_rec { + keyword_type* pnext; + char *name; + char *value; +}; + + +static keyword_type* +build_keyword_list (const char* keys, const char* values) +{ + keyword_type *phead = NULL, *pnew; + const char *ptmp; + int len; + + while (*keys) + { + /* alloc new member */ + pnew = malloc(sizeof(*pnew)); + if (!pnew) + { + fprintf(stderr, "out of memory in my_eval_variable\n"); + exit(1); + } + + /* extract key */ + ptmp = keys; + len = 0; + while (*ptmp && (*ptmp != ',')) + ptmp++, len++; + pnew->name = malloc(len+1); + strncpy(pnew->name, keys, len); + pnew->name[len] = '\0'; + keys = ptmp; + if (*keys) + keys++; + + /* extract arg */ + ptmp = values; + len = 0; + while (*ptmp && (*ptmp != ',') && (*ptmp != ')')) + ptmp++, len++; + pnew->value = malloc(len+1); + strncpy(pnew->value, values, len); + pnew->value[len] = '\0'; + values = ptmp; + if (*values) + values++; + + /* chain in this new member */ + pnew->pnext = phead; + phead = pnew; + } + + return phead; +} + + +static const keyword_type* +get_keyword_entry (const keyword_type* phead, const char* keyname, const int keylen) +{ + while (phead) + { + if (keylen == strlen(phead->name)) + if (strncmp(keyname, phead->name, keylen) == 0) + return phead; + phead = phead->pnext; + } + + return phead; +} + + +static void +free_keyword_list (keyword_type* phead) +{ + keyword_type* pnext; + while (phead) + { + pnext = phead->pnext; + free(phead->name); + free(phead->value); + free(phead); + phead = pnext; + } +} + + #define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_') static long -my_eval_variable (IfParser *ip, const char *var, int len) +my_eval_variable (IfParser *ip, const char *var, int len, const char *args) { long val; + char *newline = NULL; + int newline_len = 0, newline_offset = 0; struct symtab **s; s = lookup_variable (ip, var, len); if (!s) return 0; - do { - var = (*s)->s_value; - if (!isvarfirstletter(*var) || !strcmp((*s)->s_name, var)) - break; - s = lookup_variable (ip, var, strlen(var)); - } while (s); + + if ((*s)->s_args) + { + const char *psrc, *psrc_qualifier; + char *pdst; + const keyword_type *pkeyword; + keyword_type *pkeylist; + + newline_len = 64; /* start with some buffer, might increase later */ + newline = malloc(newline_len); + if (!newline) + { + fprintf(stderr, "out of memory in my_eval_variable\n"); + exit(1); + } + + /* build up a list that pairs keywords and args */ + pkeylist = build_keyword_list((*s)->s_args,args); + + /* parse for keywords in macro content */ + psrc = (*s)->s_value; + pdst = newline; + while (*psrc) + { + /* parse for next qualifier */ + psrc_qualifier = psrc; + while (isalnum(*psrc) || *psrc == '_') + psrc++; + + /* check if qualifier is in parameter keywords listing of macro */ + pkeyword = get_keyword_entry(pkeylist,psrc_qualifier,psrc - psrc_qualifier); + if (pkeyword) + { /* convert from parameter keyword to given argument */ + const char *ptmp = pkeyword->value; + while (*ptmp) + { + *pdst++ = *ptmp++; + newline_offset++; + if (newline_offset + 2 >= newline_len) + { + newline_len *= 2; + newline = realloc(newline, newline_len); + if (!newline) + { + fprintf(stderr, "out of memory in my_eval_variable\n"); + exit(1); + } + pdst = &newline[newline_offset]; + } + } + } + else + { /* perform post copy of qualifier that is not a parameter keyword */ + const char *ptmp = psrc_qualifier; + while (ptmp < psrc) + { + *pdst++ = *ptmp++; + newline_offset++; + if (newline_offset + 2 >= newline_len) + { + newline_len *= 2; + newline = realloc(newline, newline_len); + if (!newline) + { + fprintf(stderr, "out of memory in my_eval_variable\n"); + exit(1); + } + pdst = &newline[newline_offset]; + } + } + } + + /* duplicate chars that are not qualifier chars */ + while (!(isalnum(*psrc) || *psrc == '_' || *psrc == '\0')) + { + *pdst++ = *psrc++; + newline_offset++; + if (newline_offset + 2 >= newline_len) + { + newline_len *= 2; + newline = realloc(newline, newline_len); + if (!newline) + { + fprintf(stderr, "out of memory in my_eval_variable\n"); + exit(1); + } + pdst = &newline[newline_offset]; + } + } + } + + *pdst = '\0'; + free_keyword_list(pkeylist); + var = newline; + } + else + { + var = (*s)->s_value; + } var = ParseIfExpression(ip, var, &val); if (var && *var) debug(4, ("extraneous: '%s'\n", var)); + + if (newline) free(newline); + return val; } diff --git a/def.h b/def.h index 7a1be77..a105bfe 100644 --- a/def.h +++ b/def.h @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/def.h,v 3.13tsi Exp $ */ +/* $XFree86: xc/config/makedepend/def.h,v 3.15 2004/03/05 16:02:58 tsi Exp $ */ #include "Xos.h" #include "Xfuncproto.h" @@ -48,39 +48,39 @@ in this Software without prior written authorization from The Open Group. #define MAXINCFILES 128 /* "-include" files */ #define MAXDIRS 64 #define SYMTABINC 10 /* must be > 1 for define() to work right */ -#define TRUE 1 -#define FALSE 0 +#define TRUE 1 +#define FALSE 0 /* the following must match the directives table in main.c */ -#define IF 0 -#define IFDEF 1 -#define IFNDEF 2 -#define ELSE 3 -#define ENDIF 4 -#define DEFINE 5 -#define UNDEF 6 -#define INCLUDE 7 -#define LINE 8 -#define PRAGMA 9 -#define ERROR 10 -#define IDENT 11 -#define SCCS 12 -#define ELIF 13 -#define EJECT 14 -#define WARNING 15 -#define INCLUDENEXT 16 -#define IFFALSE 17 /* pseudo value --- never matched */ -#define ELIFFALSE 18 /* pseudo value --- never matched */ -#define INCLUDEDOT 19 /* pseudo value --- never matched */ -#define IFGUESSFALSE 20 /* pseudo value --- never matched */ -#define ELIFGUESSFALSE 21 /* pseudo value --- never matched */ -#define INCLUDENEXTDOT 22 /* pseudo value --- never matched */ +#define IF 0 +#define IFDEF 1 +#define IFNDEF 2 +#define ELSE 3 +#define ENDIF 4 +#define DEFINE 5 +#define UNDEF 6 +#define INCLUDE 7 +#define LINE 8 +#define PRAGMA 9 +#define ERROR 10 +#define IDENT 11 +#define SCCS 12 +#define ELIF 13 +#define EJECT 14 +#define WARNING 15 +#define INCLUDENEXT 16 +#define IFFALSE 17 /* pseudo value --- never matched */ +#define ELIFFALSE 18 /* pseudo value --- never matched */ +#define INCLUDEDOT 19 /* pseudo value --- never matched */ +#define IFGUESSFALSE 20 /* pseudo value --- never matched */ +#define ELIFGUESSFALSE 21 /* pseudo value --- never matched */ +#define INCLUDENEXTDOT 22 /* pseudo value --- never matched */ #ifdef DEBUG extern int _debugmask; /* * debug levels are: - * + * * 0 show ifn*(def)*,endif * 1 trace defined/!defined * 2 show #include @@ -89,7 +89,7 @@ extern int _debugmask; */ #define debug(level,arg) { if (_debugmask & (1 << level)) warning arg; } #else -#define debug(level,arg) /**/ +#define debug(level,arg) /**/ #endif /* DEBUG */ typedef unsigned char boolean; @@ -97,6 +97,7 @@ typedef unsigned char boolean; struct symtab { char *s_name; char *s_value; + char *s_args; }; /* possible i_flag */ @@ -138,7 +139,7 @@ char *malloc(), *realloc(); #endif /* macII */ char *copy(char *str); -int match(char *str, char **list); +int match(char *str, char **list); char *base_name(char *file); char *getnextline(struct filepointer *fp); struct symtab **slookup(char *symbol, struct inclist *file); @@ -147,36 +148,36 @@ struct symtab **isdefined(char *symbol, struct inclist *file, struct symtab **fdefined(char *symbol, struct inclist *file, struct inclist **srcfile); struct filepointer *getfile(char *file); -void included_by(struct inclist *ip, +void included_by(struct inclist *ip, struct inclist *newfile); struct inclist *newinclude(char *newfile, char *incstring); -void inc_clean (void); +void inc_clean(void); struct inclist *inc_path(char *file, char *include, int type); -void freefile(struct filepointer *fp); +void freefile(struct filepointer *fp); -void define2(char *name, char *val, struct inclist *file); -void define(char *def, struct inclist *file); -void undefine(char *symbol, struct inclist *file); -int find_includes(struct filepointer *filep, - struct inclist *file, - struct inclist *file_red, +void define2(char *name, char *args, char *val, + struct inclist *file); +void define(char *def, struct inclist *file); +void undefine(char *symbol, struct inclist *file); +int find_includes(struct filepointer *filep, + struct inclist *file, + struct inclist *file_red, int recursion, boolean failOK); -void recursive_pr_include(struct inclist *head, +void recursive_pr_include(struct inclist *head, char *file, char *base); -void add_include(struct filepointer *filep, - struct inclist *file, - struct inclist *file_red, +void add_include(struct filepointer *filep, + struct inclist *file, + struct inclist *file_red, char *include, int type, boolean failOK); -int cppsetup(char *filename, +int cppsetup(char *filename, char *line, struct filepointer *filep, struct inclist *inc); - extern void fatalerr(char *, ...); extern void warning(char *, ...); extern void warning1(char *, ...); diff --git a/ifparser.c b/ifparser.c index aa51748..49dff21 100644 --- a/ifparser.c +++ b/ifparser.c @@ -2,7 +2,7 @@ * $Xorg: ifparser.c,v 1.3 2000/08/17 19:41:50 cpqbld Exp $ * * Copyright 1992 Network Computing Devices, Inc. - * + * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that @@ -12,7 +12,7 @@ * without specific, written prior permission. Network Computing Devices makes * no representations about the suitability of this software for any purpose. * It is provided ``as is'' without express or implied warranty. - * + * * NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL, @@ -20,46 +20,47 @@ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. - * + * * Author: Jim Fulton * Network Computing Devices, Inc. - * + * * Simple if statement processor * * This module can be used to evaluate string representations of C language * if constructs. It accepts the following grammar: - * + * * EXPRESSION := VALUE - * | VALUE BINOP EXPRESSION + * | VALUE BINOP EXPRESSION * | VALUE '?' EXPRESSION ':' EXPRESSION - * + * * VALUE := '(' EXPRESSION ')' - * | '!' VALUE - * | '-' VALUE - * | '+' VALUE + * | '!' VALUE + * | '-' VALUE + * | '+' VALUE * | '~' VALUE - * | 'defined' '(' variable ')' - * | 'defined' variable + * | 'defined' '(' variable_name ')' + * | 'defined' variable_name * | # variable '(' variable-list ')' - * | variable - * | number - * + * | variable(arglist) + * | variable + * | number + * * BINOP := '*' | '/' | '%' - * | '+' | '-' - * | '<<' | '>>' - * | '<' | '>' | '<=' | '>=' - * | '==' | '!=' - * | '&' | '^' | '|' - * | '&&' | '||' - * + * | '+' | '-' + * | '<<' | '>>' + * | '<' | '>' | '<=' | '>=' + * | '==' | '!=' + * | '&' | '^' | '|' + * | '&&' | '||' + * * The normal C order of precedence is supported. - * - * + * + * * External Entry Points: - * + * * ParseIfExpression parse a string for #if */ -/* $XFree86: xc/config/makedepend/ifparser.c,v 3.10tsi Exp $ */ +/* $XFree86: xc/config/makedepend/ifparser.c,v 3.12 2004/03/05 16:02:58 tsi Exp $ */ #include "ifparser.h" #include @@ -77,16 +78,53 @@ static const char * -parse_variable (IfParser *g, const char *cp, const char **varp) +parse_variable_name (IfParser *g, const char *cp, const char **varp, int *varlenp) +{ + *varlenp = 0; + + SKIPSPACE (cp); + + if (!isvarfirstletter(*cp)) + return CALLFUNC(g, handle_error) (g, cp, "variable name"); + + *varp = cp; + for (cp++; isalnum(*cp) || *cp == '_'; cp++) /* EMPTY */; + *varlenp = cp - *varp; + + return cp; +} + + +static const char * +parse_variable (IfParser *g, const char *cp, const char **varp, int *varlenp, const char **argsp) { + *argsp = NULL; + *varlenp = 0; + SKIPSPACE (cp); + /* this error handling call might prevent us from merging with above code */ if (!isvarfirstletter (*cp)) return CALLFUNC(g, handle_error) (g, cp, "variable name"); *varp = cp; - /* EMPTY */ - for (cp++; isalnum(*cp) || *cp == '_'; cp++) ; + for (cp++; isalnum(*cp) || *cp == '_'; cp++) /* EMPTY */; + *varlenp = cp - *varp; + + if (variable_has_args(g, *varp, *varlenp)) + { + SKIPSPACE (cp); + if (*cp != '(') + { + return CALLFUNC(g, handle_error) (g, cp, "argument list"); + } + cp++; + + *argsp = cp; + for (cp++; *cp != ')'; cp++) /* EMPTY */; + cp++; + } + return cp; } @@ -171,7 +209,8 @@ parse_character (IfParser *g, const char *cp, long *valp) static const char * parse_value (IfParser *g, const char *cp, long *valp) { - const char *var, *varend; + const char *var, *args; + int varlen; *valp = 0; @@ -183,7 +222,7 @@ parse_value (IfParser *g, const char *cp, long *valp) case '(': DO (cp = ParseIfExpression (g, cp + 1, valp)); SKIPSPACE (cp); - if (*cp != ')') + if (*cp != ')') return CALLFUNC(g, handle_error) (g, cp, ")"); return cp + 1; /* skip the right paren */ @@ -208,12 +247,12 @@ parse_value (IfParser *g, const char *cp, long *valp) return cp; case '#': - DO (cp = parse_variable (g, cp + 1, &var)); + DO (cp = parse_variable (g, cp + 1, &var, &varlen, &args)); SKIPSPACE (cp); if (*cp != '(') return CALLFUNC(g, handle_error) (g, cp, "("); do { - DO (cp = parse_variable (g, cp + 1, &var)); + DO (cp = parse_variable (g, cp + 1, &var, &varlen, &args)); SKIPSPACE (cp); } while (*cp && *cp != ')'); if (*cp != ')') @@ -230,7 +269,6 @@ parse_value (IfParser *g, const char *cp, long *valp) case 'd': if (strncmp (cp, "defined", 7) == 0 && !isalnum(cp[7])) { int paren = 0; - int len; cp += 7; SKIPSPACE (cp); @@ -238,43 +276,31 @@ parse_value (IfParser *g, const char *cp, long *valp) paren = 1; cp++; } - DO (cp = parse_variable (g, cp, &var)); - len = cp - var; + DO (cp = parse_variable_name (g, cp, &var, &varlen)); SKIPSPACE (cp); if (paren && *cp != ')') return CALLFUNC(g, handle_error) (g, cp, ")"); - *valp = (*(g->funcs.eval_defined)) (g, var, len); + *valp = (*(g->funcs.eval_defined)) (g, var, varlen); return cp + paren; /* skip the right paren */ } /* fall out */ } if (isdigit(*cp)) { + /* determine the numeric value */ DO (cp = parse_number (g, cp, valp)); - } else if (!isvarfirstletter(*cp)) - return CALLFUNC(g, handle_error) (g, cp, "variable or number"); + } else if (isvarfirstletter(*cp)) { + /* resolve the value of this macro. + * (macro argument substitution will take place + * and recursive macro resolvement will apply) */ + DO (cp = parse_variable (g, cp, &var, &varlen, &args)); + *valp = (*(g->funcs.eval_variable)) (g, var, varlen, args); + } else { - DO (cp = parse_variable (g, cp, &var)); - varend = cp; - SKIPSPACE(cp); - if (*cp != '(') { - *valp = (*(g->funcs.eval_variable)) (g, var, varend - var); - } else { - do { - long dummy; - DO (cp = ParseIfExpression (g, cp + 1, &dummy)); - SKIPSPACE(cp); - if (*cp == ')') - break; - if (*cp != ',') - return CALLFUNC(g, handle_error) (g, cp, ","); - } while (1); - - *valp = 1; /* XXX */ - cp++; - } + /* we finally got something that does not fit the syntax rules */ + return CALLFUNC(g, handle_error) (g, cp, "variable or number"); } - + return cp; } diff --git a/ifparser.h b/ifparser.h index 398a3e4..e9ec9c3 100644 --- a/ifparser.h +++ b/ifparser.h @@ -2,7 +2,7 @@ * $Xorg: ifparser.h,v 1.3 2000/08/17 19:41:51 cpqbld Exp $ * * Copyright 1992 Network Computing Devices, Inc. - * + * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that @@ -12,7 +12,7 @@ * without specific, written prior permission. Network Computing Devices makes * no representations about the suitability of this software for any purpose. * It is provided ``as is'' without express or implied warranty. - * + * * NETWORK COMPUTING DEVICES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL NETWORK COMPUTING DEVICES BE LIABLE FOR ANY SPECIAL, @@ -20,44 +20,19 @@ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. - * + * * Author: Jim Fulton * Network Computing Devices, Inc. - * - * Simple if statement processor * - * This module can be used to evaluate string representations of C language - * if constructs. It accepts the following grammar: - * - * EXPRESSION := VALUE - * | VALUE BINOP EXPRESSION - * | VALUE '?' EXPRESSION ':' EXPRESSION - * - * VALUE := '(' EXPRESSION ')' - * | '!' VALUE - * | '-' VALUE - * | '~' VALUE - * | 'defined' '(' variable ')' - * | variable - * | number - * - * BINOP := '*' | '/' | '%' - * | '+' | '-' - * | '<<' | '>>' - * | '<' | '>' | '<=' | '>=' - * | '==' | '!=' - * | '&' | '^' | '|' - * | '&&' | '||' - * - * The normal C order of precedence is supported. - * - * + * Simple if statement processor. Please see ifparser.c for the parsing tree. + * + * * External Entry Points: - * + * * ParseIfExpression parse a string for #if */ -/* $XFree86: xc/config/makedepend/ifparser.h,v 3.4 2001/01/17 16:38:58 dawes Exp $ */ +/* $XFree86: xc/config/makedepend/ifparser.h,v 3.6 2004/03/05 16:02:58 tsi Exp $ */ #include @@ -69,15 +44,17 @@ typedef struct _if_parser { struct { /* functions */ const char *(*handle_error) (struct _if_parser *, const char *, const char *); - long (*eval_variable) (struct _if_parser *, const char *, int); + long (*eval_variable) (struct _if_parser *, const char *, int, + const char *); int (*eval_defined) (struct _if_parser *, const char *, int); } funcs; char *data; } IfParser; const char *ParseIfExpression ( - IfParser *, - const char *, + IfParser *, + const char *, long * ); +extern int variable_has_args(IfParser *ip, const char *var, int len); diff --git a/imakemdep.h b/imakemdep.h index db17752..f272429 100644 --- a/imakemdep.h +++ b/imakemdep.h @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/imake/imakemdep.h,v 3.71 2003/06/12 14:12:26 eich Exp $ */ +/* $XFree86: xc/config/imake/imakemdep.h,v 3.72 2003/12/30 01:53:52 tsi Exp $ */ /* diff --git a/include.c b/include.c index 65ce783..4e32800 100644 --- a/include.c +++ b/include.c @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/include.c,v 3.6 2001/04/29 23:25:02 tsi Exp $ */ +/* $XFree86: xc/config/makedepend/include.c,v 3.7 2001/12/14 19:53:20 dawes Exp $ */ #include "def.h" diff --git a/main.c b/main.c index a6c4883..efdaceb 100644 --- a/main.c +++ b/main.c @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/main.c,v 3.31tsi Exp $ */ +/* $XFree86: xc/config/makedepend/main.c,v 3.33 2004/03/05 16:02:59 tsi Exp $ */ #include "def.h" #ifdef hpux @@ -112,7 +112,7 @@ boolean printed = FALSE; boolean verbose = FALSE; boolean show_where_not = FALSE; /* Warn on multiple includes of same file */ -boolean warn_multiple = FALSE; +boolean warn_multiple = FALSE; static void setfile_cmdinc(struct filepointer *filep, long count, char **list); static void redirect(char *line, char *makefile); @@ -162,7 +162,7 @@ main(int argc, char *argv[]) while (psymp->s_name) { - define2(psymp->s_name, psymp->s_value, &maininclist); + define2(psymp->s_name, NULL, psymp->s_value, &maininclist); psymp++; } if (argc == 2 && argv[1][0] == '@') { @@ -213,7 +213,7 @@ main(int argc, char *argv[]) argv = nargv; } for(argc--, argv++; argc; argc--, argv++) { - /* if looking for endmarker then check before parsing */ + /* if looking for endmarker then check before parsing */ if (endmarker && strcmp (endmarker, *argv) == 0) { endmarker = NULL; continue; @@ -331,7 +331,7 @@ main(int argc, char *argv[]) case 'm': warn_multiple = TRUE; break; - + /* Ignore -O, -g so we can just pass ${CFLAGS} to makedepend */ @@ -351,7 +351,7 @@ main(int argc, char *argv[]) buf = malloc(strlen(DASH_INC_PRE) + strlen(argv[0]) + strlen(DASH_INC_POST) + 1); - if(!buf) + if (!buf) fatalerr("out of memory at " "-include string\n"); cmdinc_list[2 * cmdinc_count + 0] = argv[0]; @@ -388,7 +388,7 @@ main(int argc, char *argv[]) for (;;) { end = (char*)strchr(beg,';'); if (end) *end = 0; - if (incp >= includedirs + MAXDIRS) + if (incp >= includedirs + MAXDIRS) fatalerr("Too many include dirs\n"); *incp++ = beg; if (!end) break; @@ -509,7 +509,7 @@ main(int argc, char *argv[]) /* * eliminate \r chars from file */ -static int +static int elim_cr(char *buf, int sz) { int i,wp; @@ -633,7 +633,7 @@ char *getnextline(struct filepointer *filep) } whitespace = TRUE; } - + if (*p == '/' && (p+1) < eof && *(p+1) == '*') { /* Consume C comments */ *(p++) = ' '; @@ -661,7 +661,7 @@ char *getnextline(struct filepointer *filep) lineno++; } else if (*p == '?' && (p+3) < eof && - *(p+1) == '?' && + *(p+1) == '?' && *(p+2) == '/' && *(p+3) == '\n') { *(p++) = ' '; @@ -697,7 +697,7 @@ char *getnextline(struct filepointer *filep) *(p++) = '\0'; /* punt lines with just # (yacc generated) */ - for (cp = bol+1; + for (cp = bol+1; *cp && (*cp == ' ' || *cp == '\t'); cp++); if (*cp) goto done; --p; @@ -817,7 +817,7 @@ redirect(char *line, char *makefile) #if defined(USGISH) || defined(_SEQUENT_) || defined(USE_CHMOD) chmod(makefile, st.st_mode); #else - fchmod(fileno(fdout), st.st_mode); + fchmod(fileno(fdout), st.st_mode); #endif /* USGISH */ } diff --git a/makedepend.man b/makedepend.man index ac67cc8..595c87e 100644 --- a/makedepend.man +++ b/makedepend.man @@ -23,7 +23,7 @@ .\" dealing in this Software without prior written authorization from The .\" Open Group. .\" -.\" $XFree86: xc/config/makedepend/mkdepend.man,v 1.6 2001/12/17 20:52:22 dawes Exp $ +.\" $XFree86: xc/config/makedepend/mkdepend.man,v 1.7 2002/12/14 02:39:45 dawes Exp $ .\" .TH MAKEDEPEND 1 __xorgversion__ .UC 4 diff --git a/parse.c b/parse.c index 935c61d..66a4b6e 100644 --- a/parse.c +++ b/parse.c @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/parse.c,v 1.11 2001/12/17 20:52:22 dawes Exp $ */ +/* $XFree86: xc/config/makedepend/parse.c,v 1.14 2004/03/10 15:49:20 tsi Exp $ */ #include "def.h" @@ -61,7 +61,7 @@ gobble(struct filepointer *filep, struct inclist *file, (type == ELIFGUESSFALSE)) type = gobble(filep, file, file_red); if (type == ELSE) - (void)gobble(filep, file, file_red); + (void)gobble(filep, file, file_red); break; case ELSE: case ENDIF: @@ -101,8 +101,8 @@ gobble(struct filepointer *filep, struct inclist *file, /* * Decide what type of # directive this line is. */ -static int -deftype (char *line, struct filepointer *filep, +static int +deftype (char *line, struct filepointer *filep, struct inclist *file_red, struct inclist *file, int parse_it) { register char *p; @@ -202,7 +202,7 @@ deftype (char *line, struct filepointer *filep, if (!*p || *p == '"' || *p == '<') break; - sym = isdefined(p, file_red, NULL); + sym = isdefined(p, file_red, NULL); if (!sym) break; @@ -212,7 +212,7 @@ deftype (char *line, struct filepointer *filep, (*sym) -> s_name, (*sym) -> s_value)); /* mark file as having included a 'soft include' */ - file->i_flags |= INCLUDED_SYM; + file->i_flags |= INCLUDED_SYM; } /* @@ -322,7 +322,7 @@ zero_value(char *filename, } void -define2(char *name, char *val, struct inclist *file) +define2(char *name, char *args, char *val, struct inclist *file) { int first, last, below; register struct symtab **sp = NULL, **dest; @@ -359,14 +359,14 @@ define2(char *name, char *val, struct inclist *file) if (s2[-1] == '\0') break; /* If exact match, set sp and break */ - if (*--s1 == *--s2) + if (*--s1 == *--s2) { sp = file->i_defs + middle; break; } /* If name > i_defs[middle] ... */ - if (*s1 > *s2) + if (*s1 > *s2) { below = first; first = middle + 1; @@ -379,11 +379,19 @@ define2(char *name, char *val, struct inclist *file) } /* Search is done. If we found an exact match to the symbol name, - just replace its s_value */ + just replace its s_args and s_value if they are changed */ if (sp != NULL) { debug(1,("redefining %s from %s to %s in file %s\n", name, (*sp)->s_value, val, file->i_file)); + + if ( (*sp)->s_args ) + free((*sp)->s_args); + if (args) + (*sp)->s_args = copy(args); + else + (*sp)->s_args = NULL; + free((*sp)->s_value); (*sp)->s_value = copy(val); return; @@ -402,6 +410,10 @@ define2(char *name, char *val, struct inclist *file) debug(1,("defining %s to %s in file %s\n", name, val, file->i_file)); stab->s_name = copy(name); + if (args) + stab->s_args = copy(args); + else + stab->s_args = NULL; stab->s_value = copy(val); *sp = stab; } @@ -409,20 +421,99 @@ define2(char *name, char *val, struct inclist *file) void define(char *def, struct inclist *file) { +#define S_ARGS_BUFLEN 1024 /* we dont expect too much macro parameters usage */ +static char args[S_ARGS_BUFLEN]; + char *val; + char *p_args = args; + int fix_args = 0, var_args = 0, loop = 1; + char *p_tmp; + + args[0] = '\0'; /* Separate symbol name and its value */ val = def; while (isalnum(*val) || *val == '_') val++; + + if (*val == '(') /* is this macro definition with parameters? */ + { + *val++ = '\0'; + + do /* parse the parametere list */ + { + while (*val == ' ' || *val == '\t') + val++; + + /* extract next parameter name */ + if (*val == '.') + { /* it should be the var-args parameter: "..." */ + var_args++; + p_tmp = p_args; + while (*val == '.') + { + *p_args++ = *val++; + if (p_args >= &args[S_ARGS_BUFLEN-1]) + fatalerr("args buffer full failure in insert_defn()\n"); + } + *p_args = '\0'; + if (strcmp(p_tmp,"...")!=0) + { + fprintf(stderr, "unrecognized qualifier, should be \"...\" for-args\n"); + } + } + else + { /* regular parameter name */ + fix_args++; + while (isalnum(*val) || *val == '_') + { + *p_args++ = *val++; + if (p_args >= &args[S_ARGS_BUFLEN-1]) + fatalerr("args buffer full failure in insert_defn()\n"); + } + } + while (*val == ' ' || *val == '\t') + val++; + + if (*val == ',') + { + if (var_args) + { + fprintf(stderr, "there are more arguments after the first var-args qualifier\n"); + } + + *p_args++ = ','; /* we are using the , as a reserved char */ + if (p_args >= &args[S_ARGS_BUFLEN-1]) + fatalerr("args buffer full failure in insert_defn()\n"); + val++; + } + else + if (*val == ')') + { + *p_args = '\0'; + val++; + loop=0; + } + else + { + fprintf(stderr, "trailing ) on macro arguments missing\n"); + loop=0; + } + } while (loop); + } + if (*val) *val++ = '\0'; while (*val == ' ' || *val == '\t') val++; - if (!*val) + if (!*val) /* define statements without a value will get a value of 1 */ val = "1"; - define2(def, val, file); + + if (args && (strlen(args)>0)) + define2(def, args, val, file); + else + define2(def, NULL, val, file); } struct symtab ** @@ -442,29 +533,29 @@ slookup(char *symbol, struct inclist *file) s1 = symbol; s2 = file->i_defs[middle]->s_name; while (*s1++ == *s2++) - if (s2[-1] == '\0') break; + if (s2[-1] == '\0') break; /* If exact match, we're done */ - if (*--s1 == *--s2) + if (*--s1 == *--s2) { - return file->i_defs + middle; + return file->i_defs + middle; } /* If symbol > i_defs[middle] ... */ - if (*s1 > *s2) + if (*s1 > *s2) { - first = middle + 1; + first = middle + 1; } /* else ... */ else { - last = middle - 1; + last = middle - 1; } } return(NULL); } -static int +static int merge2defines(struct inclist *file1, struct inclist *file2) { int i; @@ -477,59 +568,59 @@ merge2defines(struct inclist *file1, struct inclist *file2) if (file2->i_merged[i]==FALSE) return 0; - { + { /* local var encapsulation */ int first1 = 0; int last1 = file1->i_ndefs - 1; int first2 = 0; int last2 = file2->i_ndefs - 1; - int first=0; - struct symtab** i_defs = NULL; + int first=0; + struct symtab** i_defs = NULL; int deflen=file1->i_ndefs+file2->i_ndefs; debug(2,("merging %s into %s\n", file2->i_file, file1->i_file)); - if (deflen>0) - { - /* make sure deflen % SYMTABINC == 0 is still true */ - deflen += (SYMTABINC - deflen % SYMTABINC) % SYMTABINC; - i_defs=(struct symtab**) + if (deflen>0) + { + /* make sure deflen % SYMTABINC == 0 is still true */ + deflen += (SYMTABINC - deflen % SYMTABINC) % SYMTABINC; + i_defs=(struct symtab**) malloc(deflen*sizeof(struct symtab*)); - if (i_defs==NULL) return 0; - } - - while ((last1 >= first1) && (last2 >= first2)) - { - char *s1=file1->i_defs[first1]->s_name; - char *s2=file2->i_defs[first2]->s_name; - - if (strcmp(s1,s2) < 0) - i_defs[first++]=file1->i_defs[first1++]; - else if (strcmp(s1,s2) > 0) - i_defs[first++]=file2->i_defs[first2++]; - else /* equal */ - { - i_defs[first++]=file2->i_defs[first2++]; - first1++; - } - } - while (last1 >= first1) - { - i_defs[first++]=file1->i_defs[first1++]; - } - while (last2 >= first2) - { - i_defs[first++]=file2->i_defs[first2++]; - } - - if (file1->i_defs) free(file1->i_defs); - file1->i_defs=i_defs; - file1->i_ndefs=first; - + if (i_defs==NULL) return 0; + } + + while ((last1 >= first1) && (last2 >= first2)) + { + char *s1=file1->i_defs[first1]->s_name; + char *s2=file2->i_defs[first2]->s_name; + + if (strcmp(s1,s2) < 0) + i_defs[first++]=file1->i_defs[first1++]; + else if (strcmp(s1,s2) > 0) + i_defs[first++]=file2->i_defs[first2++]; + else /* equal */ + { + i_defs[first++]=file2->i_defs[first2++]; + first1++; + } + } + while (last1 >= first1) + { + i_defs[first++]=file1->i_defs[first1++]; + } + while (last2 >= first2) + { + i_defs[first++]=file2->i_defs[first2++]; + } + + if (file1->i_defs) free(file1->i_defs); + file1->i_defs=i_defs; + file1->i_ndefs=first; + return 1; - } + } } void @@ -546,7 +637,7 @@ undefine(char *symbol, struct inclist *file) } int -find_includes(struct filepointer *filep, struct inclist *file, +find_includes(struct filepointer *filep, struct inclist *file, struct inclist *file_red, int recursion, boolean failOK) { struct inclist *inclistp; @@ -587,8 +678,11 @@ find_includes(struct filepointer *filep, struct inclist *file, break; case IFDEF: case IFNDEF: - if ((type == IFDEF && isdefined(line, file_red, NULL)) - || (type == IFNDEF && !isdefined(line, file_red, NULL))) { + { + int isdef = (isdefined(line, file_red, NULL) != NULL); + if (type == IFNDEF) isdef = !isdef; + + if (isdef) { debug(1,(type == IFNDEF ? "line %d: %s !def'd in %s via %s%s\n" : "", filep->f_line, line, @@ -610,11 +704,12 @@ find_includes(struct filepointer *filep, struct inclist *file, find_includes(filep, file, file_red, recursion+1, failOK); else if (type == ELIF) - goto doif; + goto doif; else if (type == ELIFFALSE || type == ELIFGUESSFALSE) - goto doiffalse; + goto doiffalse; } - break; + } + break; case ELSE: case ELIFFALSE: case ELIFGUESSFALSE: @@ -652,13 +747,13 @@ find_includes(struct filepointer *filep, struct inclist *file, break; case ERROR: case WARNING: - warning("%s", file_red->i_file); + warning("%s", file_red->i_file); if (file_red != file) warning1(" (reading %s)", file->i_file); warning1(", line %d: %s\n", filep->f_line, line); - break; - + break; + case PRAGMA: case IDENT: case SCCS: diff --git a/pr.c b/pr.c index 5d0e1c4..e864793 100644 --- a/pr.c +++ b/pr.c @@ -24,7 +24,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ -/* $XFree86: xc/config/makedepend/pr.c,v 1.4 2001/04/29 23:25:02 tsi Exp $ */ +/* $XFree86: xc/config/makedepend/pr.c,v 1.5 2001/12/14 19:53:21 dawes Exp $ */ #include "def.h" -- cgit v1.2.3