From f50074de504033ef28b9cfa6a08caa213da2b752 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 13 Nov 2001 03:30:26 +0000 Subject: [PATCH] The +incdir+ plusarg can take multiple directores, and add initial support for +define+ in the command file. --- driver/cflexor.lex | 42 ++++++++++++++++++-------- driver/cfparse.y | 75 ++++++++++++++++++++++++++++++++++++++++------ driver/globals.h | 9 +++++- driver/main.c | 33 ++++++++++++-------- 4 files changed, 125 insertions(+), 34 deletions(-) diff --git a/driver/cflexor.lex b/driver/cflexor.lex index 1d9360d35..5aa2a10f8 100644 --- a/driver/cflexor.lex +++ b/driver/cflexor.lex @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: cflexor.lex,v 1.2 2001/11/12 18:47:32 steve Exp $" +#ident "$Id: cflexor.lex,v 1.3 2001/11/13 03:30:26 steve Exp $" #endif # include "cfparse.h" @@ -38,12 +38,11 @@ YYLTYPE yylloc; static int comment_enter; -static int plus_incdir(void); - %} %x CCOMMENT %x LCOMMENT +%x PLUS_ARGS %% @@ -66,11 +65,33 @@ static int plus_incdir(void); /* Skip line ends, but also count the line. */ \n { yylloc.first_line += 1; } -"+incdir+".* { return plus_incdir(); } + +"+define+" { BEGIN(PLUS_ARGS); return TOK_DEFINE; } + +"+incdir+" { BEGIN(PLUS_ARGS); return TOK_INCDIR; } /* If it is not any known plus-flag, return the generic form. */ -"+"[^\n \t\b\r]* { cflval.text = strdup(yytext); - return TOK_PLUSARG; } +"+"[^\n \t\b\f\r+]* { + cflval.text = strdup(yytext); + BEGIN(PLUS_ARGS); + return TOK_PLUSWORD; } + + /* Once in PLUS_ARGS mode, words are delimited by + + characters. White space and line end terminate PLUS_ARGS mode, + but + terminates only the word. */ +[^\n \t\b\f\r+]* { + cflval.text = strdup(yytext); + return TOK_PLUSARG; } + + /* Within plusargs, this is a delimiter. */ +"+" { } + + /* White space end plus_args mode. */ +[ \t\b\f\r] { BEGIN(0); } + +\n { + yylloc.first_line += 1; + BEGIN(0); } /* Notice the -a flag. */ "-a" { return TOK_Da; } @@ -81,6 +102,9 @@ static int plus_incdir(void); /* Notice the -y flag. */ "-y" { return TOK_Dy; } + /* This rule matches paths and strings that may be file names. This + is a little bit tricky, as we don't want to mistake a comment for + a string word. */ "/"[^\*\/].* { cflval.text = strdup(yytext); return TOK_STRING; } @@ -92,12 +116,6 @@ static int plus_incdir(void); %% -static int plus_incdir(void) -{ - cflval.text = strdup(yytext + strlen("+incdir+")); - return TOK_INCDIR; -} - int yywrap() { return 1; diff --git a/driver/cfparse.y b/driver/cfparse.y index a20a94707..a3851040d 100644 --- a/driver/cfparse.y +++ b/driver/cfparse.y @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: cfparse.y,v 1.2 2001/11/12 18:47:32 steve Exp $" +#ident "$Id: cfparse.y,v 1.3 2001/11/13 03:30:26 steve Exp $" #endif @@ -31,7 +31,8 @@ }; %token TOK_Da TOK_Dv TOK_Dy -%token TOK_INCDIR TOK_PLUSARG TOK_STRING +%token TOK_DEFINE TOK_INCDIR +%token TOK_PLUSARG TOK_PLUSWORD TOK_STRING %% @@ -45,31 +46,87 @@ item_list | item ; -item : TOK_STRING +item + /* Absent any other matching, a token string is taken to be the name + of a source file. Add the file to the file list. */ + + : TOK_STRING { process_file_name($1); free($1); } - | TOK_Da - { } + + /* The -a flag is completely ignored. */ + + | TOK_Da { } + + /* The -v flag is ignored, and the is processed + as an ordinary source file. */ + | TOK_Dv TOK_STRING { process_file_name($2); fprintf(stderr, "%s:%u: Ignoring -v in front of %s\n", @1.text, @1.first_line, $2); free($2); } + + /* This rule matches "-y " sequences. This does the same thing + as -y on the command line, so add the path to the library + directory list. */ + | TOK_Dy TOK_STRING { process_library_switch($2); free($2); } - | TOK_INCDIR - { process_include_dir($1); - free($1); + + | TOK_DEFINE TOK_PLUSARG + { process_define($2); + free($2); } - | TOK_PLUSARG + + /* The +incdir token introduces a list of + arguments that are + the include directories to search. */ + + | TOK_INCDIR inc_args + + /* The + tokens that are not otherwise matched, are + ignored. The skip_args rule arranges for all the argument words + to be consumed. */ + + | TOK_PLUSWORD skip_args { fprintf(stderr, "%s:%u: Ignoring %s\n", @1.text, @1.first_line, $1); free($1); } + | TOK_PLUSWORD + { fprintf(stderr, "%s:%u: Ignoring %s\n", + @1.text, @1.first_line, $1); + free($1); + } + ; + + /* inc_args are +incdir+ arguments in order. */ +inc_args + : inc_args inc_arg + | inc_arg + ; + +inc_arg : TOK_PLUSARG + { process_include_dir($1); + free($1); + } + ; + + /* skip_args are arguments to a +word flag that is not otherwise + parsed. This rule matches them and releases the strings, so that + they can be safely ignored. */ +skip_args + : skip_args skip_arg + | skip_arg + ; + +skip_arg : TOK_PLUSARG + { free($1); + } ; %% diff --git a/driver/globals.h b/driver/globals.h index 0913fe56f..be967ff46 100644 --- a/driver/globals.h +++ b/driver/globals.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: globals.h,v 1.8 2001/11/12 18:47:32 steve Exp $" +#ident "$Id: globals.h,v 1.9 2001/11/13 03:30:26 steve Exp $" #endif # include @@ -60,6 +60,9 @@ extern void process_library_switch(const char*name); /* Add a new include file search directory */ extern void process_include_dir(const char*name); + /* Add a new -D define. */ +extern void process_define(const char*name); + /* -v */ extern int verbose_flag; @@ -74,6 +77,10 @@ extern int build_string(char*out, size_t olen, const char*pattern); /* * $Log: globals.h,v $ + * Revision 1.9 2001/11/13 03:30:26 steve + * The +incdir+ plusarg can take multiple directores, + * and add initial support for +define+ in the command file. + * * Revision 1.8 2001/11/12 18:47:32 steve * Support +incdir in command files, and ignore other * +args flags. Also ignore -a and -v flags. diff --git a/driver/main.c b/driver/main.c index 4d2e0dc61..366ef6e6d 100644 --- a/driver/main.c +++ b/driver/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#ident "$Id: main.c,v 1.28 2001/11/12 18:47:32 steve Exp $" +#ident "$Id: main.c,v 1.29 2001/11/13 03:30:26 steve Exp $" # include "config.h" @@ -299,6 +299,21 @@ void process_include_dir(const char *name) } } +void process_define(const char*name) +{ + if (def_list == 0) { + def_list = malloc(strlen(" -D")+strlen(name)+1); + strcpy(def_list, " -D"); + strcat(def_list, name); + } else { + def_list = realloc(def_list, strlen(def_list) + + strlen(" -D") + + strlen(name) + 1); + strcat(def_list, " -D"); + strcat(def_list, name); + } +} + void process_file_name(const char*name) { if (src_list) { @@ -372,17 +387,7 @@ int main(int argc, char **argv) strcpy(command_filename, optarg); break; case 'D': - if (def_list == 0) { - def_list = malloc(strlen(" -D")+strlen(optarg)+1); - strcpy(def_list, " -D"); - strcat(def_list, optarg); - } else { - def_list = realloc(def_list, strlen(def_list) - + strlen(" -D") - + strlen(optarg) + 1); - strcat(def_list, " -D"); - strcat(def_list, optarg); - } + process_define(optarg); break; case 'E': e_flag = 1; @@ -600,6 +605,10 @@ int main(int argc, char **argv) /* * $Log: main.c,v $ + * Revision 1.29 2001/11/13 03:30:26 steve + * The +incdir+ plusarg can take multiple directores, + * and add initial support for +define+ in the command file. + * * Revision 1.28 2001/11/12 18:47:32 steve * Support +incdir in command files, and ignore other * +args flags. Also ignore -a and -v flags.