mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-02-21 02:40:56 +00:00
Perliminary parser reworking, required for the proposed multithreading.
This commit is contained in:
parent
b82efcf0ce
commit
1f0a1b8140
3 changed files with 32 additions and 30 deletions
11
gmqcc.h
11
gmqcc.h
|
@ -1026,12 +1026,13 @@ qcint prog_tempstring(qc_program *prog, const char *_str);
|
|||
/*===================================================================*/
|
||||
/*===================== parser.c commandline ========================*/
|
||||
/*===================================================================*/
|
||||
struct parser_s;
|
||||
|
||||
bool parser_init ();
|
||||
bool parser_compile_file (const char *);
|
||||
bool parser_compile_string(const char *, const char *, size_t);
|
||||
bool parser_finish (const char *);
|
||||
void parser_cleanup ();
|
||||
struct parser_s *parser_create ();
|
||||
bool parser_compile_file (struct parser_s *parser, const char *);
|
||||
bool parser_compile_string(struct parser_s *parser, const char *, const char *, size_t);
|
||||
bool parser_finish (struct parser_s *parser, const char *);
|
||||
void parser_cleanup (struct parser_s *parser);
|
||||
|
||||
/*===================================================================*/
|
||||
/*====================== ftepp.c commandline ========================*/
|
||||
|
|
23
main.c
23
main.c
|
@ -546,12 +546,13 @@ static bool progs_nextline(char **out, size_t *alen,FILE *src) {
|
|||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
size_t itr;
|
||||
int retval = 0;
|
||||
bool opts_output_free = false;
|
||||
bool operators_free = false;
|
||||
bool progs_src = false;
|
||||
FILE *outfile = NULL;
|
||||
size_t itr;
|
||||
int retval = 0;
|
||||
bool opts_output_free = false;
|
||||
bool operators_free = false;
|
||||
bool progs_src = false;
|
||||
FILE *outfile = NULL;
|
||||
struct parser_s *parser = NULL;
|
||||
|
||||
app_name = argv[0];
|
||||
con_init ();
|
||||
|
@ -626,7 +627,7 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
|
||||
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY)) {
|
||||
if (!parser_init()) {
|
||||
if (!(parser = parser_create())) {
|
||||
con_err("failed to initialize parser\n");
|
||||
retval = 1;
|
||||
goto cleanup;
|
||||
|
@ -740,7 +741,7 @@ srcdone:
|
|||
}
|
||||
data = ftepp_get();
|
||||
if (vec_size(data)) {
|
||||
if (!parser_compile_string(items[itr].filename, data, vec_size(data))) {
|
||||
if (!parser_compile_string(parser, items[itr].filename, data, vec_size(data))) {
|
||||
retval = 1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -748,7 +749,7 @@ srcdone:
|
|||
ftepp_flush();
|
||||
}
|
||||
else {
|
||||
if (!parser_compile_file(items[itr].filename)) {
|
||||
if (!parser_compile_file(parser, items[itr].filename)) {
|
||||
retval = 1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -763,7 +764,7 @@ srcdone:
|
|||
|
||||
ftepp_finish();
|
||||
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY)) {
|
||||
if (!parser_finish(OPTS_OPTION_STR(OPTION_OUTPUT))) {
|
||||
if (!parser_finish(parser, OPTS_OPTION_STR(OPTION_OUTPUT))) {
|
||||
retval = 1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -789,7 +790,7 @@ cleanup:
|
|||
vec_free(ppems);
|
||||
|
||||
if (!OPTS_OPTION_BOOL(OPTION_PP_ONLY))
|
||||
parser_cleanup();
|
||||
parser_cleanup(parser);
|
||||
if (opts_output_free)
|
||||
mem_d(OPTS_OPTION_STR(OPTION_OUTPUT));
|
||||
if (operators_free)
|
||||
|
|
28
parser.c
28
parser.c
|
@ -35,7 +35,7 @@
|
|||
#define PARSER_HT_SIZE 128
|
||||
#define TYPEDEF_HT_SIZE 16
|
||||
|
||||
typedef struct {
|
||||
typedef struct parser_s {
|
||||
lex_file *lex;
|
||||
int tok;
|
||||
|
||||
|
@ -5911,16 +5911,15 @@ static void generate_checksum(parser_t *parser)
|
|||
code_crc = crc;
|
||||
}
|
||||
|
||||
static parser_t *parser;
|
||||
|
||||
bool parser_init()
|
||||
parser_t *parser_create()
|
||||
{
|
||||
parser_t *parser;
|
||||
lex_ctx empty_ctx;
|
||||
size_t i;
|
||||
|
||||
parser = (parser_t*)mem_a(sizeof(parser_t));
|
||||
if (!parser)
|
||||
return false;
|
||||
return NULL;
|
||||
|
||||
memset(parser, 0, sizeof(*parser));
|
||||
|
||||
|
@ -5933,7 +5932,7 @@ bool parser_init()
|
|||
if (!parser->assign_op) {
|
||||
printf("internal error: initializing parser: failed to find assign operator\n");
|
||||
mem_d(parser);
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vec_push(parser->variables, parser->htfields = util_htnew(PARSER_HT_SIZE));
|
||||
|
@ -5969,10 +5968,11 @@ bool parser_init()
|
|||
} else {
|
||||
parser->reserved_version = NULL;
|
||||
}
|
||||
return true;
|
||||
|
||||
return parser;
|
||||
}
|
||||
|
||||
bool parser_compile()
|
||||
bool parser_compile(parser_t *parser)
|
||||
{
|
||||
/* initial lexer/parser state */
|
||||
parser->lex->flags.noops = true;
|
||||
|
@ -6004,27 +6004,27 @@ bool parser_compile()
|
|||
return !compile_errors;
|
||||
}
|
||||
|
||||
bool parser_compile_file(const char *filename)
|
||||
bool parser_compile_file(parser_t *parser, const char *filename)
|
||||
{
|
||||
parser->lex = lex_open(filename);
|
||||
if (!parser->lex) {
|
||||
con_err("failed to open file \"%s\"\n", filename);
|
||||
return false;
|
||||
}
|
||||
return parser_compile();
|
||||
return parser_compile(parser);
|
||||
}
|
||||
|
||||
bool parser_compile_string(const char *name, const char *str, size_t len)
|
||||
bool parser_compile_string(parser_t *parser, const char *name, const char *str, size_t len)
|
||||
{
|
||||
parser->lex = lex_open_string(str, len, name);
|
||||
if (!parser->lex) {
|
||||
con_err("failed to create lexer for string \"%s\"\n", name);
|
||||
return false;
|
||||
}
|
||||
return parser_compile();
|
||||
return parser_compile(parser);
|
||||
}
|
||||
|
||||
void parser_cleanup()
|
||||
void parser_cleanup(parser_t *parser)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < vec_size(parser->accessors); ++i) {
|
||||
|
@ -6100,7 +6100,7 @@ void parser_cleanup()
|
|||
mem_d(parser);
|
||||
}
|
||||
|
||||
bool parser_finish(const char *output)
|
||||
bool parser_finish(parser_t *parser, const char *output)
|
||||
{
|
||||
size_t i;
|
||||
ir_builder *ir;
|
||||
|
|
Loading…
Reference in a new issue