5 /* darkplaces has (or will have) a 64 bit prog loader
6 * where the 32 bit qc program is autoconverted on load.
7 * Since we may want to support that as well, let's redefine
10 typedef float qcfloat;
11 typedef int32_t qcint;
13 typedef char qcfloat_size_is_correct [sizeof(qcfloat) == 4 ?1:-1];
14 typedef char qcint_size_is_correct [sizeof(int) == 4 ?1:-1];
26 prog_section statements;
29 prog_section functions;
35 typedef prog_section_both prog_def;
36 typedef prog_section_function prog_function;
37 typedef prog_section_statement prog_statement;
45 prog_function *functions;
51 qc_program* prog_load(const char *filename)
57 file = fopen(filename, "rb");
61 if (fread(&header, sizeof(header), 1, file) != 1) {
67 if (header.version != 6) {
68 printf("header says this is a version %i progs, we need version 6\n",
74 prog = (qc_program*)mem_a(sizeof(qc_program));
77 printf("failed to allocate program data\n");
80 memset(prog, 0, sizeof(*prog));
82 prog->filename = util_strdup(filename);
85 #define read_data(hdrvar, progvar, type) \
86 if (fseek(file, header.hdrvar.offset, SEEK_SET) != 0) { \
90 prog->progvar = (type*)mem_a(header.hdrvar.length * sizeof(*prog->progvar)); \
93 if (fread(prog->progvar, sizeof(*prog->progvar), header.hdrvar.length, file) \
94 != header.hdrvar.length) { \
98 #define read_data1(x, y) read_data(x, x, y)
100 read_data (statements, code, prog_statement);
101 read_data1(defs, prog_def);
102 read_data1(fields, prog_def);
103 read_data1(functions, prog_function);
104 read_data1(strings, char);
105 read_data1(globals, qcint);
112 if (prog->filename) mem_d(prog->filename);
113 if (prog->code) mem_d(prog->code);
114 if (prog->defs) mem_d(prog->defs);
115 if (prog->fields) mem_d(prog->fields);
116 if (prog->functions) mem_d(prog->functions);
117 if (prog->strings) mem_d(prog->strings);
118 if (prog->globals) mem_d(prog->globals);
119 if (prog->entitydata) mem_d(prog->entitydata);
124 void prog_delete(qc_program *prog)
126 if (prog->filename) mem_d(prog->filename);
127 if (prog->code) mem_d(prog->code);
128 if (prog->defs) mem_d(prog->defs);
129 if (prog->fields) mem_d(prog->fields);
130 if (prog->functions) mem_d(prog->functions);
131 if (prog->strings) mem_d(prog->strings);
132 if (prog->globals) mem_d(prog->globals);
133 if (prog->entitydata) mem_d(prog->entitydata);
137 #if defined(QCVM_EXECUTOR)
138 int main(int argc, char **argv)
143 printf("usage: %s prog.dat\n", argv[0]);
147 prog = prog_load(argv[1]);
149 printf("failed to load program '%s'\n", argv[1]);