Merge from vendor branch FILE:
[games.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  * @(#)dumpgame.c       8.1 (Berkeley) 5/31/93
34  * $FreeBSD: src/games/trek/dumpgame.c,v 1.6 1999/11/30 03:49:46 billf Exp $
35  * $DragonFly: src/games/trek/dumpgame.c,v 1.3 2006/09/07 21:19:44 pavalos Exp $
36  */
37
38 #include <fcntl.h>
39
40 # include       "trek.h"
41
42 /***  THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/
43 # define        VERSION         2
44
45 struct dump
46 {
47         char    *area;
48         int     count;
49 };
50
51
52 struct dump     Dump_template[] =
53 {
54         { (char *)&Ship,        sizeof (Ship)   },
55         { (char *)&Now,         sizeof (Now)    },
56         { (char *)&Param,       sizeof (Param)  },
57         { (char *)&Etc,         sizeof (Etc)    },
58         { (char *)&Game,        sizeof (Game)   },
59         { (char *)Sect,         sizeof (Sect)   },
60         { (char *)Quad,         sizeof (Quad)   },
61         { (char *)&Move,        sizeof (Move)   },
62         { (char *)Event,        sizeof (Event)  },
63         { NULL,                 0               }
64 };
65
66 static bool     readdump(int);
67
68 /*
69 **  DUMP GAME
70 **
71 **      This routine dumps the game onto the file "trek.dump".  The
72 **      first two bytes of the file are a version number, which
73 **      reflects whether this image may be used.  Obviously, it must
74 **      change as the size, content, or order of the data structures
75 **      output change.
76 */
77
78 void
79 dumpgame(__unused int unused)
80 {
81         int                     version;
82         int             fd;
83         struct dump     *d;
84         int             i;
85
86         if ((fd = creat("trek.dump", 0644)) < 0) {
87                 printf("cannot dump\n");
88                 return;
89         }
90         version = VERSION;
91         write(fd, &version, sizeof version);
92
93         /* output the main data areas */
94         for (d = Dump_template; d->area; d++)
95         {
96                 write(fd, &d->area, sizeof d->area);
97                 i = d->count;
98                 write(fd, d->area, i);
99         }
100
101         close(fd);
102 }
103
104
105 /*
106 **  RESTORE GAME
107 **
108 **      The game is restored from the file "trek.dump".  In order for
109 **      this to succeed, the file must exist and be readable, must
110 **      have the correct version number, and must have all the appro-
111 **      priate data areas.
112 **
113 **      Return value is zero for success, one for failure.
114 */
115
116 bool
117 restartgame(void)
118 {
119         int     fd;
120         int             version;
121
122         if ((fd = open("trek.dump", O_RDONLY)) < 0 ||
123             read(fd, &version, sizeof version) != sizeof version ||
124             version != VERSION ||
125             readdump(fd))
126         {
127                 printf("cannot restart\n");
128                 close(fd);
129                 return (1);
130         }
131
132         close(fd);
133         return (0);
134 }
135
136
137 /*
138 **  READ DUMP
139 **
140 **      This is the business end of restartgame().  It reads in the
141 **      areas.
142 **
143 **      Returns zero for success, one for failure.
144 */
145
146 static bool
147 readdump(int fd1)
148 {
149         int             fd;
150         struct dump     *d;
151         int             i;
152         long                    junk;
153
154         fd = fd1;
155
156         for (d = Dump_template; d->area; d++)
157         {
158                 if (read(fd, &junk, sizeof junk) != (sizeof junk))
159                         return (1);
160                 if ((char *)junk != d->area)
161                         return (1);
162                 i = d->count;
163                 if (read(fd, d->area, i) != i)
164                         return (1);
165         }
166
167         /* make quite certain we are at EOF */
168         return (read(fd, &junk, 1));
169 }