char *ftepp_predef_date(lex_file *context) {
struct tm *itime;
time_t rtime;
- char *value = mem_a(82);
+ char *value = (char*)mem_a(82);
/* 82 is enough for strftime but we also have " " in our string */
(void)context;
char *ftepp_predef_time(lex_file *context) {
struct tm *itime;
time_t rtime;
- char *value = mem_a(82);
+ char *value = (char*)mem_a(82);
/* 82 is enough for strftime but we also have " " in our string */
(void)context;
char *ftepp_predef_file(lex_file *context) {
size_t length = strlen(context->name) + 3; /* two quotes and a terminator */
char *value = (char*)mem_a(length);
- memset (value, 0, length);
- sprintf(value, "\"%s\"", context->name);
+ snprintf(value, length, "\"%s\"", context->name);
return value;
}
return false;
}
} while (ftepp->token == ',');
+
if (ftepp->token != ')') {
ftepp_error(ftepp, "expected closing paren after macro parameter list");
return false;
return false;
}
- index = atoi(ftepp_tokval(ftepp));
+ index = (int)strtol(ftepp_tokval(ftepp), NULL, 10);
if (ftepp_next(ftepp) != ']') {
ftepp_error(ftepp, "expected `]` in __VA_ARGS__ subscript");
ftepp->token = old;
}
}
- else
- {
+ else if (macro->variadic && !strcmp(ftepp_tokval(ftepp), "__VA_COUNT__")) {
+ ftepp->token = TOKEN_VA_COUNT;
+ ptok = pptoken_make(ftepp);
+ vec_push(macro->output, ptok);
+ ftepp_next(ftepp);
+ } else {
ptok = pptoken_make(ftepp);
vec_push(macro->output, ptok);
ftepp_next(ftepp);
static bool ftepp_define(ftepp_t *ftepp)
{
- ppmacro *macro;
+ ppmacro *macro = NULL;
size_t l = ftepp_ctx(ftepp).line;
(void)ftepp_next(ftepp);
if (ftepp->token == '(') {
macro->has_params = true;
- if (!ftepp_define_params(ftepp, macro))
+ if (!ftepp_define_params(ftepp, macro)) {
+ ppmacro_delete(macro);
return false;
+ }
}
- if (!ftepp_skipspace(ftepp))
+ if (!ftepp_skipspace(ftepp)) {
+ ppmacro_delete(macro);
return false;
+ }
- if (!ftepp_define_body(ftepp, macro))
+ if (!ftepp_define_body(ftepp, macro)) {
+ ppmacro_delete(macro);
return false;
+ }
if (ftepp->output_on)
vec_push(ftepp->macros, macro);
static bool ftepp_preprocess(ftepp_t *ftepp);
static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *params, bool resetline)
{
+ char *buffer = NULL;
char *old_string = ftepp->output_string;
char *inner_string;
lex_file *old_lexer = ftepp->lex;
ftepp_param_out(ftepp, ¶ms[out->constval.i + vararg_start]);
break;
+ case TOKEN_VA_COUNT:
+ util_asprintf(&buffer, "%d", varargs);
+ ftepp_out(ftepp, buffer, false);
+ mem_d(buffer);
+ break;
+
case TOKEN_IDENT:
case TOKEN_TYPENAME:
case TOKEN_KEYWORD:
if (resetline && !ftepp->in_macro) {
char lineno[128];
- sprintf(lineno, "\n#pragma line(%lu)\n", (unsigned long)(old_lexer->sline));
+ snprintf(lineno, 128, "\n#pragma line(%lu)\n", (unsigned long)(old_lexer->sline));
ftepp_out(ftepp, lineno, false);
}
memcpy(vec_add(filename, len+1), file, len);
vec_last(filename) = 0;
- fp = file_open(filename, "rb");
+ fp = fs_file_open(filename, "rb");
if (fp) {
- file_close(fp);
+ fs_file_close(fp);
return filename;
}
vec_free(filename);
ftepp_next(ftepp);
}
vec_push(message, '\0');
- store = ftepp_warn(ftepp, WARN_CPP, message);
+ if (ftepp->output_on)
+ store = ftepp_warn(ftepp, WARN_CPP, message);
+ else
+ store = false;
vec_free(message);
return store;
}
+ if (!ftepp->output_on)
+ return false;
+
unescape (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
return ftepp_warn(ftepp, WARN_CPP, "#warning %s", ftepp_tokval(ftepp));
}
ftepp_next(ftepp);
}
vec_push(message, '\0');
- ftepp_error(ftepp, message);
+ if (ftepp->output_on)
+ ftepp_error(ftepp, message);
vec_free(message);
return;
}
+ if (!ftepp->output_on)
+ return;
+
unescape (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
ftepp_error(ftepp, "#error %s", ftepp_tokval(ftepp));
}
ftepp_next(ftepp);
}
vec_push(message, '\0');
- con_cprintmsg(&ftepp->lex->tok.ctx, LVL_MSG, "message", message);
+ if (ftepp->output_on)
+ con_cprintmsg(&ftepp->lex->tok.ctx, LVL_MSG, "message", message);
vec_free(message);
return;
}
+ if (!ftepp->output_on)
+ return;
+
unescape (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
con_cprintmsg(&ftepp->lex->tok.ctx, LVL_MSG, "message", ftepp_tokval(ftepp));
}
return false;
}
+ if (!ftepp->output_on) {
+ ftepp_next(ftepp);
+ return true;
+ }
+
ctx = ftepp_ctx(ftepp);
unescape(ftepp_tokval(ftepp), ftepp_tokval(ftepp));
minor[2] = '"';
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_GMQCC) {
ftepp_add_define(NULL, "__STD_GMQCC__");
- sprintf(major, "\"%d\"", GMQCC_VERSION_MAJOR);
- sprintf(minor, "\"%d\"", GMQCC_VERSION_MINOR);
+ snprintf(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
+ snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCCX) {
ftepp_add_define(NULL, "__STD_QCCX__");
- sprintf(major, "\"%d\"", GMQCC_VERSION_MAJOR);
- sprintf(minor, "\"%d\"", GMQCC_VERSION_MINOR);
+ snprintf(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
+ snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCC) {
ftepp_add_define(NULL, "__STD_QCC__");
/* 1.0 */