The +incdir+ plusarg can take multiple directores,

and add initial support for +define+ in the command file.
This commit is contained in:
steve 2001-11-13 03:30:26 +00:00
parent 9866fd01bd
commit f50074de50
4 changed files with 125 additions and 34 deletions

View File

@ -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. */
<PLUS_ARGS>[^\n \t\b\f\r+]* {
cflval.text = strdup(yytext);
return TOK_PLUSARG; }
/* Within plusargs, this is a delimiter. */
<PLUS_ARGS>"+" { }
/* White space end plus_args mode. */
<PLUS_ARGS>[ \t\b\f\r] { BEGIN(0); }
<PLUS_ARGS>\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;

View File

@ -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 <text> TOK_INCDIR TOK_PLUSARG TOK_STRING
%token TOK_DEFINE TOK_INCDIR
%token <text> 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 <libfile> flag is ignored, and the <libfile> 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 <path>" 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 +<path> arguments that are
the include directories to search. */
| TOK_INCDIR inc_args
/* The +<word> 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);
}
;
%%

View File

@ -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 <stddef.h>
@ -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.

View File

@ -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.