static void CLQW_CalcModelChecksum( const char* modelName, const char* cvarName ) { idList<byte> buffer; if ( !FS_ReadFile( modelName, buffer ) ) { common->Error( "Couldn't load %s", modelName ); } unsigned short crc; CRC_Init( &crc ); for ( int i = 0; i < buffer.Num(); i++ ) { CRC_ProcessByte( &crc, buffer[ i ] ); } char st[ 40 ]; sprintf( st, "%d", ( int )crc ); Info_SetValueForKey( cls.qh_userinfo, cvarName, st, MAX_INFO_STRING_QW, 64, 64, true, false ); sprintf( st, "setinfo %s %d", cvarName, ( int )crc ); CL_AddReliableCommand( st ); }
/* ================= Mod_LoadAliasModel ================= */ void Mod_LoadAliasModel (model_t *mod, void *buffer) { int i, j; mdl_t *pinmodel; stvert_t *pinstverts; dtriangle_t *pintriangles; int version, numframes; int size; daliasframetype_t *pframetype; daliasskintype_t *pskintype; int start, end, total; if (!strcmp(loadmodel->name, "progs/player.mdl") || !strcmp(loadmodel->name, "progs/eyes.mdl")) { unsigned short crc; byte *p; int len; char st[40]; CRC_Init(&crc); for (len = com_filesize, p = buffer; len; len--, p++) CRC_ProcessByte(&crc, *p); sprintf(st, "%d", (int) crc); Info_SetValueForKey (cls.userinfo, !strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name, st, MAX_INFO_STRING); if (cls.state >= ca_connected) { MSG_WriteByte (&cls.netchan.message, clc_stringcmd); sprintf(st, "setinfo %s %d", !strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name, (int)crc); SZ_Print (&cls.netchan.message, st); } } start = Hunk_LowMark (); pinmodel = (mdl_t *)buffer; version = LittleLong (pinmodel->version); if (version != ALIAS_VERSION) Sys_Error ("%s has wrong version number (%i should be %i)", mod->name, version, ALIAS_VERSION); // // allocate space for a working header, plus all the data except the frames, // skin and group info // size = sizeof (aliashdr_t) + (LittleLong (pinmodel->numframes) - 1) * sizeof (pheader->frames[0]); pheader = Hunk_AllocName (size, loadname); mod->flags = LittleLong (pinmodel->flags); // // endian-adjust and copy the data, starting with the alias model header // pheader->boundingradius = LittleFloat (pinmodel->boundingradius); pheader->numskins = LittleLong (pinmodel->numskins); pheader->skinwidth = LittleLong (pinmodel->skinwidth); pheader->skinheight = LittleLong (pinmodel->skinheight); if (pheader->skinheight > MAX_LBM_HEIGHT) Sys_Error ("model %s has a skin taller than %d", mod->name, MAX_LBM_HEIGHT); pheader->numverts = LittleLong (pinmodel->numverts); if (pheader->numverts <= 0) Sys_Error ("model %s has no vertices", mod->name); if (pheader->numverts > MAXALIASVERTS) Sys_Error ("model %s has too many vertices", mod->name); pheader->numtris = LittleLong (pinmodel->numtris); if (pheader->numtris <= 0) Sys_Error ("model %s has no triangles", mod->name); pheader->numframes = LittleLong (pinmodel->numframes); numframes = pheader->numframes; if (numframes < 1) Sys_Error ("Mod_LoadAliasModel: Invalid # of frames: %d\n", numframes); pheader->size = LittleFloat (pinmodel->size) * ALIAS_BASE_SIZE_RATIO; mod->synctype = LittleLong (pinmodel->synctype); mod->numframes = pheader->numframes; for (i=0 ; i<3 ; i++) { pheader->scale[i] = LittleFloat (pinmodel->scale[i]); pheader->scale_origin[i] = LittleFloat (pinmodel->scale_origin[i]); pheader->eyeposition[i] = LittleFloat (pinmodel->eyeposition[i]); } // // load the skins // pskintype = (daliasskintype_t *)&pinmodel[1]; pskintype = Mod_LoadAllSkins (pheader->numskins, pskintype); // // load base s and t vertices // pinstverts = (stvert_t *)pskintype; for (i=0 ; i<pheader->numverts ; i++) { stverts[i].onseam = LittleLong (pinstverts[i].onseam); stverts[i].s = LittleLong (pinstverts[i].s); stverts[i].t = LittleLong (pinstverts[i].t); } // // load triangle lists // pintriangles = (dtriangle_t *)&pinstverts[pheader->numverts]; for (i=0 ; i<pheader->numtris ; i++) { triangles[i].facesfront = LittleLong (pintriangles[i].facesfront); for (j=0 ; j<3 ; j++) { triangles[i].vertindex[j] = LittleLong (pintriangles[i].vertindex[j]); } } // // load the frames // posenum = 0; pframetype = (daliasframetype_t *)&pintriangles[pheader->numtris]; for (i=0 ; i<numframes ; i++) { aliasframetype_t frametype; frametype = LittleLong (pframetype->type); if (frametype == ALIAS_SINGLE) { pframetype = (daliasframetype_t *) Mod_LoadAliasFrame (pframetype + 1, &pheader->frames[i]); } else { pframetype = (daliasframetype_t *) Mod_LoadAliasGroup (pframetype + 1, &pheader->frames[i]); } } pheader->numposes = posenum; mod->type = mod_alias; // FIXME: do this right mod->mins[0] = mod->mins[1] = mod->mins[2] = -16; mod->maxs[0] = mod->maxs[1] = mod->maxs[2] = 16; // // build the draw lists // GL_MakeAliasModelDisplayLists (mod, pheader); // // move the complete, relocatable alias model to the cache // end = Hunk_LowMark (); total = end - start; Cache_Alloc (&mod->cache, total, loadname); if (!mod->cache.data) return; memcpy (mod->cache.data, pheader, total); Hunk_FreeToLowMark (start); }
/* =========== CopyQFiles =========== */ void CopyQFiles (int blocknum) { int i, p; char srcfile[1024]; char destfile[1024]; char name[1024]; packheader_t header; int dirlen; unsigned short crc; // create a pak file pf = pfiles; sprintf (destfile, "%spak%i.pak", gamedir, blocknum); packhandle = SafeOpenWrite (destfile); SafeWrite (packhandle, &header, sizeof(header)); blocknum++; for (i=0 ; i<numsounds ; i++) { if (precache_sounds_block[i] != blocknum) continue; sprintf (name, "sound/%s", precache_sounds[i]); sprintf (srcfile,"%s%s",gamedir, name); PackFile (srcfile, name); } for (i=0 ; i<nummodels ; i++) { if (precache_models_block[i] != blocknum) continue; sprintf (srcfile,"%s%s",gamedir, precache_models[i]); PackFile (srcfile, precache_models[i]); } for (i=0 ; i<numfiles ; i++) { if (precache_files_block[i] != blocknum) continue; sprintf (srcfile,"%s%s",gamedir, precache_files[i]); PackFile (srcfile, precache_files[i]); } header.id[0] = 'P'; header.id[1] = 'A'; header.id[2] = 'C'; header.id[3] = 'K'; dirlen = (byte *)pf - (byte *)pfiles; header.dirofs = LittleLong(ftell (packhandle)); header.dirlen = LittleLong(dirlen); SafeWrite (packhandle, pfiles, dirlen); fseek (packhandle, 0, SEEK_SET); SafeWrite (packhandle, &header, sizeof(header)); fclose (packhandle); // do a crc of the file CRC_Init (&crc); for (i=0 ; i<dirlen ; i++) CRC_ProcessByte (&crc, ((byte *)pfiles)[i]); i = pf - pfiles; printf ("%i files packed in %i bytes (%i crc)\n",i, packbytes, crc); }
/* ============ PR_WriteProgdefs Writes the global and entity structures out Returns a crc of the header, to be stored in the progs file for comparison at load time. ============ */ int PR_WriteProgdefs (char *filename) { def_t *d; FILE *f; unsigned short crc; int c; printf ("writing %s\n", filename); f = fopen (filename, "w"); // 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", RESERVED_OFS); for (d=pr.def_head.next ; d ; d=d->next) { if (!strcmp (d->name, "end_sys_globals")) break; switch (d->type->type) { case ev_float: fprintf (f, "\tfloat\t%s;\n",d->name); break; case ev_vector: fprintf (f, "\tvec3_t\t%s;\n",d->name); d=d->next->next->next; // skip the elements break; case ev_string: fprintf (f,"\tstring_t\t%s;\n",d->name); break; case ev_function: fprintf (f,"\tfunc_t\t%s;\n",d->name); break; case ev_entity: fprintf (f,"\tint\t%s;\n",d->name); break; default: fprintf (f,"\tint\t%s;\n",d->name); break; } } fprintf (f,"} globalvars_t;\n\n"); // print all fields fprintf (f,"typedef struct\n{\n"); for (d=pr.def_head.next ; d ; d=d->next) { if (!strcmp (d->name, "end_sys_fields")) break; if (d->type->type != ev_field) continue; switch (d->type->aux_type->type) { case ev_float: fprintf (f,"\tfloat\t%s;\n",d->name); break; case ev_vector: fprintf (f,"\tvec3_t\t%s;\n",d->name); d=d->next->next->next; // skip the elements break; case ev_string: fprintf (f,"\tstring_t\t%s;\n",d->name); break; case ev_function: fprintf (f,"\tfunc_t\t%s;\n",d->name); break; case ev_entity: fprintf (f,"\tint\t%s;\n",d->name); break; default: fprintf (f,"\tint\t%s;\n",d->name); break; } } fprintf (f,"} entvars_t;\n\n"); fclose (f); // do a crc of the file CRC_Init (&crc); f = fopen (filename, "r+"); while ((c = fgetc(f)) != EOF) CRC_ProcessByte (&crc, (byte)c); fprintf (f,"#define PROGHEADER_CRC %i\n", crc); fclose (f); return crc; }
static int ProcessInQueue (SerialLine *p) { int b; while (1) { b = TTY_ReadByte(p->tty); if (b == ERR_TTY_NODATA) break; if (b == ERR_TTY_LINE_STATUS) { p->currState = STATE_ABORT; continue; } if (b == ERR_TTY_MODEM_STATUS) { p->currState = STATE_ABORT; return -1; } if (b == ESCAPE_COMMAND) { if (p->currState != STATE_ESCAPE) { p->prevState = p->currState; p->currState = STATE_ESCAPE; continue; } } if (p->currState == STATE_ESCAPE) { if (b == ESCAPE_EOM) { if (p->prevState == STATE_ABORT) { p->currState = STATE_READY; p->lengthFound = 0; continue; } if (p->prevState != STATE_EOM) { p->currState = STATE_READY; p->lengthFound = 0; Con_DPrintf("Serial: premature EOM\n"); continue; } switch (p->mtype) { case MTYPE_RELIABLE: Con_DPrintf("Serial: sending ack %u\n", p->sequence); Serial_SendACK (p, p->sequence); if (p->sequence == p->sock->receiveSequence) { p->sock->receiveSequence = (p->sequence + 1) & 0xff; p->sock->receiveMessageLength += p->lengthFound; } else { Con_DPrintf("Serial: reliable out of order; got %u wanted %u\n", p->sequence, p->sock->receiveSequence); } break; case MTYPE_UNRELIABLE: p->sock->unreliableReceiveSequence = (p->sequence + 1) & 0xff; p->sock->receiveMessageLength += p->lengthFound; break; case MTYPE_ACK: Con_DPrintf("Serial: got ack %u\n", p->sequence); if (p->sequence == p->sock->sendSequence) { p->sock->sendSequence = (p->sock->sendSequence + 1) & 0xff; p->sock->canSend = true; } else { Con_DPrintf("Serial: ack out of order; got %u wanted %u\n", p->sequence, p->sock->sendSequence); } break; case MTYPE_CONTROL: p->sock->receiveMessageLength += p->lengthFound; break; } p->currState = STATE_READY; p->lengthFound = 0; continue; } if (b != ESCAPE_COMMAND) { p->currState = STATE_ABORT; Con_DPrintf("Serial: Bad escape sequence\n"); continue; } /* b == ESCAPE_COMMAND */ p->currState = p->prevState; } p->prevState = p->currState; /* DEBUG */ if (p->sock->receiveMessageLength + p->lengthFound > NET_MAXMESSAGE) { Con_DPrintf("Serial blew out receive buffer: %u\n", p->sock->receiveMessageLength + p->lengthFound); p->currState = STATE_ABORT; } if (p->sock->receiveMessageLength + p->lengthFound == NET_MAXMESSAGE) { Con_DPrintf("Serial hit receive buffer limit: %u\n", p->sock->receiveMessageLength + p->lengthFound); p->currState = STATE_ABORT; } /* end DEBUG */ switch (p->currState) { case STATE_READY: CRC_Init(&p->crcValue); CRC_ProcessByte(&p->crcValue, b); if (p->client) { if ((b & MTYPE_CLIENT) != 0) { p->currState = STATE_ABORT; Con_DPrintf("Serial: client got own message\n"); break; } } else { if ((b & MTYPE_CLIENT) == 0) { p->currState = STATE_ABORT; Con_DPrintf("Serial: server got own message\n"); break; } b &= 0x7f; } p->mtype = b; if (b != MTYPE_CONTROL) p->currState = STATE_SEQUENCE; else p->currState = STATE_LENGTH1; if (p->mtype < MTYPE_ACK) { p->sock->receiveMessage[p->sock->receiveMessageLength] = b; p->lengthFound++; } break; case STATE_SEQUENCE: p->sequence = b; CRC_ProcessByte(&p->crcValue, b); if (p->mtype != MTYPE_ACK) p->currState = STATE_LENGTH1; else p->currState = STATE_CRC1; break; case STATE_LENGTH1: p->lengthStated = b * 256; CRC_ProcessByte(&p->crcValue, b); p->currState = STATE_LENGTH2; break; case STATE_LENGTH2: p->lengthStated += b; CRC_ProcessByte(&p->crcValue, b); if (p->mtype == MTYPE_RELIABLE && p->lengthStated > MAX_MSGLEN) { p->currState = STATE_ABORT; Con_DPrintf("Serial: bad reliable message length %u\n", p->lengthStated); } else if (p->mtype == MTYPE_UNRELIABLE && p->lengthStated > MAX_DATAGRAM) { p->currState = STATE_ABORT; Con_DPrintf("Serial: bad unreliable message length %u\n", p->lengthStated); } else { p->currState = STATE_DATA; if (p->mtype < MTYPE_ACK) { p->sock->receiveMessage [p->sock->receiveMessageLength + 1] = (((short) p->lengthStated) & 0x00ff); p->sock->receiveMessage [p->sock->receiveMessageLength + 2] = (((short) p->lengthStated) & 0xff00) >> 8; p->lengthFound += 2; } } break; case STATE_DATA: p->sock->receiveMessage[p->sock->receiveMessageLength + p->lengthFound] = b; p->lengthFound++; CRC_ProcessByte(&p->crcValue, b); if (p->lengthFound == p->lengthStated + 3) p->currState = STATE_CRC1; break; case STATE_CRC1: p->crcStated = b * 256; p->currState = STATE_CRC2; break; case STATE_CRC2: p->crcStated += b; if (p->crcStated == CRC_Value(p->crcValue)) { p->currState = STATE_EOM; } else { p->currState = STATE_ABORT; Con_DPrintf("Serial: Bad crc\n"); } break; case STATE_EOM: p->currState = STATE_ABORT; Con_DPrintf("Serial: Bad message format\n"); break; case STATE_ABORT: break; } }
/* =============== PR_LoadProgs =============== */ void PR_LoadProgs (void) { int i; // flush the non-C variable lookup cache for (i = 0; i < GEFV_CACHESIZE; i++) gefvCache[i].field[0] = 0; CRC_Init (&pr_crc); progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat", NULL); if (!progs) Host_Error ("PR_LoadProgs: couldn't load progs.dat"); Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024); for (i = 0; i < com_filesize; i++) CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]); // byte swap the header for (i = 0; i < (int) sizeof(*progs) / 4; i++) ((int *)progs)[i] = LittleLong ( ((int *)progs)[i] ); if (progs->version != PROG_VERSION) Host_Error ("progs.dat has wrong version number (%i should be %i)", progs->version, PROG_VERSION); if (progs->crc != PROGHEADER_CRC) Host_Error ("progs.dat system vars have been modified, progdefs.h is out of date"); pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions); pr_strings = (char *)progs + progs->ofs_strings; if (progs->ofs_strings + progs->numstrings >= com_filesize) Host_Error ("progs.dat strings go past end of file\n"); // initialize the strings pr_numknownstrings = 0; pr_maxknownstrings = 0; pr_stringssize = progs->numstrings; if (pr_knownstrings) Z_Free ((void *)pr_knownstrings); pr_knownstrings = NULL; PR_SetEngineString(""); pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs); pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs); pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements); pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals); pr_globals = (float *)pr_global_struct; // byte swap the lumps for (i = 0; i < progs->numstatements; i++) { pr_statements[i].op = LittleShort(pr_statements[i].op); pr_statements[i].a = LittleShort(pr_statements[i].a); pr_statements[i].b = LittleShort(pr_statements[i].b); pr_statements[i].c = LittleShort(pr_statements[i].c); } for (i = 0; i < progs->numfunctions; i++) { pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement); pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start); pr_functions[i].s_name = LittleLong (pr_functions[i].s_name); pr_functions[i].s_file = LittleLong (pr_functions[i].s_file); pr_functions[i].numparms = LittleLong (pr_functions[i].numparms); pr_functions[i].locals = LittleLong (pr_functions[i].locals); } for (i = 0; i < progs->numglobaldefs; i++) { pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type); pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs); pr_globaldefs[i].s_name = LittleLong (pr_globaldefs[i].s_name); } pr_alpha_supported = false; //johnfitz for (i = 0; i < progs->numfielddefs; i++) { pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type); if (pr_fielddefs[i].type & DEF_SAVEGLOBAL) Host_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL"); pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs); pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name); //johnfitz -- detect alpha support in progs.dat if (!strcmp(pr_strings + pr_fielddefs[i].s_name,"alpha")) pr_alpha_supported = true; //johnfitz } for (i = 0; i < progs->numglobals; i++) ((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]); pr_edict_size = progs->entityfields * 4 + sizeof(edict_t) - sizeof(entvars_t); // round off to next highest whole word address (esp for Alpha) // this ensures that pointers in the engine data area are always // properly aligned pr_edict_size += sizeof(void *) - 1; pr_edict_size &= ~(sizeof(void *) - 1); }
/* =============== PR_LoadProgs =============== */ void PR_LoadProgs (void) { int i; // flush the non-C variable lookup cache for (i=0 ; i<GEFV_CACHESIZE ; i++) gefvCache[i].field[0] = 0; CRC_Init (&pr_crc); progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat"); if (!progs) Sys_Error ("PR_LoadProgs: couldn't load progs.dat"); Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024); for (i=0 ; i<com_filesize ; i++) CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]); // byte swap the header for (i=0 ; i<sizeof(*progs)/4 ; i++) ((int *)progs)[i] = LittleLong ( ((int *)progs)[i] ); if (progs->version != PROG_VERSION) Sys_Error ("progs.dat has wrong version number (%i should be %i)", progs->version, PROG_VERSION); if (progs->crc != PROGHEADER_CRC) Sys_Error ("progs.dat system vars have been modified, progdefs.h is out of date"); pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions); pr_strings = (char *)progs + progs->ofs_strings; pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs); pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs); pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements); pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals); pr_globals = (float *)pr_global_struct; pr_edict_size = progs->entityfields * 4 + sizeof (edict_t) - sizeof(entvars_t); // byte swap the lumps for (i=0 ; i<progs->numstatements ; i++) { pr_statements[i].op = LittleShort(pr_statements[i].op); pr_statements[i].a = LittleShort(pr_statements[i].a); pr_statements[i].b = LittleShort(pr_statements[i].b); pr_statements[i].c = LittleShort(pr_statements[i].c); } for (i=0 ; i<progs->numfunctions; i++) { pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement); pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start); pr_functions[i].s_name = LittleLong (pr_functions[i].s_name); pr_functions[i].s_file = LittleLong (pr_functions[i].s_file); pr_functions[i].numparms = LittleLong (pr_functions[i].numparms); pr_functions[i].locals = LittleLong (pr_functions[i].locals); } for (i=0 ; i<progs->numglobaldefs ; i++) { pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type); pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs); pr_globaldefs[i].s_name = LittleLong (pr_globaldefs[i].s_name); } for (i=0 ; i<progs->numfielddefs ; i++) { pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type); if (pr_fielddefs[i].type & DEF_SAVEGLOBAL) Sys_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL"); pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs); pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name); } for (i=0 ; i<progs->numglobals ; i++) ((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]); }
/* ============ main ============ */ int main (int argc, char **argv) { const char *psrc; void *src, *src2; char filename[1024]; int p, c; unsigned short crc; double start, stop; FILE *f; myargc = argc; myargv = argv; if (CheckParm("-?") || CheckParm("-h") || CheckParm("-help") || CheckParm("--help")) { printf(" Compiles progs.dat using progs.src in the current directory\n"); printf(" -src <directory> : Specify source directory\n"); printf(" -dcc : decompile the progs.dat in the current directory\n"); printf(" -dcc -fix : fixes mangled names during decompilation\n"); printf(" -dcc -asm <functionname> : decompile filename to the console\n"); printf(" -dcc -dump -asm <functionname> : same as above but will show\n\t\tinstructions (opcodes and parms) as well\n"); exit(0); } ValidateByteorder (); start = GetTime (); p = CheckParm("-src"); if (p && p < argc-1) { strcpy(sourcedir, argv[p+1]); strcat(sourcedir, "/"); printf("Source directory: %s\n", sourcedir); } else { sourcedir[0] = '\0'; } InitData (); PR_FILE = stdout; p = CheckParm("-dump"); if (p) pr_dumpasm = true; // do a crc of the file p = CheckParm("-crc"); if (p) { CRC_Init (&crc); f = fopen ("progdefs.h", "r"); while ((c = fgetc(f)) != EOF) CRC_ProcessByte (&crc, (byte)c); printf ("#define PROGHEADER_CRC %i %d\n", crc, (int)crc); fclose (f); exit (0); } p = CheckParm("-dcc"); if (p) { DEC_ReadData ("progs.dat"); //fix mangled names if asked p = CheckParm ("-fix"); if (p) FILE_NUM_FOR_NAME = 1; memset(func_headers, 0, MAX_FUNCTIONS * sizeof(char *)); memset(temp_val, 0, MAX_REGS * sizeof(char *)); p = CheckParm("-bbb"); if (p) { /* i= -999; for (p = 0; p < numstatements; p++) if ((statements+p)->op > i) i = (statements+p)->op; printf("largest op %d\n", i); */ FindBuiltinParameters(1); exit (0); } p = CheckParm("-ddd"); if (p) { for (p++ ; p < argc ; p++) { if (argv[p][0] == '-') break; DccFunctionOP (atoi(argv[p])); } exit (0); } p = CheckParm("-info2"); if (p) { printf("\n=======================\n"); printf("fields\n"); printf("=======================\n"); PrintFields (); printf("\n=======================\n"); printf("globals\n"); printf("=======================\n"); PrintGlobals (); exit (0); } p = CheckParm("-info"); if (p) { printf("\n=======================\n"); printf("strings\n"); printf("=======================\n"); PrintStrings (); printf("\n=======================\n"); printf("functions"); printf("\n=======================\n"); PrintFunctions (); printf("\n=======================\n"); printf("fields\n"); printf("=======================\n"); PrintFields (); printf("\n=======================\n"); printf("globals\n"); printf("=======================\n"); PrintGlobals (); printf("\n=======================\n"); printf("pr_globals\n"); printf("=======================\n"); PrintPRGlobals (); printf("\n=======================\n"); printf("statements\n"); printf("=======================\n"); Printstatements(); exit (0); } p = CheckParm("-asm"); if (p) { for (p++; p < argc; p++) { if (argv[p][0] == '-') break; PR_PrintFunction(argv[p]); } } else { Dcc_Functions (); stop = GetTime (); printf("\n%d seconds elapsed.\n", (int)(stop-start)); } exit (0); } sprintf(filename, "%sprogs.src", sourcedir); LoadFile(filename, &src); psrc = (char *) src; psrc = COM_Parse(psrc); if (!psrc) { Error("No destination filename. HCC -help for info.\n"); } strcpy(destfile, com_token); printf("outputfile: %s\n", destfile); pr_dumpasm = false; PR_BeginCompilation(); // compile all the files do { psrc = COM_Parse(psrc); if (!psrc) break; sprintf (filename, "%s%s", sourcedir, com_token); printf ("compiling %s\n", filename); LoadFile (filename, &src2); if (!PR_CompileFile((char *)src2, filename)) exit (1); } while (1); if (!PR_FinishCompilation()) { Error ("compilation errors"); } p = CheckParm("-asm"); if (p) { for (p++; p < argc; p++) { if (argv[p][0] == '-') { break; } PrintFunction(argv[p]); } } // write progdefs.h crc = PR_WriteProgdefs("progdefs.h"); // crc = 14046; // FIXME: cheap hack for now!!!!!!!!!!!!! // write data file WriteData(crc); // write files.dat WriteFiles(); stop = GetTime (); printf("\n%d seconds elapsed.\n", (int)(stop-start)); exit (0); }