1a9822c3aSmckusick /*
2*e8c4bdd9Sbostic * Copyright (c) 1980, 1993
3*e8c4bdd9Sbostic * The Regents of the University of California. All rights reserved.
4afcc7e22Sbostic *
589363ea9Sbostic * %sccs.include.redist.c%
6a9822c3aSmckusick */
7a9822c3aSmckusick
8c0b5df7aSmckusick #ifndef lint
9*e8c4bdd9Sbostic static char sccsid[] = "@(#)dumpgame.c 8.1 (Berkeley) 05/31/93";
10afcc7e22Sbostic #endif /* not lint */
11c0b5df7aSmckusick
12c0b5df7aSmckusick # include "trek.h"
13c0b5df7aSmckusick
14c0b5df7aSmckusick /*** THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/
150e7cdb64Slayer # define VERSION 2
16c0b5df7aSmckusick
17c0b5df7aSmckusick struct dump
18c0b5df7aSmckusick {
19c0b5df7aSmckusick char *area;
20c0b5df7aSmckusick int count;
21c0b5df7aSmckusick };
22c0b5df7aSmckusick
230e7cdb64Slayer
240e7cdb64Slayer struct dump Dump_template[] =
25c0b5df7aSmckusick {
260e7cdb64Slayer (char *)&Ship, sizeof (Ship),
270e7cdb64Slayer (char *)&Now, sizeof (Now),
280e7cdb64Slayer (char *)&Param, sizeof (Param),
290e7cdb64Slayer (char *)&Etc, sizeof (Etc),
300e7cdb64Slayer (char *)&Game, sizeof (Game),
310e7cdb64Slayer (char *)Sect, sizeof (Sect),
320e7cdb64Slayer (char *)Quad, sizeof (Quad),
330e7cdb64Slayer (char *)&Move, sizeof (Move),
340e7cdb64Slayer (char *)Event, sizeof (Event),
35c0b5df7aSmckusick 0
36c0b5df7aSmckusick };
37c0b5df7aSmckusick
38c0b5df7aSmckusick /*
39c0b5df7aSmckusick ** DUMP GAME
40c0b5df7aSmckusick **
41c0b5df7aSmckusick ** This routine dumps the game onto the file "trek.dump". The
42c0b5df7aSmckusick ** first two bytes of the file are a version number, which
43c0b5df7aSmckusick ** reflects whether this image may be used. Obviously, it must
44c0b5df7aSmckusick ** change as the size, content, or order of the data structures
45c0b5df7aSmckusick ** output change.
46c0b5df7aSmckusick */
47c0b5df7aSmckusick
dumpgame()48c0b5df7aSmckusick dumpgame()
49c0b5df7aSmckusick {
50c0b5df7aSmckusick int version;
51c0b5df7aSmckusick register int fd;
52c0b5df7aSmckusick register struct dump *d;
53c0b5df7aSmckusick register int i;
54c0b5df7aSmckusick
55c0b5df7aSmckusick if ((fd = creat("trek.dump", 0644)) < 0)
56c0b5df7aSmckusick return (printf("cannot dump\n"));
57c0b5df7aSmckusick version = VERSION;
58c0b5df7aSmckusick write(fd, &version, sizeof version);
59c0b5df7aSmckusick
60c0b5df7aSmckusick /* output the main data areas */
61c0b5df7aSmckusick for (d = Dump_template; d->area; d++)
62c0b5df7aSmckusick {
63c0b5df7aSmckusick write(fd, &d->area, sizeof d->area);
64c0b5df7aSmckusick i = d->count;
65c0b5df7aSmckusick write(fd, d->area, i);
66c0b5df7aSmckusick }
67c0b5df7aSmckusick
68c0b5df7aSmckusick close(fd);
69c0b5df7aSmckusick }
70c0b5df7aSmckusick
71c0b5df7aSmckusick
72c0b5df7aSmckusick /*
73c0b5df7aSmckusick ** RESTORE GAME
74c0b5df7aSmckusick **
75c0b5df7aSmckusick ** The game is restored from the file "trek.dump". In order for
76c0b5df7aSmckusick ** this to succeed, the file must exist and be readable, must
77c0b5df7aSmckusick ** have the correct version number, and must have all the appro-
78c0b5df7aSmckusick ** priate data areas.
79c0b5df7aSmckusick **
80c0b5df7aSmckusick ** Return value is zero for success, one for failure.
81c0b5df7aSmckusick */
82c0b5df7aSmckusick
restartgame()83c0b5df7aSmckusick restartgame()
84c0b5df7aSmckusick {
85c0b5df7aSmckusick register int fd;
86c0b5df7aSmckusick int version;
87c0b5df7aSmckusick
88c0b5df7aSmckusick if ((fd = open("trek.dump", 0)) < 0 ||
89c0b5df7aSmckusick read(fd, &version, sizeof version) != sizeof version ||
90c0b5df7aSmckusick version != VERSION ||
91c0b5df7aSmckusick readdump(fd))
92c0b5df7aSmckusick {
93c0b5df7aSmckusick printf("cannot restart\n");
94c0b5df7aSmckusick close(fd);
95c0b5df7aSmckusick return (1);
96c0b5df7aSmckusick }
97c0b5df7aSmckusick
98c0b5df7aSmckusick close(fd);
99c0b5df7aSmckusick return (0);
100c0b5df7aSmckusick }
101c0b5df7aSmckusick
102c0b5df7aSmckusick
103c0b5df7aSmckusick /*
104c0b5df7aSmckusick ** READ DUMP
105c0b5df7aSmckusick **
106c0b5df7aSmckusick ** This is the business end of restartgame(). It reads in the
107c0b5df7aSmckusick ** areas.
108c0b5df7aSmckusick **
109c0b5df7aSmckusick ** Returns zero for success, one for failure.
110c0b5df7aSmckusick */
111c0b5df7aSmckusick
readdump(fd1)112c0b5df7aSmckusick readdump(fd1)
113c0b5df7aSmckusick int fd1;
114c0b5df7aSmckusick {
115c0b5df7aSmckusick register int fd;
116c0b5df7aSmckusick register struct dump *d;
117c0b5df7aSmckusick register int i;
118c0b5df7aSmckusick int junk;
119c0b5df7aSmckusick
120c0b5df7aSmckusick fd = fd1;
121c0b5df7aSmckusick
122c0b5df7aSmckusick for (d = Dump_template; d->area; d++)
123c0b5df7aSmckusick {
1240e7cdb64Slayer if (read(fd, &junk, sizeof junk) != (sizeof junk))
125c0b5df7aSmckusick return (1);
1260e7cdb64Slayer if ((char *)junk != d->area)
127c0b5df7aSmckusick return (1);
128c0b5df7aSmckusick i = d->count;
129c0b5df7aSmckusick if (read(fd, d->area, i) != i)
130c0b5df7aSmckusick return (1);
131c0b5df7aSmckusick }
132c0b5df7aSmckusick
133c0b5df7aSmckusick /* make quite certain we are at EOF */
134c0b5df7aSmckusick return (read(fd, &junk, 1));
135c0b5df7aSmckusick }
136