home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / trek / dumpgame.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-08  |  4.1 KB  |  162 lines

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