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; pptoken **output;
} ppmacro; } ppmacro;
typedef struct { typedef struct ftepp_s {
lex_file *lex; lex_file *lex;
int token; int token;
unsigned int errors; 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 /* 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. * preprocessor. Except here we will want to warn about dangling #ifs.
*/ */
static ftepp_t *ftepp; static bool ftepp_preprocess_done(ftepp_t *ftepp)
static bool ftepp_preprocess_done()
{ {
bool retval = true; bool retval = true;
if (vec_size(ftepp->conditions)) { if (vec_size(ftepp->conditions)) {
@ -1731,7 +1729,7 @@ static bool ftepp_preprocess_done()
return retval; 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->lex = lex_open(filename);
ftepp->itemname = util_strdup(filename); ftepp->itemname = util_strdup(filename);
@ -1741,10 +1739,10 @@ bool ftepp_preprocess_file(const char *filename)
} }
if (!ftepp_preprocess(ftepp)) if (!ftepp_preprocess(ftepp))
return false; 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->lex = lex_open_string(str, strlen(str), name);
ftepp->itemname = util_strdup(name); ftepp->itemname = util_strdup(name);
@ -1754,16 +1752,16 @@ bool ftepp_preprocess_string(const char *name, const char *str)
} }
if (!ftepp_preprocess(ftepp)) if (!ftepp_preprocess(ftepp))
return false; 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; char *create = NULL;
/* use saner path for empty macros */ /* use saner path for empty macros */
if (!value) { if (!value) {
ftepp_add_define("__builtin__", name); ftepp_add_define(ftepp, "__builtin__", name);
return; return;
} }
@ -1773,26 +1771,27 @@ void ftepp_add_macro(const char *name, const char *value) {
vec_upload(create, value, strlen(value)); vec_upload(create, value, strlen(value));
vec_push (create, 0); vec_push (create, 0);
ftepp_preprocess_string("__builtin__", create); ftepp_preprocess_string(ftepp, "__builtin__", create);
vec_free (create); vec_free (create);
} }
bool ftepp_init() ftepp_t *ftepp_create()
{ {
ftepp_t *ftepp;
char minor[32]; char minor[32];
char major[32]; char major[32];
ftepp = ftepp_new(); ftepp = ftepp_new();
if (!ftepp) if (!ftepp)
return false; return NULL;
memset(minor, 0, sizeof(minor)); memset(minor, 0, sizeof(minor));
memset(major, 0, sizeof(major)); memset(major, 0, sizeof(major));
/* set the right macro based on the selected standard */ /* 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) { if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_FTEQCC) {
ftepp_add_define(NULL, "__STD_FTEQCC__"); ftepp_add_define(ftepp, NULL, "__STD_FTEQCC__");
/* 1.00 */ /* 1.00 */
major[0] = '"'; major[0] = '"';
major[1] = '1'; major[1] = '1';
@ -1802,15 +1801,15 @@ bool ftepp_init()
minor[1] = '0'; minor[1] = '0';
minor[2] = '"'; minor[2] = '"';
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_GMQCC) { } 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(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR); snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCCX) { } 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(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR); snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
} else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCC) { } else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCC) {
ftepp_add_define(NULL, "__STD_QCC__"); ftepp_add_define(ftepp, NULL, "__STD_QCC__");
/* 1.0 */ /* 1.0 */
major[0] = '"'; major[0] = '"';
major[1] = '1'; major[1] = '1';
@ -1821,13 +1820,13 @@ bool ftepp_init()
minor[2] = '"'; minor[2] = '"';
} }
ftepp_add_macro("__STD_VERSION_MINOR__", minor); ftepp_add_macro(ftepp, "__STD_VERSION_MINOR__", minor);
ftepp_add_macro("__STD_VERSION_MAJOR__", major); 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; ppmacro *macro;
lex_ctx ctx = { "__builtin__", 0 }; lex_ctx ctx = { "__builtin__", 0 };
@ -1836,20 +1835,19 @@ void ftepp_add_define(const char *source, const char *name)
vec_push(ftepp->macros, macro); vec_push(ftepp->macros, macro);
} }
const char *ftepp_get() const char *ftepp_get(ftepp_t *ftepp)
{ {
return ftepp->output_string; return ftepp->output_string;
} }
void ftepp_flush() void ftepp_flush(ftepp_t *ftepp)
{ {
ftepp_flush_do(ftepp); ftepp_flush_do(ftepp);
} }
void ftepp_finish() void ftepp_finish(ftepp_t *ftepp)
{ {
if (!ftepp) if (!ftepp)
return; return;
ftepp_delete(ftepp); ftepp_delete(ftepp);
ftepp = NULL;
} }

18
gmqcc.h
View file

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