From 04b9b3a11d4b69a0f3c4a1987d01b2488c917d9a Mon Sep 17 00:00:00 2001
From: Bill Currie <bill@taniwha.org>
Date: Wed, 2 May 2012 22:44:45 +0900
Subject: [PATCH] Fix progdefs.h writing.

---
 tools/qfcc/source/idstuff.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/tools/qfcc/source/idstuff.c b/tools/qfcc/source/idstuff.c
index 12a26aae2..d5a956a6c 100644
--- a/tools/qfcc/source/idstuff.c
+++ b/tools/qfcc/source/idstuff.c
@@ -192,11 +192,12 @@ WriteFiles (const char *sourcedir)
 int
 WriteProgdefs (dprograms_t *progs, const char *filename)
 {
-	ddef_t     *d;
+	ddef_t     *def;
+	ddef_t     *fdef;
 	FILE       *f;
 	unsigned short crc;
 	int         c;
-	unsigned    i;
+	unsigned    i, j;
 	const char *strings;
 	const char *name;
 
@@ -211,16 +212,16 @@ WriteProgdefs (dprograms_t *progs, const char *filename)
 
 	strings = (char *) progs + progs->ofs_strings;
 	for (i = 0; i < progs->numglobaldefs; i++) {
-		d = (ddef_t *) ((char *) progs + progs->ofs_globaldefs) + i;
-		name = strings + d->s_name;
+		def = (ddef_t *) ((char *) progs + progs->ofs_globaldefs) + i;
+		name = strings + def->s_name;
 		if (!strcmp (name, "end_sys_globals"))
 			break;
-		if (!d->ofs)
+		if (!def->ofs)
 			continue;
 		if (*name == '.' || !*name)
 			continue;
 
-		switch (d->type) {
+		switch (def->type & ~DEF_SAVEGLOBAL) {
 			case ev_float:
 				fprintf (f, "\tfloat\t%s;\n", name);
 				break;
@@ -248,16 +249,22 @@ WriteProgdefs (dprograms_t *progs, const char *filename)
 
 	// print all fields
 	fprintf (f, "typedef struct\n{\n");
-	for (i = 0; i < progs->numglobaldefs; i++) {
-		d = (ddef_t *) ((char *) progs + progs->ofs_fielddefs) + i;
-		name = strings + d->s_name;
+	for (i = 0, j = 0; i < progs->numglobaldefs; i++) {
+		def = (ddef_t *) ((char *) progs + progs->ofs_globaldefs) + i;
+		name = strings + def->s_name;
 		if (!strcmp (name, "end_sys_fields"))
 			break;
 
-		if (!d->ofs)
+		if (!def->ofs)
+			continue;
+		if (def->type != ev_field)
 			continue;
 
-		switch (d->type) {
+		fdef = (ddef_t *) ((char *) progs + progs->ofs_fielddefs) + j++;
+		if (fdef->s_name != def->s_name)
+			internal_error (0, "def and field order messup");
+
+		switch (fdef->type) {
 			case ev_float:
 				fprintf (f, "\tfloat\t%s;\n", name);
 				break;