X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=code.c;h=11fe91b645103ec747b78ea056d3ba92fac3543e;hb=50f00fb0a75533c467461590c405c20360df0747;hp=674eb1aca4a7fdfc0fa75440645e3edbf4a022bf;hpb=857cb72a94c366998ae6bf21df9072d3343d0769;p=xonotic%2Fgmqcc.git diff --git a/code.c b/code.c index 674eb1a..11fe91b 100644 --- a/code.c +++ b/code.c @@ -28,8 +28,11 @@ typedef struct { } prog_section; typedef struct { - uint32_t version; /* Program version (6) */ - uint32_t crc16; /* What is this? */ + uint16_t version; /* Program version (6) */ + uint16_t flags; /* see propsal.txt */ + uint16_t crc16; /* What is this? */ + uint16_t skip; /* see propsal.txt */ + prog_section statements; /* prog_section_statement */ prog_section defs; /* prog_section_def */ prog_section fields; /* prog_section_field */ @@ -80,16 +83,11 @@ VECTOR_MAKE(prog_section_function, code_functions ); VECTOR_MAKE(int, code_globals ); VECTOR_MAKE(char, code_chars ); -int code_strings_add(const char *src) { - size_t size = strlen(src); - size_t iter = 0; - while (iter < size) - code_chars_add(src[iter++]); - code_chars_add('\0'); - return code_chars_elements; -} - void code_init() { + /* omit creation of null code */ + if (opts_omit_nullcode) + return; + /* * The way progs.dat is suppose to work is odd, there needs to be * some null (empty) statements, functions, and 28 globals @@ -106,13 +104,13 @@ void code_init() { } void code_test() { - code_strings_add("m_init"); - code_strings_add("print"); - code_strings_add("hello world\n"); - code_strings_add("m_keydown"); - code_strings_add("m_draw"); - code_strings_add("m_toggle"); - code_strings_add("m_shutdown"); + code_chars_put("m_init", 0x6); + code_chars_put("print", 0x5); + code_chars_put("hello world\n", 0xC); + code_chars_put("m_keydown", 0x9); + code_chars_put("m_draw", 0x6); + code_chars_put("m_toggle", 0x8); + code_chars_put("m_shutdown", 0xA); code_globals_add(1); /* m_init */ code_globals_add(2); /* print */ @@ -137,6 +135,13 @@ void code_test() { void code_write() { prog_header code_header={0}; + + /* see proposal.txt */ + if (opts_omit_nullcode) { + code_header.skip = 28; + code_header.flags = 1; + } + code_header.version = 6; code_header.crc16 = 0; /* TODO: */ code_header.statements = (prog_section){sizeof(prog_header), code_statements_elements }; @@ -146,14 +151,23 @@ void code_write() { code_header.globals = (prog_section){code_header.functions.offset + sizeof(prog_section_function) *code_functions_elements, code_globals_elements }; code_header.strings = (prog_section){code_header.globals.offset + sizeof(int) *code_globals_elements, code_chars_elements }; code_header.entfield = 0; /* TODO: */ - + + if (opts_darkplaces_stringtablebug) { + util_debug("GEN", "Patching stringtable for -fdarkplaces-stringtablebug\n"); + + /* >= + P */ + code_chars_add('\0'); /* > */ + code_chars_add('\0'); /* = */ + code_chars_add('\0'); /* P */ + } + /* ensure all data is in LE format */ - util_endianswap(&code_header, sizeof(prog_header), 1); - util_endianswap(code_statements_data, sizeof(prog_section_statement), code_statements_elements); - util_endianswap(code_defs_data, sizeof(prog_section_def), code_defs_elements); - util_endianswap(code_fields_data, sizeof(prog_section_field), code_fields_elements); - util_endianswap(code_functions_data, sizeof(prog_section_function), code_functions_elements); - util_endianswap(code_globals_data, sizeof(int), code_globals_elements); + util_endianswap(&code_header, 1, sizeof(prog_header)); + util_endianswap(code_statements_data, code_statements_elements, sizeof(prog_section_statement)); + util_endianswap(code_defs_data, code_defs_elements, sizeof(prog_section_def)); + util_endianswap(code_fields_data, code_fields_elements, sizeof(prog_section_field)); + util_endianswap(code_functions_data, code_functions_elements, sizeof(prog_section_function)); + util_endianswap(code_globals_data, code_globals_elements, sizeof(int)); FILE *fp = fopen("program.dat", "wb"); fwrite(&code_header, 1, sizeof(prog_header), fp); @@ -191,18 +205,21 @@ void code_write() { *((int32_t*)&code_functions_data[i].argsize) ); util_debug("GEN", " NAME: %s\n", &code_chars_data[code_functions_data[i].name]); - util_debug("GEN", " CODE:\n"); - for (;;) { - if (code_statements_data[j].opcode != INSTR_DONE && - code_statements_data[j].opcode != INSTR_RETURN) - util_debug("GEN", " %s {0x%05d,0x%05d,0x%05d}\n", - asm_instr[code_statements_data[j].opcode].m, - code_statements_data[j].s1, - code_statements_data[j].s2, - code_statements_data[j].s3 - ); - else break; - j++; + /* Internal functions have no code */ + if (code_functions_data[i].entry >= 0) { + util_debug("GEN", " CODE:\n"); + for (;;) { + if (code_statements_data[j].opcode != INSTR_DONE && + code_statements_data[j].opcode != INSTR_RETURN) + util_debug("GEN", " %s {0x%05d,0x%05d,0x%05d}\n", + asm_instr[code_statements_data[j].opcode].m, + code_statements_data[j].o1.s1, + code_statements_data[j].o2.s2, + code_statements_data[j].o3.s3 + ); + else break; + j++; + } } }