X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ftepp.c;h=96c20bf4f937f7ad0d55c9050e31b6813a3ab1a3;hb=7efc3a4c2148338d9e0dac7e79a680f9219f15cd;hp=84c17199e104bb840496829d461e8a6ca1089853;hpb=37ccf1976968c83c47ee0dfd958a453913cf1b1e;p=xonotic%2Fgmqcc.git diff --git a/ftepp.c b/ftepp.c index 84c1719..96c20bf 100644 --- a/ftepp.c +++ b/ftepp.c @@ -95,21 +95,13 @@ static void ftepp_error(ftepp_t *ftepp, const char *fmt, ...) static bool GMQCC_WARN ftepp_warn(ftepp_t *ftepp, int warntype, const char *fmt, ...) { + bool r; va_list ap; - int lvl = LVL_WARNING; - - if (!OPTS_WARN(warntype)) - return false; - - if (opts_werror) { - lvl = LVL_ERROR; - ftepp->errors++; - } va_start(ap, fmt); - con_cvprintmsg((void*)&ftepp->lex->tok.ctx, lvl, "error", fmt, ap); + r = vcompile_warning(ftepp->lex->tok.ctx, warntype, fmt, ap); va_end(ap); - return opts_werror; + return r; } static pptoken *pptoken_make(ftepp_t *ftepp) @@ -225,7 +217,7 @@ static void ftepp_macro_delete(ftepp_t *ftepp, const char *name) } } -static inline int ftepp_next(ftepp_t *ftepp) +static GMQCC_INLINE int ftepp_next(ftepp_t *ftepp) { return (ftepp->token = lex_do(ftepp->lex)); } @@ -1018,6 +1010,54 @@ static char *ftepp_include_find(ftepp_t *ftepp, const char *file) return filename; } +static void ftepp_directive_warning(ftepp_t *ftepp) { + char *message = NULL; + + if (!ftepp_skipspace(ftepp)) + return; + + /* handle the odd non string constant case so it works like C */ + if (ftepp->token != TOKEN_STRINGCONST) { + vec_upload(message, "#warning", 8); + ftepp_next(ftepp); + while (ftepp->token != TOKEN_EOL) { + vec_upload(message, ftepp_tokval(ftepp), strlen(ftepp_tokval(ftepp))); + ftepp_next(ftepp); + } + vec_push(message, '\0'); + (void)!!ftepp_warn(ftepp, WARN_CPP, message); + vec_free(message); + return; + } + + unescape (ftepp_tokval(ftepp), ftepp_tokval(ftepp)); + (void)!!ftepp_warn(ftepp, WARN_CPP, "#warning %s", ftepp_tokval(ftepp)); +} + +static void ftepp_directive_error(ftepp_t *ftepp) { + char *message = NULL; + + if (!ftepp_skipspace(ftepp)) + return; + + /* handle the odd non string constant case so it works like C */ + if (ftepp->token != TOKEN_STRINGCONST) { + vec_upload(message, "#error", 6); + ftepp_next(ftepp); + while (ftepp->token != TOKEN_EOL) { + vec_upload(message, ftepp_tokval(ftepp), strlen(ftepp_tokval(ftepp))); + ftepp_next(ftepp); + } + vec_push(message, '\0'); + ftepp_error(ftepp, message); + vec_free(message); + return; + } + + unescape (ftepp_tokval(ftepp), ftepp_tokval(ftepp)); + ftepp_error(ftepp, "#error %s", ftepp_tokval(ftepp)); +} + /** * Include a file. * FIXME: do we need/want a -I option? @@ -1213,6 +1253,14 @@ static bool ftepp_hash(ftepp_t *ftepp) ftepp_out(ftepp, "#", false); break; } + else if (!strcmp(ftepp_tokval(ftepp), "warning")) { + ftepp_directive_warning(ftepp); + break; + } + else if (!strcmp(ftepp_tokval(ftepp), "error")) { + ftepp_directive_error(ftepp); + break; + } else { if (ftepp->output_on) { ftepp_error(ftepp, "unrecognized preprocessor directive: `%s`", ftepp_tokval(ftepp)); @@ -1366,12 +1414,30 @@ bool ftepp_preprocess_string(const char *name, const char *str) return ftepp_preprocess_done(); } + +void ftepp_add_macro(const char *name, const char *value) { + char *create = NULL; + + /* use saner path for empty macros */ + if (!value) { + ftepp_add_define("__builtin__", name); + return; + } + + vec_upload(create, "#define ", 8); + vec_upload(create, name, strlen(name)); + vec_push (create, ' '); + vec_upload(create, value, strlen(value)); + vec_push (create, 0); + + ftepp_preprocess_string("__builtin__", create); + vec_free (create); +} + bool ftepp_init() { char minor[32]; char major[32]; - char *verminor = NULL; - char *vermajor = NULL; ftepp = ftepp_new(); if (!ftepp) @@ -1382,34 +1448,35 @@ bool ftepp_init() /* set the right macro based on the selected standard */ ftepp_add_define(NULL, "GMQCC"); - if (opts_standard == COMPILER_FTEQCC) { + if (opts.standard == COMPILER_FTEQCC) { ftepp_add_define(NULL, "__STD_FTEQCC__"); /* 1.00 */ - major[0] = '1'; - minor[0] = '0'; - } else if (opts_standard == COMPILER_GMQCC) { + major[0] = '"'; + major[1] = '1'; + major[2] = '"'; + + minor[0] = '"'; + minor[1] = '0'; + minor[2] = '"'; + } else if (opts.standard == COMPILER_GMQCC) { ftepp_add_define(NULL, "__STD_GMQCC__"); - sprintf(major, "%d", GMQCC_VERSION_MAJOR); - sprintf(minor, "%d", GMQCC_VERSION_MINOR); - } else if (opts_standard == COMPILER_QCC) { + sprintf(major, "\"%d\"", GMQCC_VERSION_MAJOR); + sprintf(minor, "\"%d\"", GMQCC_VERSION_MINOR); + } else if (opts.standard == COMPILER_QCC) { ftepp_add_define(NULL, "__STD_QCC__"); /* 1.0 */ - major[0] = '1'; - minor[0] = '0'; - } + major[0] = '"'; + major[1] = '1'; + major[2] = '"'; - vec_upload(verminor, "#define __STD_VERSION_MINOR__ \"", 31); - vec_upload(vermajor, "#define __STD_VERSION_MAJOR__ \"", 31); - vec_upload(verminor, minor, strlen(minor)); - vec_upload(vermajor, major, strlen(major)); - vec_push (verminor, '"'); - vec_push (vermajor, '"'); + minor[0] = '"'; + minor[1] = '0'; + minor[2] = '"'; + } - ftepp_preprocess_string("__builtin__", verminor); - ftepp_preprocess_string("__builtin__", vermajor); + ftepp_add_macro("__STD_VERSION_MINOR__", minor); + ftepp_add_macro("__STD_VERSION_MAJOR__", major); - vec_free(verminor); - vec_free(vermajor); return true; }