Working on handling of -U

This commit is contained in:
Pierre Pronchery 2008-03-02 01:51:36 +00:00
parent 8fbb692fd9
commit c64bbfda5c

View File

@ -13,6 +13,8 @@
* You should have received a copy of the Creative Commons Attribution- * You should have received a copy of the Creative Commons Attribution-
* NonCommercial-ShareAlike 3.0 along with cpp; if not, browse to * NonCommercial-ShareAlike 3.0 along with cpp; if not, browse to
* http://creativecommons.org/licenses/by-nc-sa/3.0/ */ * http://creativecommons.org/licenses/by-nc-sa/3.0/ */
/* FIXME:
* - remove -t? (parse trigraphs by default) */
@ -36,6 +38,8 @@ typedef struct _Prefs
size_t paths_cnt; size_t paths_cnt;
const char ** defines; const char ** defines;
size_t defines_cnt; size_t defines_cnt;
const char ** undefines;
size_t undefines_cnt;
} Prefs; } Prefs;
#define PREFS_t 0x1 #define PREFS_t 0x1
@ -74,6 +78,7 @@ static int _cpp_do(Prefs * prefs, FILE * fp, char const * filename)
Cpp * cpp; Cpp * cpp;
size_t i; size_t i;
size_t j; size_t j;
size_t k;
Token * token; Token * token;
int code; int code;
@ -86,7 +91,11 @@ static int _cpp_do(Prefs * prefs, FILE * fp, char const * filename)
for(j = 0; j < prefs->defines_cnt; j++) for(j = 0; j < prefs->defines_cnt; j++)
if(cpp_define_add(cpp, prefs->defines[j], NULL) != 0) if(cpp_define_add(cpp, prefs->defines[j], NULL) != 0)
break; break;
if(i != prefs->paths_cnt || j != prefs->defines_cnt) for(k = 0; k < prefs->undefines_cnt; k++)
if(cpp_define_remove(cpp, prefs->undefines[k]) != 0)
break;
if(i != prefs->paths_cnt || j != prefs->defines_cnt
|| k != prefs->undefines_cnt)
{ {
cpp_delete(cpp); cpp_delete(cpp);
return 1; return 1;
@ -133,11 +142,12 @@ static int _cpp_error(void)
/* FIXME -E prints metadata? */ /* FIXME -E prints metadata? */
static int _usage(void) static int _usage(void)
{ {
fputs("Usage: " PACKAGE " [-D name[=value]]...[-I directory][-o outfile][-t] input...\n" fputs("Usage: " PACKAGE " [-D name[=value]]...[-I directory][-o outfile][-t][-U name]... input...\n"
" -D Add a substitution\n" " -D Add a substitution\n"
" -I Add a directory to the search path\n" " -I Add a directory to the search path\n"
" -o Write output to a file\n" " -o Write output to a file\n"
" -t Convert trigraphs\n", stderr); " -t Convert trigraphs\n"
" -U Remove a substitution\n", stderr);
return 1; return 1;
} }
@ -145,6 +155,7 @@ static int _usage(void)
/* main */ /* main */
static int _main_add_define(Prefs * name, char * define); static int _main_add_define(Prefs * name, char * define);
static int _main_add_path(Prefs * prefs, char const * path); static int _main_add_path(Prefs * prefs, char const * path);
static int _main_add_undefine(Prefs * prefs, char const * undefine);
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -153,7 +164,7 @@ int main(int argc, char * argv[])
int o; int o;
memset(&prefs, 0, sizeof(prefs)); memset(&prefs, 0, sizeof(prefs));
while((o = getopt(argc, argv, "D:I:o:t")) != -1) while((o = getopt(argc, argv, "D:I:o:tU:")) != -1)
switch(o) switch(o)
{ {
case 'D': case 'D':
@ -170,6 +181,10 @@ int main(int argc, char * argv[])
case 't': case 't':
prefs.flags |= PREFS_t; prefs.flags |= PREFS_t;
break; break;
case 'U':
if(_main_add_undefine(&prefs, optarg) != 0)
return 2;
break;
default: default:
return _usage(); return _usage();
} }
@ -207,3 +222,17 @@ static int _main_add_path(Prefs * prefs, char const * path)
prefs->paths[prefs->paths_cnt++] = path; prefs->paths[prefs->paths_cnt++] = path;
return 0; return 0;
} }
static int _main_add_undefine(Prefs * prefs, char const * undefine)
{
const char ** p;
if(strlen(undefine) == 0)
return 1;
if((p = realloc(prefs->undefines, sizeof(*p)
* (prefs->undefines_cnt + 1))) == NULL)
return error_set_print(PACKAGE, 1, "%s", strerror(errno));
prefs->undefines = p;
prefs->undefines[prefs->undefines_cnt++] = undefine;
return 0;
}