Home | History | Annotate | Line # | Download | only in trek
dumpgame.c revision 1.4
      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 }
    168