xref: /original-bsd/games/trek/dumpgame.c (revision e8c4bdd9)
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