]> git.pond.sub.org Git - empserver/blobdiff - src/util/empdump.c
Update copyright notice
[empserver] / src / util / empdump.c
index a486e3af40ab4ab00a2c9281240eca8222d765f8..0923afd08709049def79651eb509f6663da33b33 100644 (file)
@@ -1,11 +1,11 @@
 /*
  *  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,
@@ -14,8 +14,7 @@
  *  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/>.
  *
  *  ---
  *
@@ -26,9 +25,9 @@
  *  ---
  *
  *  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;
@@ -80,6 +83,7 @@ main(int argc, char *argv[])
            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"
@@ -129,13 +133,18 @@ main(int argc, char *argv[])
                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 */
@@ -148,15 +157,14 @@ main(int argc, char *argv[])
            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",
@@ -165,11 +173,18 @@ main(int argc, char *argv[])
        }
     }
 
+    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);
        }
@@ -203,23 +218,27 @@ printf_wrapper(char *fmt, ...)
 }
 
 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);
 }