/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure, Markus Armbruster
*
- * This program is free software; you can redistribute it and/or modify
+ * Empire 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
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* 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 the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* ---
*
* empdump.c: Export/import Empire game state
- *
+ *
* Known contributors to this file:
- * Markus Armbruster, 2008
+ * Markus Armbruster, 2008-2014
*/
#include <config.h>
static void exit_bad_arg(char *, ...)
ATTRIBUTE((noreturn, format (printf, 1, 2)));
-static void dump_table(int, int);
+static void dump_table(int, int, int, int);
int
main(int argc, char *argv[])
{
char *config_file = NULL;
char *import = NULL;
+ int complete = 0;
int export = 0;
int private = 0;
int human = 1;
- int opt, i, lineno, type;
+ int opt, i, lineno, type, verified;
FILE *impf = NULL;
int dirty[EF_MAX];
- while ((opt = getopt(argc, argv, "e:i:mnxhv")) != EOF) {
+ while ((opt = getopt(argc, argv, "ce:i:mnxhv")) != EOF) {
switch (opt) {
+ case 'c':
+ complete = 1;
+ break;
case 'e':
config_file = optarg;
break;
break;
case 'h':
printf("Usage: %s [OPTION]...\n"
+ " -c use complete export format\n"
" -e CONFIG-FILE configuration file\n"
" (default %s)\n"
" -i DUMP-FILE import from DUMP-FILE\n"
argv[0], gamedir, strerror(errno));
exit(1);
}
+ if (ef_verify_config() < 0)
+ exit(1);
global_init();
for (i = 0; i < EF_MAX; i++) {
- if (!EF_IS_GAME_STATE(i))
- continue;
- if (!ef_open(i, EFF_MEM | private, -1))
- exit(1);
+ if (EF_IS_GAME_STATE(i)) {
+ if (!ef_open(i, EFF_MEM | private))
+ exit(1);
+ } else if (EF_IS_VIEW(i)) {
+ if (ef_open_view(i) < 0)
+ exit(1);
+ }
}
/* import from IMPORT */
exit(1);
}
- if (ef_verify() < 0)
- exit(1);
+ verified = ef_verify_state(0) >= 0;
/* export to stdout */
if (export) {
for (i = 0; i < EF_MAX; i++) {
if (!EF_IS_GAME_STATE(i))
continue;
- dump_table(i, human);
+ dump_table(i, human, !verified, complete);
}
if (fclose(stdout) != 0) {
fprintf(stderr, "%s: error writing export (%s)\n",
}
}
+ if (!verified && export)
+ fprintf(stderr,
+ "%s: warning: export has errors, not importable as is\n",
+ argv[0]);
+ if (!verified && import)
+ exit(1);
+
/* write out imported data */
for (i = 0; i < EF_MAX; i++) {
if (!EF_IS_GAME_STATE(i))
continue;
- if (!private && dirty[i]) {
+ if (dirty[i]) {
if (!ef_close(i))
exit(1);
}
}
static void
-dump_table(int type, int human)
+dump_table(int type, int human, int sloppy, int complete)
{
struct xdstr xd;
struct castr *ca;
- int i;
+ int i, n;
void *p;
ca = ef_cadef(type);
if (!ca)
return;
- xdinit(&xd, NATID_BAD, human, printf_wrapper);
+ xdinit(&xd, NATID_BAD, human, sloppy, printf_wrapper);
xdhdr(&xd, ef_nameof(type), 0);
xdcolhdr(&xd, ca);
+ n = 0;
for (i = 0; (p = ef_ptr(type, i)); i++) {
+ if (!complete && xundump_redundant(type, i, p))
+ continue;
xdflds(&xd, ca, p);
+ n++;
printf("\n");
}
- xdftr(&xd, i);
+ xdftr(&xd, n);
}