More perliminary reworking for threading

This commit is contained in:
Dale Weiler 2013-04-17 06:30:09 +00:00
parent 21c6079b7a
commit d7be99c9dd
3 changed files with 46 additions and 44 deletions

50
ftepp.c
View file

@ -55,7 +55,7 @@ typedef struct {
pptoken **output;
} ppmacro;
typedef struct {
typedef struct ftepp_s {
lex_file *lex;
int token;
unsigned int errors;
@ -1713,9 +1713,7 @@ static bool ftepp_preprocess(ftepp_t *ftepp)
/* 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)) {
@ -1731,7 +1729,7 @@ static bool ftepp_preprocess_done()
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);
@ -1741,10 +1739,10 @@ bool ftepp_preprocess_file(const char *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);
@ -1754,16 +1752,16 @@ bool ftepp_preprocess_string(const char *name, const char *str)
}
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;
}
@ -1773,26 +1771,27 @@ void ftepp_add_macro(const char *name, const char *value) {
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';
@ -1802,15 +1801,15 @@ bool ftepp_init()
minor[1] = '0';
minor[2] = '"';
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_GMQCC) {
ftepp_add_define(NULL, "__STD_GMQCC__");
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__");
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';
@ -1821,13 +1820,13 @@ bool ftepp_init()
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 };
@ -1836,20 +1835,19 @@ void ftepp_add_define(const char *source, const char *name)
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;
}

18
gmqcc.h
View file

@ -1038,6 +1038,8 @@ void parser_cleanup (struct parser_s *parser);
/*====================== ftepp.c commandline ========================*/
/*===================================================================*/
struct lex_file_s;
struct ftepp_s;
typedef struct {
const char *name;
char *(*func)(struct lex_file_s *);
@ -1049,14 +1051,14 @@ typedef struct {
*/
#define FTEPP_PREDEF_COUNT 8
bool ftepp_init ();
bool ftepp_preprocess_file (const char *filename);
bool ftepp_preprocess_string(const char *name, const char *str);
void ftepp_finish ();
const char *ftepp_get ();
void ftepp_flush ();
void ftepp_add_define (const char *source, const char *name);
void ftepp_add_macro (const char *name, const char *value);
struct ftepp_s *ftepp_create ();
bool ftepp_preprocess_file (struct ftepp_s *ftepp, const char *filename);
bool ftepp_preprocess_string(struct ftepp_s *ftepp, const char *name, const char *str);
void ftepp_finish (struct ftepp_s *ftepp);
const char *ftepp_get (struct ftepp_s *ftepp);
void ftepp_flush (struct ftepp_s *ftepp);
void ftepp_add_define (struct ftepp_s *ftepp, const char *source, const char *name);
void ftepp_add_macro (struct ftepp_s *ftepp, const char *name, const char *value);
extern const ftepp_predef_t ftepp_predefs[FTEPP_PREDEF_COUNT];

22
main.c
View file

@ -553,6 +553,7 @@ int main(int argc, char **argv) {
bool progs_src = false;
FILE *outfile = NULL;
struct parser_s *parser = NULL;
struct ftepp_s *ftepp = NULL;
app_name = argv[0];
con_init ();
@ -635,7 +636,7 @@ int main(int argc, char **argv) {
}
if (OPTS_OPTION_BOOL(OPTION_PP_ONLY) || OPTS_FLAG(FTEPP)) {
if (!ftepp_init()) {
if (!(ftepp = ftepp_create())) {
con_err("failed to initialize parser\n");
retval = 1;
goto cleanup;
@ -650,7 +651,7 @@ int main(int argc, char **argv) {
/* add macros */
if (OPTS_OPTION_BOOL(OPTION_PP_ONLY) || OPTS_FLAG(FTEPP)) {
for (itr = 0; itr < vec_size(ppems); itr++) {
ftepp_add_macro(ppems[itr].name, ppems[itr].value);
ftepp_add_macro(ftepp, ppems[itr].name, ppems[itr].value);
mem_d(ppems[itr].name);
/* can be null */
@ -709,6 +710,7 @@ srcdone:
con_out("Mode: %s\n", (progs_src ? "progs.src" : "manual"));
con_out("There are %lu items to compile:\n", (unsigned long)vec_size(items));
}
for (itr = 0; itr < vec_size(items); ++itr) {
if (!OPTS_OPTION_BOOL(OPTION_QUIET) &&
!OPTS_OPTION_BOOL(OPTION_PP_ONLY))
@ -723,30 +725,30 @@ srcdone:
if (OPTS_OPTION_BOOL(OPTION_PP_ONLY)) {
const char *out;
if (!ftepp_preprocess_file(items[itr].filename)) {
if (!ftepp_preprocess_file(ftepp, items[itr].filename)) {
retval = 1;
goto cleanup;
}
out = ftepp_get();
out = ftepp_get(ftepp);
if (out)
fs_file_printf(outfile, "%s", out);
ftepp_flush();
ftepp_flush(ftepp);
}
else {
if (OPTS_FLAG(FTEPP)) {
const char *data;
if (!ftepp_preprocess_file(items[itr].filename)) {
if (!ftepp_preprocess_file(ftepp, items[itr].filename)) {
retval = 1;
goto cleanup;
}
data = ftepp_get();
data = ftepp_get(ftepp);
if (vec_size(data)) {
if (!parser_compile_string(parser, items[itr].filename, data, vec_size(data))) {
retval = 1;
goto cleanup;
}
}
ftepp_flush();
ftepp_flush(ftepp);
}
else {
if (!parser_compile_file(parser, items[itr].filename)) {
@ -762,7 +764,7 @@ srcdone:
}
}
ftepp_finish();
ftepp_finish(ftepp);
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY)) {
if (!parser_finish(parser, OPTS_OPTION_STR(OPTION_OUTPUT))) {
retval = 1;
@ -784,7 +786,7 @@ srcdone:
cleanup:
util_debug("COM", "cleaning ...\n");
ftepp_finish();
ftepp_finish(ftepp);
con_close();
vec_free(items);
vec_free(ppems);