]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - trek/dumpgame.c
Various changes to make games compile w/o warnings on the alpha:
[bsdgames-darwin.git] / trek / dumpgame.c
1 /* $NetBSD: dumpgame.c,v 1.4 1995/04/24 12:25:54 cgd Exp $ */
2
3 /*
4 * Copyright (c) 1980, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)dumpgame.c 8.1 (Berkeley) 5/31/93";
39 #else
40 static char rcsid[] = "$NetBSD: dumpgame.c,v 1.4 1995/04/24 12:25:54 cgd Exp $";
41 #endif
42 #endif /* not lint */
43
44 # include "trek.h"
45
46 /*** THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/
47 # define VERSION 2
48
49 struct dump
50 {
51 char *area;
52 int count;
53 };
54
55
56 struct dump Dump_template[] =
57 {
58 (char *)&Ship, sizeof (Ship),
59 (char *)&Now, sizeof (Now),
60 (char *)&Param, sizeof (Param),
61 (char *)&Etc, sizeof (Etc),
62 (char *)&Game, sizeof (Game),
63 (char *)Sect, sizeof (Sect),
64 (char *)Quad, sizeof (Quad),
65 (char *)&Move, sizeof (Move),
66 (char *)Event, sizeof (Event),
67 0
68 };
69
70 /*
71 ** DUMP GAME
72 **
73 ** This routine dumps the game onto the file "trek.dump". The
74 ** first two bytes of the file are a version number, which
75 ** reflects whether this image may be used. Obviously, it must
76 ** change as the size, content, or order of the data structures
77 ** output change.
78 */
79
80 dumpgame()
81 {
82 int version;
83 register int fd;
84 register struct dump *d;
85 register int i;
86
87 if ((fd = creat("trek.dump", 0644)) < 0)
88 return (printf("cannot dump\n"));
89 version = VERSION;
90 write(fd, &version, sizeof version);
91
92 /* output the main data areas */
93 for (d = Dump_template; d->area; d++)
94 {
95 write(fd, &d->area, sizeof d->area);
96 i = d->count;
97 write(fd, d->area, i);
98 }
99
100 close(fd);
101 }
102
103
104 /*
105 ** RESTORE GAME
106 **
107 ** The game is restored from the file "trek.dump". In order for
108 ** this to succeed, the file must exist and be readable, must
109 ** have the correct version number, and must have all the appro-
110 ** priate data areas.
111 **
112 ** Return value is zero for success, one for failure.
113 */
114
115 restartgame()
116 {
117 register int fd;
118 int version;
119
120 if ((fd = open("trek.dump", 0)) < 0 ||
121 read(fd, &version, sizeof version) != sizeof version ||
122 version != VERSION ||
123 readdump(fd))
124 {
125 printf("cannot restart\n");
126 close(fd);
127 return (1);
128 }
129
130 close(fd);
131 return (0);
132 }
133
134
135 /*
136 ** READ DUMP
137 **
138 ** This is the business end of restartgame(). It reads in the
139 ** areas.
140 **
141 ** Returns zero for success, one for failure.
142 */
143
144 readdump(fd1)
145 int fd1;
146 {
147 register int fd;
148 register struct dump *d;
149 register int i;
150 long junk;
151
152 fd = fd1;
153
154 for (d = Dump_template; d->area; d++)
155 {
156 if (read(fd, &junk, sizeof junk) != (sizeof junk))
157 return (1);
158 if ((char *)junk != d->area)
159 return (1);
160 i = d->count;
161 if (read(fd, d->area, i) != i)
162 return (1);
163 }
164
165 /* make quite certain we are at EOF */
166 return (read(fd, &junk, 1));
167 }