Initial import from FreeBSD RELENG_4:
[dragonfly.git] / games / trek / dumpgame.c
1 /*
2  * Copyright (c) 1980, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #ifndef lint
35 #if 0
36 static char sccsid[] = "@(#)dumpgame.c  8.1 (Berkeley) 5/31/93";
37 #endif
38 static const char rcsid[] =
39  "$FreeBSD: src/games/trek/dumpgame.c,v 1.6 1999/11/30 03:49:46 billf Exp $";
40 #endif /* not lint */
41
42 #include <fcntl.h>
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         int             fd;
84         struct dump     *d;
85         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         int     fd;
118         int             version;
119
120         if ((fd = open("trek.dump", O_RDONLY)) < 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         int             fd;
148         struct dump     *d;
149         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 }