pptoken **output;
} ppmacro;
-typedef struct {
+typedef struct ftepp_s {
lex_file *lex;
int token;
unsigned int errors;
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);
- 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");
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);
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);
}
/* Like in parser.c - files keep the previous state so we have one global
* preprocessor. Except here we will want to warn about dangling #ifs.
*/
-static ftepp_t *ftepp;
-
-static bool ftepp_preprocess_done()
+static bool ftepp_preprocess_done(ftepp_t *ftepp)
{
bool retval = true;
if (vec_size(ftepp->conditions)) {
return retval;
}
-bool ftepp_preprocess_file(const char *filename)
+bool ftepp_preprocess_file(ftepp_t *ftepp, const char *filename)
{
ftepp->lex = lex_open(filename);
ftepp->itemname = util_strdup(filename);
}
if (!ftepp_preprocess(ftepp))
return false;
- return ftepp_preprocess_done();
+ return ftepp_preprocess_done(ftepp);
}
-bool ftepp_preprocess_string(const char *name, const char *str)
+bool ftepp_preprocess_string(ftepp_t *ftepp, const char *name, const char *str)
{
ftepp->lex = lex_open_string(str, strlen(str), name);
ftepp->itemname = util_strdup(name);
}
if (!ftepp_preprocess(ftepp))
return false;
- return ftepp_preprocess_done();
+ return ftepp_preprocess_done(ftepp);
}
-void ftepp_add_macro(const char *name, const char *value) {
+void ftepp_add_macro(ftepp_t *ftepp, const char *name, const char *value) {
char *create = NULL;
/* use saner path for empty macros */
if (!value) {
- ftepp_add_define("__builtin__", name);
+ ftepp_add_define(ftepp, "__builtin__", name);
return;
}
vec_upload(create, value, strlen(value));
vec_push (create, 0);
- ftepp_preprocess_string("__builtin__", create);
+ ftepp_preprocess_string(ftepp, "__builtin__", create);
vec_free (create);
}
-bool ftepp_init()
+ftepp_t *ftepp_create()
{
+ ftepp_t *ftepp;
char minor[32];
char major[32];
ftepp = ftepp_new();
if (!ftepp)
- return false;
+ return NULL;
memset(minor, 0, sizeof(minor));
memset(major, 0, sizeof(major));
/* set the right macro based on the selected standard */
- ftepp_add_define(NULL, "GMQCC");
+ ftepp_add_define(ftepp, NULL, "GMQCC");
if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_FTEQCC) {
- ftepp_add_define(NULL, "__STD_FTEQCC__");
+ ftepp_add_define(ftepp, NULL, "__STD_FTEQCC__");
/* 1.00 */
major[0] = '"';
major[1] = '1';
minor[1] = '0';
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);
+ ftepp_add_define(ftepp, NULL, "__STD_GMQCC__");
+ 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);
+ ftepp_add_define(ftepp, NULL, "__STD_QCCX__");
+ 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__");
+ ftepp_add_define(ftepp, NULL, "__STD_QCC__");
/* 1.0 */
major[0] = '"';
major[1] = '1';
minor[2] = '"';
}
- ftepp_add_macro("__STD_VERSION_MINOR__", minor);
- ftepp_add_macro("__STD_VERSION_MAJOR__", major);
+ ftepp_add_macro(ftepp, "__STD_VERSION_MINOR__", minor);
+ ftepp_add_macro(ftepp, "__STD_VERSION_MAJOR__", major);
- return true;
+ return ftepp;
}
-void ftepp_add_define(const char *source, const char *name)
+void ftepp_add_define(ftepp_t *ftepp, const char *source, const char *name)
{
ppmacro *macro;
lex_ctx ctx = { "__builtin__", 0 };
vec_push(ftepp->macros, macro);
}
-const char *ftepp_get()
+const char *ftepp_get(ftepp_t *ftepp)
{
return ftepp->output_string;
}
-void ftepp_flush()
+void ftepp_flush(ftepp_t *ftepp)
{
ftepp_flush_do(ftepp);
}
-void ftepp_finish()
+void ftepp_finish(ftepp_t *ftepp)
{
if (!ftepp)
return;
ftepp_delete(ftepp);
- ftepp = NULL;
}