8 typedef struct QCC_type_s
12 struct QCC_type_s *next;
13 // function types are more complex
14 struct QCC_type_s *aux_type; // return type or field type
15 int num_parms; // -1 = variable args
16 // struct QCC_type_s *parm_types[MAX_PARMS]; // only [num_parms] allocated
18 int ofs; //inside a structure.
25 extern QCC_type_t *qcc_typeinfo;
26 extern int numtypeinfos;
27 extern int maxtypeinfos;
28 extern QCC_type_t *type_void;// = {ev_void/*, &def_void*/};
29 extern QCC_type_t *type_string;// = {ev_string/*, &def_string*/};
30 extern QCC_type_t *type_float;// = {ev_float/*, &def_float*/};
31 extern QCC_type_t *type_vector;// = {ev_vector/*, &def_vector*/};
32 extern QCC_type_t *type_entity;// = {ev_entity/*, &def_entity*/};
33 extern QCC_type_t *type_field;// = {ev_field/*, &def_field*/};
34 extern QCC_type_t *type_function;// = {ev_function/*, &def_function*/,NULL,&type_void};
35 // type_function is a void() function used for state defs
36 extern QCC_type_t *type_pointer;// = {ev_pointer/*, &def_pointer*/};
37 extern QCC_type_t *type_integer;// = {ev_integer/*, &def_integer*/};
39 extern QCC_type_t *type_floatfield;// = {ev_field/*, &def_field*/, NULL, &type_float};
40 QCC_type_t *QCC_PR_NewType (char *name, int basictype);
43 jmp_buf decompilestatementfailure;
46 pbool Decompile(progfuncs_t *progfuncs, char *fname)
55 int SafeOpenWrite (char *filename, int maxsize);
56 void SafeWrite(int hand, void *buf, long count);
57 int SafeSeek(int hand, int ofs, int mode);
58 void SafeClose(int hand);
59 void VARGS writes(int hand, char *msg, ...)
65 Q_vsnprintf (buf,sizeof(buf)-1, msg, va);
68 SafeWrite(hand, buf, strlen(buf));
71 char *PR_UglyValueString (etype_t type, eval_t *val);
72 ddef16_t *ED_GlobalAtOfs16 (progfuncs_t *progfuncs, int ofs);
73 char *VarAtOfs(progfuncs_t *progfuncs, int ofs)
75 static char buf [4192];
80 def = ED_GlobalAtOfs16(progfuncs, ofs);
88 sprintf(buf, "_v_%s_%i", ofstype[ofs]->name, ofs);
90 sprintf(buf, "_v_%i", ofs);
96 typen = ofstype[ofs]->type;
97 goto evaluateimmediate;
100 sprintf(buf, "_c_%i", ofs);
104 if (!def->s_name[progfuncs->stringtable] || !strcmp(progfuncs->stringtable+def->s_name, "IMMEDIATE"))
106 if (current_progstate->types)
107 typen = current_progstate->types[def->type & ~DEF_SHARED].type;
109 typen = def->type & ~(DEF_SHARED|DEF_SAVEGLOBAL);
112 // return PR_UglyValueString(def->type, (eval_t *)¤t_progstate->globals[def->ofs]);
116 sprintf(buf, "%f", G_FLOAT(ofs));
119 sprintf(buf, "\'%f %f %f\'", G_FLOAT(ofs), G_FLOAT(ofs+1), G_FLOAT(ofs+2));
126 s2 = pr_strings+G_INT(ofs);
138 else if (*s2 == '\"')
144 else if (*s2 == '\t')
158 sprintf(buf, "_c_pointer_%i", ofs);
161 sprintf(buf, "_c_%i", ofs);
165 return def->s_name+progfuncs->stringtable;
171 int ImmediateReadLater(progfuncs_t *progfuncs, progstate_t *progs, unsigned int ofs, int firstst)
174 if (ofsflags[ofs] & 8)
175 return false; //this is a global/local/pramater, not a temp
176 if (!(ofsflags[ofs] & 3))
177 return false; //this is a constant.
178 for (st = &((dstatement16_t*)progs->statements)[firstst]; ; st++,firstst++)
179 { //if written, return false, if read, return true.
180 if (st->op >= OP_CALL0 && st->op <= OP_CALL8)
182 if (ofs == OFS_RETURN)
184 if (ofs < OFS_PARM0 + 3*((unsigned int)st->op - OP_CALL0))
187 else if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
204 if (st->op == OP_DONE || st->op == OP_RETURN) //we missed our chance. (return/done ends any code coherancy).
209 int ProductReadLater(progfuncs_t *progfuncs, progstate_t *progs, int stnum)
212 st = &((dstatement16_t*)progs->statements)[stnum];
213 if (pr_opcodes[st->op].priority == -1)
215 if (st->op >= OP_CALL0 && st->op <= OP_CALL7)
216 return ImmediateReadLater(progfuncs, progs, OFS_RETURN, stnum+1);
217 return false;//these don't have products...
220 if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
221 return ImmediateReadLater(progfuncs, progs, st->b, stnum+1);
223 return ImmediateReadLater(progfuncs, progs, st->c, stnum+1);
226 void WriteStatementProducingOfs(progfuncs_t *progfuncs, progstate_t *progs, int lastnum, int firstpossible, int ofs) //recursive, works backwards
232 longjmp(decompilestatementfailure, 1);
233 for (; lastnum >= firstpossible; lastnum--)
235 st = &((dstatement16_t*)progs->statements)[lastnum];
236 if (st->op >= OP_CALL0 && st->op < OP_CALL7)
238 if (ofs != OFS_RETURN)
240 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
242 for (i = 0; i < st->op - OP_CALL0; i++)
244 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, OFS_PARM0 + i*3);
245 if (i != st->op - OP_CALL0-1)
251 else if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
255 if (!ImmediateReadLater(progfuncs, progs, st->b, lastnum+1))
258 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->b);
260 writes(file, pr_opcodes[st->op].name);
262 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
266 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
274 if (!ImmediateReadLater(progfuncs, progs, st->c, lastnum+1))
276 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->c);
280 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->a);
282 if (!strcmp(pr_opcodes[st->op].name, "."))
283 writes(file, pr_opcodes[st->op].name); //extra spaces around .s are ugly.
287 writes(file, pr_opcodes[st->op].name);
290 WriteStatementProducingOfs(progfuncs, progs, lastnum-1, firstpossible, st->b);
296 def = ED_GlobalAtOfs16(progfuncs, ofs);
299 if (!strcmp(def->s_name+progfuncs->stringtable, "IMMEDIATE"))
300 writes(file, "%s", VarAtOfs(progfuncs, ofs));
302 writes(file, "%s", progfuncs->stringtable+def->s_name);
305 writes(file, "%s", VarAtOfs(progfuncs, ofs));
306 // longjmp(decompilestatementfailure, 1);
309 int WriteStatement(progfuncs_t *progfuncs, progstate_t *progs, int stnum, int firstpossible)
313 st = &((dstatement16_t*)progs->statements)[stnum];
317 count = (signed short)st->b;
318 writes(file, "if (");
319 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, st->a);
320 writes(file, ")\r\n");
321 writes(file, "{\r\n");
322 firstpossible = stnum+1;
327 if (ProductReadLater(progfuncs, progs, stnum))
333 skip = WriteStatement(progfuncs, progs, stnum, firstpossible);
337 writes(file, "}\r\n");
338 st = &((dstatement16_t*)progs->statements)[stnum];
339 if (st->op == OP_GOTO)
341 count = (signed short)st->b;
345 writes(file, "else\r\n");
346 writes(file, "{\r\n");
349 if (ProductReadLater(progfuncs, progs, stnum))
355 skip = WriteStatement(progfuncs, progs, stnum, firstpossible);
359 writes(file, "}\r\n");
363 longjmp(decompilestatementfailure, 1);
366 longjmp(decompilestatementfailure, 1);
371 WriteStatementProducingOfs(progfuncs, progs, stnum-1, firstpossible, st->a);
381 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, OFS_RETURN);
382 writes(file, ";\r\n");
385 if (pr_opcodes[st->op].associative == ASSOC_RIGHT)
386 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, st->b);
388 WriteStatementProducingOfs(progfuncs, progs, stnum, firstpossible, st->c);
389 writes(file, ";\r\n");
396 void WriteAsmStatements(progfuncs_t *progfuncs, progstate_t *progs, int num, int f, char *functionname)
398 int stn = progs->functions[num].first_statement;
400 dstatement16_t *st = NULL;
408 if (!functionname && stn<0)
410 //we wrote this one...
416 for (stn = progs->functions[num].first_statement; stn < (signed int)pr_progs->numstatements; stn++)
418 st = &((dstatement16_t*)progs->statements)[stn];
419 if (st->op == OP_DONE || st->op == OP_RETURN)
423 else if (ofstype[st->a])
425 writes(f, "%s", ofstype[st->a]->name);
429 writes(f, "function(");
434 stn = progs->functions[num].first_statement;
437 writes(f, "function(");
438 for (ofs = progs->functions[num].parm_start, i = 0; i < progs->functions[num].numparms; i++, ofs+=progs->functions[num].parm_size[i])
442 def = ED_GlobalAtOfs16(progfuncs, ofs);
449 if (!def->s_name[progfuncs->stringtable])
452 sprintf(mem, "_p_%i", def->ofs);
453 def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
454 strcpy(def->s_name+progfuncs->stringtable, mem);
457 if (current_progstate->types)
458 writes(f, "%s %s", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
460 switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
463 writes(f, "%s %s", "string", progfuncs->stringtable+def->s_name);
466 writes(f, "%s %s", "float", progfuncs->stringtable+def->s_name);
469 writes(f, "%s %s", "entity", progfuncs->stringtable+def->s_name);
472 writes(f, "%s %s", "vector", progfuncs->stringtable+def->s_name);
475 writes(f, "%s %s", "randomtype", progfuncs->stringtable+def->s_name);
480 for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
483 if (!progfuncs->stringtable[progs->functions[num].s_name])
488 sprintf(mem, "_bi_%i", num);
489 progs->functions[num].s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
490 strcpy(progs->functions[num].s_name+progfuncs->stringtable, mem);
494 progs->functions[num].s_name = (char*)malloc(strlen(functionname)+1)-progfuncs->stringtable;
495 strcpy(progs->functions[num].s_name+progfuncs->stringtable, functionname);
499 writes(f, ") %s", progfuncs->stringtable+progs->functions[num].s_name);
504 writes(f, " = #%i;\r\n", stn);
506 for (ofs = progs->functions[num].parm_start, i = 0; i < progs->functions[num].numparms; i++, ofs+=progs->functions[num].parm_size[i])
508 def = ED_GlobalAtOfs16(progfuncs, ofs);
515 if (progs->types[def->type & ~(DEF_SHARED|DEF_SAVEGLOBAL)].type == ev_vector)
517 def = ED_GlobalAtOfs16(progfuncs, ofs);
519 def = ED_GlobalAtOfs16(progfuncs, ofs+1);
521 def = ED_GlobalAtOfs16(progfuncs, ofs+2);
525 else if ((def->type & (~(DEF_SHARED|DEF_SAVEGLOBAL))) == ev_vector)
527 def = ED_GlobalAtOfs16(progfuncs, ofs);
529 def = ED_GlobalAtOfs16(progfuncs, ofs+1);
531 def = ED_GlobalAtOfs16(progfuncs, ofs+2);
540 if (functionname) //parsing defs
546 fileofs = SafeSeek(f, 0, SEEK_CUR);
547 if (setjmp(decompilestatementfailure))
550 // SafeSeek(f, fileofs, SEEK_SET);
551 writes(f, " = asm {\r\n");
553 stn = progs->functions[num].first_statement;
554 for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
556 def = ED_GlobalAtOfs16(progfuncs, ofs);
559 v = (eval_t *)&((int *)progs->globals)[def->ofs];
560 if (current_progstate->types)
561 writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
564 if (!progfuncs->stringtable[def->s_name])
567 sprintf(mem, "_l_%i", def->ofs);
568 def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
569 strcpy(def->s_name+progfuncs->stringtable, mem);
572 switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
575 writes(f, "\tlocal %s %s;\r\n", "string", progfuncs->stringtable+def->s_name);
578 writes(f, "\tlocal %s %s;\r\n", "float", progfuncs->stringtable+def->s_name);
581 writes(f, "\tlocal %s %s;\r\n", "entity", progfuncs->stringtable+def->s_name);
584 if (v->_vector[0] || v->_vector[1] || v->_vector[2])
585 writes(f, "\tlocal vector %s = '%f %f %f';\r\n", progfuncs->stringtable+def->s_name, v->_vector[0], v->_vector[1], v->_vector[2]);
587 writes(f, "\tlocal %s %s;\r\n", "vector", progfuncs->stringtable+def->s_name);
588 ofs+=2; //skip floats;
591 writes(f, "\tlocal %s %s;\r\n", "randomtype", progfuncs->stringtable+def->s_name);
600 st = &((dstatement16_t*)progs->statements)[stn];
601 if (!st->op) //end of function statement!
603 op = &pr_opcodes[st->op];
604 writes(f, "\t%s", op->opname);
606 if (op->priority==-1&&op->associative==ASSOC_RIGHT) //last param is a goto
608 if (op->type_b == &type_void)
611 writes(f, " %i", (signed short)st->a);
613 else if (op->type_c == &type_void)
616 writes(f, " %s", VarAtOfs(progfuncs, st->a));
618 writes(f, " %i", (signed short)st->b);
623 writes(f, " %s", VarAtOfs(progfuncs, st->a));
625 writes(f, " %s", VarAtOfs(progfuncs, st->b));
626 if (st->c) //rightness means it uses a as c
627 writes(f, " %i", (signed short)st->c);
634 if (op->type_a == NULL)
635 writes(f, " %i", (signed short)st->a);
637 writes(f, " %s", VarAtOfs(progfuncs, st->a));
641 if (op->type_b == NULL)
642 writes(f, " %i", (signed short)st->b);
644 writes(f, " %s", VarAtOfs(progfuncs, st->b));
646 if (st->c && op->associative != ASSOC_RIGHT) //rightness means it uses a as c
648 if (op->type_c == NULL)
649 writes(f, " %i", (signed short)st->c);
651 writes(f, " %s", VarAtOfs(progfuncs, st->c));
662 if (!strcmp(progfuncs->stringtable+progs->functions[num].s_name, "SUB_Remove"))
668 writes(f, " =\r\n{\r\n");
670 for (ofs = progs->functions[num].parm_start+progs->functions[num].numparms, i = progs->functions[num].numparms; i < progs->functions[num].locals; i++, ofs+=1)
672 def = ED_GlobalAtOfs16(progfuncs, ofs);
675 v = (eval_t *)&((int *)progs->globals)[def->ofs];
676 if (current_progstate->types)
677 writes(f, "\tlocal %s %s;\r\n", current_progstate->types[def->type&~(DEF_SHARED|DEF_SAVEGLOBAL)].name, def->s_name);
680 if (!def->s_name[progfuncs->stringtable])
683 sprintf(mem, "_l_%i", def->ofs);
684 def->s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
685 strcpy(def->s_name+progfuncs->stringtable, mem);
688 switch(def->type&~(DEF_SHARED|DEF_SAVEGLOBAL))
691 writes(f, "\tlocal %s %s;\r\n", "string", progfuncs->stringtable+def->s_name);
694 writes(f, "\tlocal %s %s;\r\n", "float", progfuncs->stringtable+def->s_name);
697 writes(f, "\tlocal %s %s;\r\n", "entity", progfuncs->stringtable+def->s_name);
700 if (v->_vector[0] || v->_vector[1] || v->_vector[2])
701 writes(f, "\tlocal vector %s = '%f %f %f';\r\n", def->s_name, v->_vector[0], v->_vector[1], v->_vector[2]);
703 writes(f, "\tlocal %s %s;\r\n", "vector",progfuncs->stringtable+def->s_name);
704 ofs+=2; //skip floats;
707 writes(f, "\tlocal %s %s;\r\n", "randomtype", progfuncs->stringtable+def->s_name);
715 for (stn = progs->functions[num].first_statement; stn < (signed int)pr_progs->numstatements; stn++)
717 if (ProductReadLater(progfuncs, progs, stn))
720 st = &((dstatement16_t*)progs->statements)[stn];
723 WriteStatement(progfuncs, progs, stn, progs->functions[num].first_statement);
726 longjmp(decompilestatementfailure, 1);
731 void FigureOutTypes(progfuncs_t *progfuncs)
740 ofstype = realloc(ofstype, sizeof(*ofstype)*65535);
741 ofsflags = realloc(ofsflags, sizeof(*ofsflags)*65535);
744 qcc_typeinfo = (void *)realloc(qcc_typeinfo, sizeof(QCC_type_t)*maxtypeinfos);
747 memset(ofstype, 0, sizeof(*ofstype)*65535);
748 memset(ofsflags, 0, sizeof(*ofsflags)*65535);
750 type_void = QCC_PR_NewType("void", ev_void);
751 type_string = QCC_PR_NewType("string", ev_string);
752 type_float = QCC_PR_NewType("float", ev_float);
753 type_vector = QCC_PR_NewType("vector", ev_vector);
754 type_entity = QCC_PR_NewType("entity", ev_entity);
755 type_field = QCC_PR_NewType("field", ev_field);
756 type_function = QCC_PR_NewType("function", ev_function);
757 type_pointer = QCC_PR_NewType("pointer", ev_pointer);
758 type_integer = QCC_PR_NewType("integer", ev_integer);
760 // type_variant = QCC_PR_NewType("__variant", ev_variant);
762 type_floatfield = QCC_PR_NewType("fieldfloat", ev_field);
763 type_floatfield->aux_type = type_float;
764 type_pointer->aux_type = QCC_PR_NewType("pointeraux", ev_float);
766 type_function->aux_type = type_void;
768 for (i = 0,st = pr_statements16; i < pr_progs->numstatements; i++,st++)
770 op = &pr_opcodes[st->op];
771 if (st->op >= OP_CALL1 && st->op <= OP_CALL8)
773 for (p = 0; p < (unsigned int)st->op-OP_CALL0; p++)
775 ofstype[parmofs[p]] = ofstype[OFS_PARM0+p*3];
778 else if (op->associative == ASSOC_RIGHT)
780 ofsflags[st->b] |= 1;
781 if (st->b >= OFS_PARM0 && st->b < RESERVED_OFS)
782 parmofs[(st->b-OFS_PARM0)/3] = st->a;
784 // 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)
786 if (op->type_c && op->type_c != &type_void)
787 ofstype[st->a] = *op->type_c;
788 if (op->type_b && op->type_b != &type_void)
789 ofstype[st->b] = *op->type_b;
794 ofsflags[st->c] |= 2;
796 if (st->c >= OFS_PARM0 && st->b < RESERVED_OFS) //too complicated
797 parmofs[(st->b-OFS_PARM0)/3] = 0;
799 // 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)
801 if (op->type_a && op->type_a != &type_void)
802 ofstype[st->a] = *op->type_a;
803 if (op->type_b && op->type_b != &type_void)
804 ofstype[st->b] = *op->type_b;
805 if (op->type_c && op->type_c != &type_void)
806 ofstype[st->c] = *op->type_c;
812 for (i=0 ; i<pr_progs->numglobaldefs ; i++)
814 def = &pr_globaldefs16[i];
815 ofsflags[def->ofs] |= 8;
819 ofstype[def->ofs] = type_float;
822 ofstype[def->ofs] = type_string;
825 ofstype[def->ofs] = type_vector;
833 pbool Decompile(progfuncs_t *progfuncs, char *fname)
835 extern progfuncs_t *qccprogfuncs;
842 progstate_t progs, *op;
844 qccprogfuncs = progfuncs;
845 op=current_progstate;
847 if (!PR_ReallyLoadProgs(progfuncs, fname, -1, &progs, false))
852 f=SafeOpenWrite("qcdtest/defs.qc", 1024*512);
854 writes(f, "//Decompiled code can contain little type info.\r\n#define NOWARNINGS\r\n");
856 FigureOutTypes(progfuncs);
858 for (i = 1; i < progs.progs->numglobaldefs; i++)
860 if (!strcmp(progfuncs->stringtable+pr_globaldefs16[i].s_name, "IMMEDIATE"))
863 if (ofsflags[pr_globaldefs16[i].ofs] & 4)
864 continue; //this is a local.
866 if (current_progstate->types)
867 type = progs.types[pr_globaldefs16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL)].type;
869 type = pr_globaldefs16[i].type & ~(DEF_SHARED|DEF_SAVEGLOBAL);
870 v = (eval_t *)&((int *)progs.globals)[pr_globaldefs16[i].ofs];
872 if (!progfuncs->stringtable[pr_globaldefs16[i].s_name])
875 if (ofsflags[pr_globaldefs16[i].ofs] & 3)
877 ofsflags[pr_globaldefs16[i].ofs] &= ~8;
878 continue; //this is a constant...
881 sprintf(mem, "_g_%i", pr_globaldefs16[i].ofs);
882 pr_globaldefs16[i].s_name = (char*)malloc(strlen(mem)+1)-progfuncs->stringtable;
883 strcpy(pr_globaldefs16[i].s_name+progfuncs->stringtable, mem);
889 writes(f, "void %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
892 if (v->string && *(pr_strings+v->_int))
893 writes(f, "string %s = \"%s\";\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, pr_strings+v->_int);
895 writes(f, "string %s;\r\n", pr_globaldefs16[i].s_name);
899 writes(f, "float %s = %f;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name, v->_float);
901 writes(f, "float %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
904 if (v->_vector[0] || v->_vector[1] || v->_vector[2])
905 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]);
907 writes(f, "vector %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
908 i+=3;//skip the floats
911 writes(f, "entity %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
918 switch(pr_fielddefs16[fld].type)
921 writes(f, ".string %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
925 writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
929 writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
933 writes(f, ".float %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
937 writes(f, ".void() %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
941 writes(f, "field %s;", progfuncs->stringtable+pr_globaldefs16[i].s_name);
945 writes(f, "/* %i */", v->_int);
951 WriteAsmStatements(progfuncs, &progs, ((int *)progs.globals)[pr_globaldefs16[i].ofs], f, pr_globaldefs16[i].s_name+progfuncs->stringtable);
955 writes(f, "pointer %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
958 writes(f, "integer %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
962 writes(f, "union %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
965 writes(f, "struct %s;\r\n", progfuncs->stringtable+pr_globaldefs16[i].s_name);
973 for (i = 0; i < progs.progs->numfunctions; i++)
975 WriteAsmStatements(progfuncs, &progs, i, f, NULL);
980 current_progstate=op;