mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-01-19 06:40:49 +00:00
Implemented #warning and #error preprocessor directives, they're functionally equivalent to CPPs (supporting both string constant and non-string constant versions). Warnings however are printed with a [-Wunused-variable] which isn't correct (TODO: allow systematic changes of -W paramaters in relation to warning fields for preprocessor directives.
This commit is contained in:
parent
c7a62970a6
commit
36a90bb866
1 changed files with 56 additions and 0 deletions
56
ftepp.c
56
ftepp.c
|
@ -1010,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, LVL_WARNING, message);
|
||||
vec_free(message);
|
||||
return;
|
||||
}
|
||||
|
||||
unescape (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
|
||||
(void)!!ftepp_warn(ftepp, LVL_WARNING, "#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?
|
||||
|
@ -1205,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));
|
||||
|
|
Loading…
Reference in a new issue