From c60e0f9f4a0783e530b9d8b6e650a05ccadaba31 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 2 Mar 2008 01:43:43 +0000 Subject: [PATCH] Working on defines --- src/c99.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/c99.c b/src/c99.c index 46f2d9f..43e4597 100644 --- a/src/c99.c +++ b/src/c99.c @@ -33,6 +33,10 @@ typedef struct _Prefs char const * outfile; const char ** paths; size_t paths_cnt; + char ** defines; + size_t defines_cnt; + char ** undefines; + size_t undefines_cnt; } Prefs; #define PREFS_c 0x1 #define PREFS_E 0x2 @@ -132,15 +136,24 @@ static int _c99_do_E(Prefs * prefs, FILE * outfp, char const * infile, int ret; Cpp * cpp; size_t i; + size_t j; + size_t k; Token * token; int code; if((cpp = cpp_new(infile, CPP_FILTER_TRIGRAPH)) == NULL) return 1; for(i = 0; i < prefs->paths_cnt; i++) - if(cpp_add_path(cpp, prefs->paths[i]) != 0) + if(cpp_path_add(cpp, prefs->paths[i]) != 0) break; - if(i != prefs->paths_cnt) + for(j = 0; j < prefs->defines_cnt; j++) + if(cpp_define_add(cpp, prefs->defines[j], NULL) != 0) + break; + 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); return 1; @@ -184,7 +197,9 @@ static int _usage(void) /* public */ /* main */ +static int _main_add_define(Prefs * prefs, char * define); static int _main_add_path(Prefs * prefs, char const * path); +static int _main_add_undefine(Prefs * prefs, char * undefine); int main(int argc, char * argv[]) { @@ -198,6 +213,10 @@ int main(int argc, char * argv[]) case 'c': prefs.flags |= PREFS_c; break; + case 'D': + if(_main_add_define(&prefs, optarg) != 0) + return 2; + break; case 'E': prefs.flags |= PREFS_E; break; @@ -214,6 +233,9 @@ int main(int argc, char * argv[]) case 's': prefs.flags |= PREFS_s; break; + case 'U': + if(_main_add_undefine(&prefs, optarg) != 0) + return 2; default: return _usage(); } @@ -224,6 +246,22 @@ int main(int argc, char * argv[]) return _c99(&prefs, argc - optind, &argv[optind]) == 0 ? 0 : 2; } +static int _main_add_define(Prefs * prefs, char * define) +{ + char ** p; + char * value; + + if(strlen(define) == 0) + return 1; + value = strtok(define, "="); + if((p = realloc(prefs->defines, sizeof(*p) * (prefs->defines_cnt + 1))) + == NULL) + return error_set_print(PACKAGE, 1, "%s", strerror(errno)); + prefs->defines = p; + prefs->defines[prefs->defines_cnt++] = define; + return 0; +} + static int _main_add_path(Prefs * prefs, char const * path) { const char ** p; @@ -235,3 +273,17 @@ static int _main_add_path(Prefs * prefs, char const * path) prefs->paths[prefs->paths_cnt++] = path; return 0; } + +static int _main_add_undefine(Prefs * prefs, char * undefine) +{ + 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; +}