8 // I put the following here to resolve "undefined reference to `__imp__vsnprintf'" with MinGW64 ~ Moodles
10 #if (_MSC_VER >= 1400)
11 //with MSVC 8, use MS extensions
12 #define snprintf linuxlike_snprintf_vc8
13 int VARGS linuxlike_snprintf_vc8(char *buffer, int size, const char *format, ...) LIKEPRINTF(3);
14 #define vsnprintf(a, b, c, d) vsnprintf_s(a, b, _TRUNCATE, c, d)
17 #define snprintf linuxlike_snprintf
18 int VARGS linuxlike_snprintf(char *buffer, int size, const char *format, ...) LIKEPRINTF(3);
19 #define vsnprintf linuxlike_vsnprintf
20 int VARGS linuxlike_vsnprintf(char *buffer, int size, const char *format, va_list argptr);
24 typedef struct QCC_type_s
28 struct QCC_type_s *next;
29 // function types are more complex
30 struct QCC_type_s *aux_type; // return type or field type
31 int num_parms; // -1 = variable args
32 // struct QCC_type_s *parm_types[MAX_PARMS]; // only [num_parms] allocated
34 int ofs; //inside a structure.
41 extern QCC_type_t *qcc_typeinfo;
42 extern int numtypeinfos;
43 extern int maxtypeinfos;
44 extern QCC_type_t *type_void;// = {ev_void/*, &def_void*/};
45 extern QCC_type_t *type_string;// = {ev_string/*, &def_string*/};
46 extern QCC_type_t *type_float;// = {ev_float/*, &def_float*/};
47 extern QCC_type_t *type_vector;// = {ev_vector/*, &def_vector*/};
48 extern QCC_type_t *type_entity;// = {ev_entity/*, &def_entity*/};
49 extern QCC_type_t *type_field;// = {ev_field/*, &def_field*/};
50 extern QCC_type_t *type_function;// = {ev_function/*, &def_function*/,NULL,&type_void};
51 // type_function is a void() function used for state defs
52 extern QCC_type_t *type_pointer;// = {ev_pointer/*, &def_pointer*/};
53 extern QCC_type_t *type_integer;// = {ev_integer/*, &def_integer*/};
54 extern QCC_type_t *type_floatpointer;
55 extern QCC_type_t *type_intpointer;
57 extern QCC_type_t *type_floatfield;// = {ev_field/*, &def_field*/, NULL, &type_float};
58 QCC_type_t *QCC_PR_NewType (char *name, int basictype, pbool typedefed);
61 jmp_buf decompilestatementfailure;
64 pbool Decompile(progfuncs_t *progfuncs, char *fname)
73 int SafeOpenWrite (char *filename, int maxsize);
74 void SafeWrite(int hand, void *buf, long count);
75 int SafeSeek(int hand, int ofs, int mode);
76 void SafeClose(int hand);
77 void VARGS writes(int hand, char *msg, ...)
83 Q_vsnprintf (buf,sizeof(buf)-1, msg, va);
86 SafeWrite(hand, buf, strlen(buf));
89 char *PR_UglyValueString (etype_t type, eval_t *val);
90 ddef16_t *ED_GlobalAtOfs16 (progfuncs_t *progfuncs, int ofs);
91 char *VarAtOfs(progfuncs_t *progfuncs, int ofs)
93 static char buf [4192];
98 def = ED_GlobalAtOfs16(progfuncs, ofs);
106 sprintf(buf, "_v_%s_%i", ofstype[ofs]->name, ofs);
108 sprintf(buf, "_v_%i", ofs);
114 typen = ofstype[ofs]->type;
115 goto evaluateimmediate;
118 sprintf(buf, "_c_%i", ofs);
122 if (!def->s_name[progfuncs->stringtable] || !strcmp(progfuncs->stringtable+def->s_name, "IMMEDIATE"))
124 if (current_progstate->types)
125 typen = current_progstate->types[def->type & ~DEF_SHARED].type;
127 typen = def->type & ~(DEF_SHARED|DEF_SAVEGLOBAL);
130 // return PR_UglyValueString(def->type, (eval_t *)¤t_progstate->globals[def->ofs]);
134 sprintf(buf, "%f", G_FLOAT(ofs));
137 sprintf(buf, "\'%f %f %f\'", G_FLOAT(ofs), G_FLOAT(ofs+1), G_FLOAT(ofs+2));
144 s2 = pr_strings+G_INT(ofs);
156 else if (*s2 == '\"')
162 else if (*s2 == '\t')
176 sprintf(buf, "_c_pointer_%i", ofs);
179 sprintf(buf, "_c_%i", ofs);
183 return def->s_name+progfuncs->stringtable;
189 int ImmediateReadLater(progfuncs_t *progfuncs, progstate_t *progs, unsigned int ofs, int firstst)
192 if (ofsflags[ofs] & 8)
193 return false; //this is a global/local/pramater, not a temp
194 if (!(ofsflags[ofs] & 3))
195 return false; //this is a constant.
196 for (st = &((dstatement16_t*)progs->statements)[firstst]; ; st++,firstst++)
197 { //if written, return false, if read, return true.
198 if (st->op >= OP_CALL0 && st->op <= OP_CALL8)
200 if (ofs == OFS_RETURN)
202 if (ofs < OFS_PARM0 + 3*((unsigned int)st->op - OP_CALL0))
205 else if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
222 if (st->op == OP_DONE || st->op == OP_RETURN) //we missed our chance. (return/done ends any code coherancy).
227 int ProductReadLater(progfuncs_t *progfuncs, progstate_t *progs, int stnum)
230 st = &((dstatement16_t*)progs->statements)[stnum];
231 if (pr_opcodes[st->op].priority == -1)
233 if (st->op >= OP_CALL0 && st->op <= OP_CALL7)
234 return ImmediateReadLater(progfuncs, progs, OFS_RETURN, stnum+1);
235 return false;//these don't have products...
238 if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
239 return ImmediateReadLater(progfuncs, progs, st->b, stnum+1);
241 return ImmediateReadLater(progfuncs, progs, st->c, stnum+1);
244 void WriteStatementProducingOfs(progfuncs_t *progfuncs, progstate_t *progs, int lastnum, int firstpossible, int ofs) //recursive, works backwards
250 longjmp(decompilestatementfailure, 1);
251 for (; lastnum >= firstpossible; lastnum--)
253 st = &((dstatement16_t*)progs->statements)[lastnum];
254 if (st->op >= OP_CALL0 && st->op < OP_CALL7)
256 if (ofs != OFS_RETURN)
258 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
260 for (i = 0; i < st->op - OP_CALL0; i++)
262 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, OFS_PARM0 + i*3);
263 if (i != st->op - OP_CALL0-1)
269 else if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
273 if (!ImmediateReadLater(progfuncs, progs, st->b, lastnum+1))
276 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->b);
278 writes(file, pr_opcodes[st->op].name);
280 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
284 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
292 if (!ImmediateReadLater(progfuncs, progs, st->c, lastnum+1))
294 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->c);
298 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
300 if (!strcmp(pr_opcodes[st->op].name, "."))
301 writes(file, pr_opcodes[st->op].name); //extra spaces around .s are ugly.
305 writes(file, pr_opcodes[st->op].name);
308 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->b);
314 def = ED_GlobalAtOfs16(progfuncs, ofs);
317 if (!strcmp(def->s_name+progfuncs->stringtable, "IMMEDIATE"))
318 writes(file, "%s", VarAtOfs(progfuncs, ofs));
320 writes(file, "%s", progfuncs->stringtable+def->s_name);
323 writes(file, "%s", VarAtOfs(progfuncs, ofs));
324 // longjmp(decompilestatementfailure, 1);
327 int WriteStatement(progfuncs_t *progfuncs, progstate_t *progs, int stnum, int firstpossible)
331 st = &((dstatement16_t*)progs->statements)[stnum];
335 count = (signed short)st->b;
336 writes(file, "if (");
337 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, st->a);
338 writes(file, ")\r\n");
339 writes(file, "{\r\n");
340 firstpossible = stnum+1;
345 if (ProductReadLater(progfuncs, progs, stnum))
351 skip = WriteStatement(progfuncs, progs, stnum, firstpossible);
355 writes(file, "}\r\n");
356 st = &((dstatement16_t*)progs->statements)[stnum];
357 if (st->op == OP_GOTO)
359 count = (signed short)st->b;
363 writes(file, "else\r\n");
364 writes(file, "{\r\n");
367 if (ProductReadLater(progfuncs, progs, stnum))
373 skip = WriteStatement(progfuncs, progs, stnum, firstpossible);
377 writes(file, "}\r\n");
381 longjmp(decompilestatementfailure, 1);
384 longjmp(decompilestatementfailure, 1);
389 WriteStatementProducingOfs(progfuncs, progs, stnum-1, firstpossible, st->a);
399 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, OFS_RETURN);
400 writes(file, ";\r\n");
403 if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
404 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, st->b);
406 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, st->c);
407 writes(file, ";\r\n");
414 void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int f, char *functionname)
416 int stn = progs->functions[num].first_statement;
418 dstatement16_t *st = NULL;
426 if (!functionname && stn<0)
428 //we wrote this one...
434 for (stn = progs->functions[num].first_statement; stn < (signed int)pr_progs->numstatements; stn++)
436 st = &((dstatement16_t*)progs->statements)[stn];
437 if (st->op == OP_DONE || st->op == OP_RETURN)
441 else if (ofstype[st->a])
443 writes(f, "%s", ofstype[st->a]->name);
447 writes(f, "function(");
452 stn = progs->functions[num].first_statement;
455 writes(f, "function(");
456 for (ofs = progs->functions[num].parm_start, i = 0; i < progs->functions[num].numparms; i++, ofs+=progs->functions[num].parm_size[i])
460 def = ED_GlobalAtOfs16(progfuncs, ofs);
467 if (!def->s_name[progfuncs->stringtable])
470 sprintf(mem, "_p_%i", def->ofs);
471 def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
472 strcpy(def->s_name+progfuncs->stringtable, mem);
475 if (current_progstate->types)
476 writes(f, "%s %s", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
478 switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
481 writes(f, "%s %s", "string", progfuncs->stringtable+def->s_name);
484 writes(f, "%s %s", "float", progfuncs->stringtable+def->s_name);
487 writes(f, "%s %s", "entity", progfuncs->stringtable+def->s_name);
490 writes(f, "%s %s", "vector", progfuncs->stringtable+def->s_name);
493 writes(f, "%s %s", "randomtype", progfuncs->stringtable+def->s_name);
498 for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
501 if (!progfuncs->stringtable[progs->functions[num].s_name])
506 sprintf(mem, "_bi_%i", num);
507 progs->functions[num].s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
508 strcpy(progs->functions[num].s_name+progfuncs->stringtable, mem);
512 progs->functions[num].s_name = (char*)malloc(strlen(functionname)+1)-progfuncs->stringtable;
513 strcpy(progs->functions[num].s_name+progfuncs->stringtable, functionname);
517 writes(f, ") %s", progfuncs->stringtable+progs->functions[num].s_name);
522 writes(f, " = #%i;\r\n", stn);
524 for (ofs = progs->functions[num].parm_start, i = 0; i < progs->functions[num].numparms; i++, ofs+=progs->functions[num].parm_size[i])
526 def = ED_GlobalAtOfs16(progfuncs, ofs);
533 if (progs->types[def->type & ~(DEF_SHARED|DEF_SAVEGLOBAL)].type == ev_vector)
535 def = ED_GlobalAtOfs16(progfuncs, ofs);
537 def = ED_GlobalAtOfs16(progfuncs, ofs+1);
539 def = ED_GlobalAtOfs16(progfuncs, ofs+2);
543 else if ((def->type & (~(DEF_SHARED|DEF_SAVEGLOBAL))) == ev_vector)
545 def = ED_GlobalAtOfs16(progfuncs, ofs);
547 def = ED_GlobalAtOfs16(progfuncs, ofs+1);
549 def = ED_GlobalAtOfs16(progfuncs, ofs+2);
558 if (functionname) //parsing defs
564 fileofs = SafeSeek(f, 0, SEEK_CUR);
565 if (setjmp(decompilestatementfailure))
568 // SafeSeek(f, fileofs, SEEK_SET);
569 writes(f, " = asm {\r\n");
571 stn = progs->functions[num].first_statement;
572 for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
574 def = ED_GlobalAtOfs16(progfuncs, ofs);
577 v = (eval_t *)&((int *)progs->globals)[def->ofs];
578 if (current_progstate->types)
579 writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
582 if (!progfuncs->stringtable[def->s_name])
585 sprintf(mem, "_l_%i", def->ofs);
586 def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
587 strcpy(def->s_name+progfuncs->stringtable, mem);
590 switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
593 writes(f, "\tlocal %s %s;\r\n", "string", progfuncs->stringtable+def->s_name);
596 writes(f, "\tlocal %s %s;\r\n", "float", progfuncs->stringtable+def->s_name);
599 writes(f, "\tlocal %s %s;\r\n", "entity", progfuncs->stringtable+def->s_name);
602 if (v->_vector[0] || v->_vector[1] || v->_vector[2])
603 writes(f, "\tlocal vector %s = '%f %f %f';\r\n", progfuncs->stringtable+def->s_name, v->_vector[0], v->_vector[1], v->_vector[2]);
605 writes(f, "\tlocal %s %s;\r\n", "vector", progfuncs->stringtable+def->s_name);
606 ofs+=2; //skip floats;
609 writes(f, "\tlocal %s %s;\r\n", "randomtype", progfuncs->stringtable+def->s_name);
618 st = &((dstatement16_t*)progs->statements)[stn];
619 if (!st->op) //end of function statement!
621 op = &pr_opcodes[st->op];
622 writes(f, "\t%s", op->opname);
624 if (op->priority==-1&&op->associative==ASSOC_RIGHT) //last param is a goto
626 if (op->type_b == &type_void)
629 writes(f, " %i", (signed short)st->a);
631 else if (op->type_c == &type_void)
634 writes(f, " %s", VarAtOfs(progfuncs, st->a));
636 writes(f, " %i", (signed short)st->b);
641 writes(f, " %s", VarAtOfs(progfuncs, st->a));
643 writes(f, " %s", VarAtOfs(progfuncs, st->b));
644 if (st->c) //rightness means it uses a as c
645 writes(f, " %i", (signed short)st->c);
652 if (op->type_a == NULL)
653 writes(f, " %i", (signed short)st->a);
655 writes(f, " %s", VarAtOfs(progfuncs, st->a));
659 if (op->type_b == NULL)
660 writes(f, " %i", (signed short)st->b);
662 writes(f, " %s", VarAtOfs(progfuncs, st->b));
664 if (st->c && op->associative != ASSOC_RIGHT) //rightness means it uses a as c
666 if (op->type_c == NULL)
667 writes(f, " %i", (signed short)st->c);
669 writes(f, " %s", VarAtOfs(progfuncs, st->c));
680 if (!strcmp(progfuncs->stringtable+progs->functions[num].s_name, "SUB_Remove"))
686 writes(f, " =\r\n{\r\n");
688 for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
690 def = ED_GlobalAtOfs16(progfuncs, ofs);
693 v = (eval_t *)&((int *)progs->globals)[def->ofs];
694 if (current_progstate->types)
695 writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
698 if (!def->s_name[progfuncs->stringtable])
701 sprintf(mem, "_l_%i", def->ofs);
702 def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
703 strcpy(def->s_name+progfuncs->stringtable, mem);
706 switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
709 writes(f, "\tlocal %s %s;\r\n", "string", progfuncs->stringtable+def->s_name);
712 writes(f, "\tlocal %s %s;\r\n", "float", progfuncs->stringtable+def->s_name);
715 writes(f, "\tlocal %s %s;\r\n", "entity", progfuncs->stringtable+def->s_name);
718 if (v->_vector[0] || v->_vector[1] || v->_vector[2])
719 writes(f, "\tlocal vector %s = '%f %f %f';\r\n", progfuncs->stringtable+def->s_name, v->_vector[0], v->_vector[1], v->_vector[2]);
721 writes(f, "\tlocal %s %s;\r\n", "vector",progfuncs->stringtable+def->s_name);
722 ofs+=2; //skip floats;
725 writes(f, "\tlocal %s %s;\r\n", "randomtype", progfuncs->stringtable+def->s_name);
733 for (stn = progs->functions[num].first_statement; stn < (signed int)pr_progs->numstatements; stn++)
735 if (ProductReadLater(progfuncs, progs, stn))
738 st = &((dstatement16_t*)progs->statements)[stn];
741 WriteStatement(progfuncs, progs, stn, progs->functions[num].first_statement);
744 longjmp(decompilestatementfailure, 1);
749 void FigureOutTypes(progfuncs_t *progfuncs)
758 ofstype = realloc(ofstype, sizeof(*ofstype)*65535);
759 ofsflags = realloc(ofsflags, sizeof(*ofsflags)*65535);
762 qcc_typeinfo = (void *)realloc(qcc_typeinfo, sizeof(QCC_type_t)*maxtypeinfos);
765 memset(ofstype, 0, sizeof(*ofstype)*65535);
766 memset(ofsflags, 0, sizeof(*ofsflags)*65535);
768 type_void = QCC_PR_NewType("void", ev_void, true);
769 type_string = QCC_PR_NewType("string", ev_string, true);
770 type_float = QCC_PR_NewType("float", ev_float, true);
771 type_vector = QCC_PR_NewType("vector", ev_vector, true);
772 type_entity = QCC_PR_NewType("entity", ev_entity, true);
773 type_field = QCC_PR_NewType("field", ev_field, false);
774 type_function = QCC_PR_NewType("function", ev_function, false);
775 type_pointer = QCC_PR_NewType("pointer", ev_pointer, false);
776 type_integer = QCC_PR_NewType("integer", ev_integer, true);
778 // type_variant = QCC_PR_NewType("__variant", ev_variant);
780 type_floatfield = QCC_PR_NewType("fieldfloat", ev_field, false);
781 type_floatfield->aux_type = type_float;
782 type_pointer->aux_type = QCC_PR_NewType("pointeraux", ev_float, false);
784 type_function->aux_type = type_void;
786 for (i = 0,st = pr_statements16; i < pr_progs->numstatements; i++,st++)
788 op = &pr_opcodes[st->op];
789 if (st->op >= OP_CALL1 && st->op <= OP_CALL8)
791 for (p = 0; p < (unsigned int)st->op-OP_CALL0; p++)
793 ofstype[parmofs[p]] = ofstype[OFS_PARM0+p*3];
796 else if (op->associative == ASSOC_RIGHT)
798 ofsflags[st->b] |= 1;
799 if (st->b >= OFS_PARM0 && st->b < RESERVED_OFS)
800 parmofs[(st->b-OFS_PARM0)/3] = st->a;
802 // if (st->op != OP_STORE_F || st->b>RESERVED_OFS) //optimising compilers fix the OP_STORE_V, it's the storef that becomes meaningless (this is the only time that we need this sort of info anyway)
804 if (op->type_c && op->type_c != &type_void)
805 ofstype[st->a] = *op->type_c;
806 if (op->type_b && op->type_b != &type_void)
807 ofstype[st->b] = *op->type_b;
812 ofsflags[st->c] |= 2;
814 if (st->c >= OFS_PARM0 && st->b < RESERVED_OFS) //too complicated
815 parmofs[(st->b-OFS_PARM0)/3] = 0;
817 // if (st->op != OP_STORE_F || st->b>RESERVED_OFS) //optimising compilers fix the OP_STORE_V, it's the storef that becomes meaningless (this is the only time that we need this sort of info anyway)
819 if (op->type_a && op->type_a != &type_void)
820 ofstype[st->a] = *op->type_a;
821 if (op->type_b && op->type_b != &type_void)
822 ofstype[st->b] = *op->type_b;
823 if (op->type_c && op->type_c != &type_void)
824 ofstype[st->c] = *op->type_c;
830 for (i=0 ; i<pr_progs->numglobaldefs ; i++)
832 def = &pr_globaldefs16[i];
833 ofsflags[def->ofs] |= 8;
837 ofstype[def->ofs] = type_float;
840 ofstype[def->ofs] = type_string;
843 ofstype[def->ofs] = type_vector;
851 pbool Decompile(progfuncs_t *progfuncs, char *fname)
853 extern progfuncs_t *qccprogfuncs;
860 progstate_t progs, *op;
862 qccprogfuncs = progfuncs;
863 op=current_progstate;
865 if (!PR_ReallyLoadProgs(progfuncs, fname, -1, &progs, false))
870 f=SafeOpenWrite("qcdtest/defs.qc", 1024*512);
872 writes(f, "//Decompiled code can contain little type info.\r\n#define NOWARNINGS\r\n");
874 FigureOutTypes(progfuncs);
876 for (i = 1; i < progs.progs->numglobaldefs; i++)
878 if (!strcmp(progfuncs->stringtable+pr_globaldefs16[i].s_name, "IMMEDIATE"))
881 if (ofsflags[pr_globaldefs16[i].ofs] & 4)
882 continue; //this is a local.
884 if (current_progstate->types)
885 type = progs.types[pr_globaldefs16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL)].type;
887 type = pr_globaldefs16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL);
888 v = (eval_t *)&((int *)progs.globals)[pr_globaldefs16[i].ofs];
890 if (!progfuncs->stringtable[pr_globaldefs16[i].s_name])
893 if (ofsflags[pr_globaldefs16[i].ofs] & 3)
895 ofsflags[pr_globaldefs16[i].ofs] &= ~8;
896 continue; //this is a constant...
899 sprintf(mem, "_g_%i", pr_globaldefs16[i].ofs);
900 pr_globaldefs16[i].s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
901 strcpy(pr_globaldefs16[i].s_name+progfuncs->stringtable, mem);
907 writes(f, "void %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
910 if (v->string && *(pr_strings+v->_int))
911 writes(f, "string %s = \"%s\";\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, pr_strings+v->_int);
913 writes(f, "string %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
917 writes(f, "float %s = %f;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, v->_float);
919 writes(f, "float %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
922 if (v->_vector[0] || v->_vector[1] || v->_vector[2])
923 writes(f, "vector %s = '%f %f %f';\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, v->_vector[0], v->_vector[1], v->_vector[2]);
925 writes(f, "vector %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
926 i+=3;//skip the floats
929 writes(f, "entity %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
936 switch(pr_fielddefs16[fld].type)
939 writes(f, ".string %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
943 writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
947 writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
951 writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
955 writes(f, ".void() %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
959 writes(f, "field %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
963 writes(f, "/* %i */", v->_int);
969 WriteAsmStatements(progfuncs, &progs, ((int *)progs.globals)[pr_globaldefs16[i].ofs], f, pr_globaldefs16[i].s_name+progfuncs->stringtable);
973 writes(f, "pointer %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
976 writes(f, "integer %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
980 writes(f, "union %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
983 writes(f, "struct %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
991 for (i = 0; i < progs.progs->numfunctions; i++)
993 WriteAsmStatements(progfuncs, &progs, i, f, NULL);
998 current_progstate=op;