X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=code.c;h=e828ccc81b5da0c3d6964fa820162600f71922d1;hb=df075312981296de9d7d659ad8b20ded82d97cc3;hp=d11db046ed6b19fb112ec6fab86e03375220dd91;hpb=f8b3081c44fa51860bb56f7d13b3b730717e9e3b;p=xonotic%2Fgmqcc.git diff --git a/code.c b/code.c index d11db04..e828ccc 100644 --- a/code.c +++ b/code.c @@ -63,13 +63,19 @@ VECTOR_MAKE(prog_section_function, code_functions ); VECTOR_MAKE(int, code_globals ); VECTOR_MAKE(char, code_chars ); +uint16_t code_crc; +uint32_t code_entfields; + void code_init() { prog_section_function empty_function = {0,0,0,0,0,0,0,{0}}; prog_section_statement empty_statement = {0,{0},{0},{0}}; + prog_section_def empty_def = {0, 0, 0}; int i = 0; + code_entfields = 0; + /* omit creation of null code */ - if (opts_omit_nullcode) + if (OPTS_FLAG(OMIT_NULL_BYTES)) return; /* @@ -82,6 +88,8 @@ void code_init() { code_chars_add ('\0'); code_functions_add (empty_function); code_statements_add(empty_statement); + code_defs_add (empty_def); + code_fields_add (empty_def); } uint32_t code_genstring(const char *str) @@ -152,13 +160,20 @@ void code_test() { code_statements_add(s3); } +qcint code_alloc_field (size_t qcsize) +{ + qcint pos = (qcint)code_entfields; + code_entfields += qcsize; + return pos; +} + bool code_write(const char *filename) { prog_header code_header; FILE *fp = NULL; size_t it = 2; /* see proposal.txt */ - if (opts_omit_nullcode) {} + if (OPTS_FLAG(OMIT_NULL_BYTES)) {} code_header.statements.offset = sizeof(prog_header); code_header.statements.length = code_statements_elements; code_header.defs.offset = code_header.statements.offset + (sizeof(prog_section_statement) * code_statements_elements); @@ -172,10 +187,13 @@ bool code_write(const char *filename) { code_header.strings.offset = code_header.globals.offset + (sizeof(int32_t) * code_globals_elements); code_header.strings.length = code_chars_elements; code_header.version = 6; - code_header.crc16 = 0; /* TODO: */ - code_header.entfield = 0; /* TODO: */ + if (opts_forcecrc) + code_header.crc16 = opts_forced_crc; + else + code_header.crc16 = code_crc; + code_header.entfield = code_entfields; - if (opts_darkplaces_stringtablebug) { + if (OPTS_FLAG(DARKPLACES_STRING_TABLE_BUG)) { util_debug("GEN", "Patching stringtable for -fdarkplaces-stringtablebug\n"); /* >= + P */ @@ -192,7 +210,7 @@ bool code_write(const char *filename) { util_endianswap(code_functions_data, code_functions_elements, sizeof(prog_section_function)); util_endianswap(code_globals_data, code_globals_elements, sizeof(int32_t)); - fp = fopen(filename, "wb"); + fp = util_fopen(filename, "wb"); if (!fp) return false; @@ -247,7 +265,7 @@ bool code_write(const char *filename) { util_debug("GEN", " CODE:\n"); for (;;) { if (code_statements_data[j].opcode != AINSTR_END) - util_debug("GEN", " %s {0x%05x,0x%05x,0x%05x}\n", + util_debug("GEN", " %-12s {% 5i,% 5i,% 5i}\n", asm_instr[code_statements_data[j].opcode].m, code_statements_data[j].o1.s1, code_statements_data[j].o2.s1,