Use dstring for progdefs.h writing.

And finally get qfcc into the thing :P
This commit is contained in:
Bill Currie 2012-05-02 23:39:49 +09:00
parent 04b9b3a11d
commit 15de69d868

View file

@ -41,6 +41,7 @@
#include <QF/crc.h>
#include <QF/dstring.h>
#include <QF/quakeio.h>
#include "def.h"
#include "defspace.h"
@ -194,20 +195,21 @@ WriteProgdefs (dprograms_t *progs, const char *filename)
{
ddef_t *def;
ddef_t *fdef;
FILE *f;
dstring_t *dstr;
QFile *f;
unsigned short crc;
int c;
unsigned i, j;
const char *strings;
const char *name;
if (options.verbosity >= 1)
printf ("writing %s\n", filename);
f = fopen (filename, "wb");
printf ("Calculating CRC\n");
dstr = dstring_newstr();
// print global vars until the first field is defined
fprintf (f, "\n/* file generated by qcc, do not modify */"
"\n\ntypedef struct\n{\tint\tpad[%i];\n",
dasprintf (dstr, "\n/* file generated by qcc, do not modify */"
"\n\ntypedef struct\n{\tint\tpad[%i];\n",
RESERVED_OFS);
strings = (char *) progs + progs->ofs_strings;
@ -223,32 +225,32 @@ WriteProgdefs (dprograms_t *progs, const char *filename)
switch (def->type & ~DEF_SAVEGLOBAL) {
case ev_float:
fprintf (f, "\tfloat\t%s;\n", name);
dasprintf (dstr, "\tfloat\t%s;\n", name);
break;
case ev_vector:
fprintf (f, "\tvec3_t\t%s;\n", name);
dasprintf (dstr, "\tvec3_t\t%s;\n", name);
break;
case ev_quat:
fprintf (f, "\tquat_t\t%s;\n", name);
dasprintf (dstr, "\tquat_t\t%s;\n", name);
break;
case ev_string:
fprintf (f, "\tstring_t\t%s;\n", name);
dasprintf (dstr, "\tstring_t\t%s;\n", name);
break;
case ev_func:
fprintf (f, "\tfunc_t\t%s;\n", name);
dasprintf (dstr, "\tfunc_t\t%s;\n", name);
break;
case ev_entity:
fprintf (f, "\tint\t%s;\n", name);
dasprintf (dstr, "\tint\t%s;\n", name);
break;
default:
fprintf (f, "\tint\t%s;\n", name);
dasprintf (dstr, "\tint\t%s;\n", name);
break;
}
}
fprintf (f, "} globalvars_t;\n\n");
dasprintf (dstr, "} globalvars_t;\n\n");
// print all fields
fprintf (f, "typedef struct\n{\n");
dasprintf (dstr, "typedef struct\n{\n");
for (i = 0, j = 0; i < progs->numglobaldefs; i++) {
def = (ddef_t *) ((char *) progs + progs->ofs_globaldefs) + i;
name = strings + def->s_name;
@ -266,37 +268,41 @@ WriteProgdefs (dprograms_t *progs, const char *filename)
switch (fdef->type) {
case ev_float:
fprintf (f, "\tfloat\t%s;\n", name);
dasprintf (dstr, "\tfloat\t%s;\n", name);
break;
case ev_vector:
fprintf (f, "\tvec3_t\t%s;\n", name);
dasprintf (dstr, "\tvec3_t\t%s;\n", name);
break;
case ev_string:
fprintf (f, "\tstring_t\t%s;\n", name);
dasprintf (dstr, "\tstring_t\t%s;\n", name);
break;
case ev_func:
fprintf (f, "\tfunc_t\t%s;\n", name);
dasprintf (dstr, "\tfunc_t\t%s;\n", name);
break;
case ev_entity:
fprintf (f, "\tint\t%s;\n", name);
dasprintf (dstr, "\tint\t%s;\n", name);
break;
default:
fprintf (f, "\tint\t%s;\n", name);
dasprintf (dstr, "\tint\t%s;\n", name);
break;
}
}
fprintf (f, "} entvars_t;\n\n");
dasprintf (dstr, "} entvars_t;\n\n");
fclose (f);
// do a crc of the structs
crc = CRC_Block ((byte *) dstr->str, dstr->size - 1);
// do a crc of the file
CRC_Init (&crc);
f = fopen (filename, "r+b");
while ((c = fgetc (f)) != EOF)
CRC_ProcessByte (&crc, (byte) c);
dasprintf (dstr, "#define PROGHEADER_CRC %u\n", crc);
dstring_insertstr (dstr, 0, "/* Actually, generated by qfcc, be one must "
"maintain formalities */");
fprintf (f, "#define PROGHEADER_CRC %u\n", crc);
fclose (f);
if (filename) {
if (options.verbosity >= 1)
printf ("writing %s\n", filename);
f = Qopen (filename, "wt");
Qwrite (f, dstr->str, dstr->size - 1);
Qclose (f);
}
return crc;
}