Allow more than one command line include file.
Christopher Li
maintainerPATCH 1/1 Allow more than one command line include file.
Signed-off-by Christopher Li<[email protected]>
Index: sparse/pre-process.c
===================================================================
lib.c +26 -21
@@ -192,7 +192,10 @@ int Wdo_while = 1;int Wuninitialized =1 ;int preprocess_only;char *include; -int include_fd =-1 ; + +#define CMDLINE_INCLUDE 20 +int cmdline_include_nr =0 ; +struct cmdline_include cmdline_include[CMDLINE_INCLUDE ];void add_pre_buffer (const char *fmt, ...)
@@ -262,26 +265,26 @@ static char **handle_switch_I(char *arg,return next; } -static char **handle_switch_i (char *arg,char **next) +static void add_cmdline_include (char *filename) { -if (*next && !strcmp (arg,"include" )) { -char *name = *++next; -int fd =open (name,O_RDONLY ); - - include_fd = fd; - include = name; -if (fd <0 ) -perror (name); - } -if (*next && !strcmp (arg,"imacros" )) { -char *name = *++next; -int fd =open (name,O_RDONLY ); +int fd =open (filename,O_RDONLY ); +if (fd <0 ) { +perror (filename); +return ; + } +if (cmdline_include_nr >=CMDLINE_INCLUDE ) +die ("too many include files for %s\n" , filename); + cmdline_include[cmdline_include_nr].filename = filename; + cmdline_include[cmdline_include_nr].fd = fd; + cmdline_include_nr++; +} - include_fd = fd; - include = name; -if (fd <0 ) -perror (name); - } +static char **handle_switch_i (char *arg,char **next) +{ +if (*next && !strcmp (arg,"include" )) +add_cmdline_include (*++next); +else if (*next && !strcmp (arg,"imacros" )) +add_cmdline_include (*++next);else if (*next && !strcmp (arg,"isystem" )) {char *path = *++next;if (!path)
@@ -623,12 +626,14 @@ static struct symbol_list *sparse_file(cstatic struct symbol_list *sparse_initial (void ) {struct token *token; +int i;// Prepend any "include" file to the stream. // We're in global scope, it will affect all files! token =NULL ; -if (include_fd >=0 ) - token =tokenize (include, include_fd,NULL , includepath); +for (i = cmdline_include_nr -1 ; i >=0 ; i--) + token =tokenize (cmdline_include[i].filename, cmdline_include[i].fd, + token, includepath);// Prepend the initial built-in stream token =tokenize_buffer (pre_buffer, pre_buffer_size, token);
Index: sparse/token.h
===================================================================
lib.h +9 -0
@@ -33,6 +33,15 @@ struct position { noexpand:1 ; }; +struct cmdline_include { +char *filename; +int fd; +}; + +extern struct cmdline_include cmdline_include[]; +extern int cmdline_include_nr; + +struct ident ;struct token ;struct symbol ;
lib.c int Wdo_while = 1; · line 198
Quoted 11 lines · Christopher Li
lib.c +4
-1@@ -192,7 +192,10 @@ int Wdo_while = 1;int Wuninitialized =1 ;int preprocess_only;char *include; -int include_fd =-1 ; + +#define CMDLINE_INCLUDE 20 +int cmdline_include_nr =0 ; +struct cmdline_include cmdline_include[CMDLINE_INCLUDE ];
[...]
I've accepted this patch for now, since a larger finite limit will solve the current problem. I'd really like to see something which handles an arbitrary number of include files, though. Also, ideally Sparse could read each filename, parse that include file, and close it, rather than keeping all the include files open; doing something like that might even avoid the need to keep them around in an array.
- Josh Triplett