/* #FILENAME# #DESCRIPTION# Copyright (C) 2001 #AUTHOR# Author: #AUTHOR# Date: #DATE# This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to: Free Software Foundation, Inc. 59 Temple Place - Suite 330 Boston, MA 02111-1307, USA */ static const char rcsid[] = "$Id$"; #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include "QF/progs.h" #include #include #include #include #include "def.h" void *membase; int memsize = 16*1024*1024; progs_t progs; int main (int argc, char **argv) { def_t *globals, *fields, *def; Cvar_Init_Hash (); Cmd_Init_Hash (); membase = malloc (memsize); Memory_Init (membase, memsize); Cvar_Init (); Cbuf_Init (); Cmd_Init (); Cvar_Get ("fs_basegame", "", 0, 0, 0); Cvar_Get ("fs_userpath", "", 0, 0, 0); Cvar_Get ("fs_sharepath", "", 0, 0, 0); PR_Init_Cvars (); COM_Filesystem_Init_Cvars (); COM_Filesystem_Init (); PR_Init (); if (argc < 2) { fprintf (stderr, "usage: qfdefs ...\n"); return 1; } while (--argc) { int fix = 0; int size; VFile *file; progs.progs_name = *++argv; size = COM_FOpenFile (progs.progs_name, &file); if (size != -1) PR_LoadProgsFile (&progs, file, size, 0, 0); if (size == -1 || !progs.progs) { fprintf (stderr, "failed to load %s\n", progs.progs_name); return 1; } if (progs.progs->version < 0x100) printf ("%s: version %d\n", progs.progs_name, progs.progs->version); else printf ("%s: version %x.%03x.%03x\n", progs.progs_name, (progs.progs->version >> 24) & 0xff, (progs.progs->version >> 12) & 0xfff, progs.progs->version & 0xfff); if (progs.progs->crc == nq_crc) { printf ("%s: netquake crc\n", progs.progs_name); Init_Defs (nq_global_defs, nq_field_defs); globals = nq_global_defs; fields = nq_field_defs; } else if (progs.progs->crc == qw_crc) { printf ("%s: quakeworld crc\n", progs.progs_name); Init_Defs (qw_global_defs, qw_field_defs); globals = qw_global_defs; fields = qw_field_defs; } else { printf ("%s: unknown crc %d\n", progs.progs_name, progs.progs->crc); continue; } for (def = globals; def->name; def++) if (!PR_FindGlobal (&progs, def->name)) break; if (!def->name) printf ("%s: all system globals accounted for\n", progs.progs_name); else { printf ("%s: some system globals missing\n", progs.progs_name); fix_missing_globals (&progs, globals); fix++; } for (def = fields; def->name; def++) if (!ED_FindField (&progs, def->name)) break; if (!def->name) printf ("%s: all system fields accounted for\n", progs.progs_name); else { printf ("%s: some system fields missing\n", progs.progs_name); } if (fix) { //XXX FIXME endian fixups FILE *f = fopen (va ("%s.new", progs.progs_name), "wb"); fwrite (progs.progs, progs.progs_size, 1, f); fclose (f); } } return 0; }