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 are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)dumpgame.c 4.5 (Berkeley) 06/18/88"; 20 #endif /* not lint */ 21 22 # include "trek.h" 23 24 /*** THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/ 25 # define VERSION 2 26 27 struct dump 28 { 29 char *area; 30 int count; 31 }; 32 33 34 struct dump Dump_template[] = 35 { 36 (char *)&Ship, sizeof (Ship), 37 (char *)&Now, sizeof (Now), 38 (char *)&Param, sizeof (Param), 39 (char *)&Etc, sizeof (Etc), 40 (char *)&Game, sizeof (Game), 41 (char *)Sect, sizeof (Sect), 42 (char *)Quad, sizeof (Quad), 43 (char *)&Move, sizeof (Move), 44 (char *)Event, sizeof (Event), 45 0 46 }; 47 48 /* 49 ** DUMP GAME 50 ** 51 ** This routine dumps the game onto the file "trek.dump". The 52 ** first two bytes of the file are a version number, which 53 ** reflects whether this image may be used. Obviously, it must 54 ** change as the size, content, or order of the data structures 55 ** output change. 56 */ 57 58 dumpgame() 59 { 60 int version; 61 register int fd; 62 register struct dump *d; 63 register int i; 64 65 if ((fd = creat("trek.dump", 0644)) < 0) 66 return (printf("cannot dump\n")); 67 version = VERSION; 68 write(fd, &version, sizeof version); 69 70 /* output the main data areas */ 71 for (d = Dump_template; d->area; d++) 72 { 73 write(fd, &d->area, sizeof d->area); 74 i = d->count; 75 write(fd, d->area, i); 76 } 77 78 close(fd); 79 } 80 81 82 /* 83 ** RESTORE GAME 84 ** 85 ** The game is restored from the file "trek.dump". In order for 86 ** this to succeed, the file must exist and be readable, must 87 ** have the correct version number, and must have all the appro- 88 ** priate data areas. 89 ** 90 ** Return value is zero for success, one for failure. 91 */ 92 93 restartgame() 94 { 95 register int fd; 96 int version; 97 98 if ((fd = open("trek.dump", 0)) < 0 || 99 read(fd, &version, sizeof version) != sizeof version || 100 version != VERSION || 101 readdump(fd)) 102 { 103 printf("cannot restart\n"); 104 close(fd); 105 return (1); 106 } 107 108 close(fd); 109 return (0); 110 } 111 112 113 /* 114 ** READ DUMP 115 ** 116 ** This is the business end of restartgame(). It reads in the 117 ** areas. 118 ** 119 ** Returns zero for success, one for failure. 120 */ 121 122 readdump(fd1) 123 int fd1; 124 { 125 register int fd; 126 register struct dump *d; 127 register int i; 128 int junk; 129 130 fd = fd1; 131 132 for (d = Dump_template; d->area; d++) 133 { 134 if (read(fd, &junk, sizeof junk) != (sizeof junk)) 135 return (1); 136 if ((char *)junk != d->area) 137 return (1); 138 i = d->count; 139 if (read(fd, d->area, i) != i) 140 return (1); 141 } 142 143 /* make quite certain we are at EOF */ 144 return (read(fd, &junk, 1)); 145 } 146