Commit | Line | Data |
---|---|---|
1184f029 | 1 | #ifndef lint |
0f4556f1 | 2 | static char sccsid[] = "@(#)dumpgame.c 4.2 (Berkeley) 5/27/83"; |
1184f029 KM |
3 | #endif not lint |
4 | ||
5 | # include "trek.h" | |
6 | ||
7 | /*** THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/ | |
401a08c7 | 8 | # define VERSION 2 |
1184f029 KM |
9 | |
10 | struct dump | |
11 | { | |
12 | char *area; | |
13 | int count; | |
14 | }; | |
15 | ||
401a08c7 KL |
16 | |
17 | struct dump Dump_template[] = | |
1184f029 | 18 | { |
401a08c7 KL |
19 | (char *)&Ship, sizeof (Ship), |
20 | (char *)&Now, sizeof (Now), | |
21 | (char *)&Param, sizeof (Param), | |
22 | (char *)&Etc, sizeof (Etc), | |
23 | (char *)&Game, sizeof (Game), | |
24 | (char *)Sect, sizeof (Sect), | |
25 | (char *)Quad, sizeof (Quad), | |
26 | (char *)&Move, sizeof (Move), | |
27 | (char *)Event, sizeof (Event), | |
1184f029 KM |
28 | 0 |
29 | }; | |
30 | ||
31 | /* | |
32 | ** DUMP GAME | |
33 | ** | |
34 | ** This routine dumps the game onto the file "trek.dump". The | |
35 | ** first two bytes of the file are a version number, which | |
36 | ** reflects whether this image may be used. Obviously, it must | |
37 | ** change as the size, content, or order of the data structures | |
38 | ** output change. | |
39 | */ | |
40 | ||
41 | dumpgame() | |
42 | { | |
43 | int version; | |
44 | register int fd; | |
45 | register struct dump *d; | |
46 | register int i; | |
47 | ||
48 | if ((fd = creat("trek.dump", 0644)) < 0) | |
49 | return (printf("cannot dump\n")); | |
50 | version = VERSION; | |
51 | write(fd, &version, sizeof version); | |
52 | ||
53 | /* output the main data areas */ | |
54 | for (d = Dump_template; d->area; d++) | |
55 | { | |
56 | write(fd, &d->area, sizeof d->area); | |
57 | i = d->count; | |
58 | write(fd, d->area, i); | |
59 | } | |
60 | ||
61 | close(fd); | |
62 | } | |
63 | ||
64 | ||
65 | /* | |
66 | ** RESTORE GAME | |
67 | ** | |
68 | ** The game is restored from the file "trek.dump". In order for | |
69 | ** this to succeed, the file must exist and be readable, must | |
70 | ** have the correct version number, and must have all the appro- | |
71 | ** priate data areas. | |
72 | ** | |
73 | ** Return value is zero for success, one for failure. | |
74 | */ | |
75 | ||
76 | restartgame() | |
77 | { | |
78 | register int fd; | |
79 | int version; | |
80 | ||
81 | if ((fd = open("trek.dump", 0)) < 0 || | |
82 | read(fd, &version, sizeof version) != sizeof version || | |
83 | version != VERSION || | |
84 | readdump(fd)) | |
85 | { | |
86 | printf("cannot restart\n"); | |
87 | close(fd); | |
88 | return (1); | |
89 | } | |
90 | ||
91 | close(fd); | |
92 | return (0); | |
93 | } | |
94 | ||
95 | ||
96 | /* | |
97 | ** READ DUMP | |
98 | ** | |
99 | ** This is the business end of restartgame(). It reads in the | |
100 | ** areas. | |
101 | ** | |
102 | ** Returns zero for success, one for failure. | |
103 | */ | |
104 | ||
105 | readdump(fd1) | |
106 | int fd1; | |
107 | { | |
108 | register int fd; | |
109 | register struct dump *d; | |
110 | register int i; | |
111 | int junk; | |
112 | ||
113 | fd = fd1; | |
114 | ||
115 | for (d = Dump_template; d->area; d++) | |
116 | { | |
401a08c7 | 117 | if (read(fd, &junk, sizeof junk) != (sizeof junk)) |
1184f029 | 118 | return (1); |
401a08c7 | 119 | if ((char *)junk != d->area) |
1184f029 KM |
120 | return (1); |
121 | i = d->count; | |
122 | if (read(fd, d->area, i) != i) | |
123 | return (1); | |
124 | } | |
125 | ||
126 | /* make quite certain we are at EOF */ | |
127 | return (read(fd, &junk, 1)); | |
128 | } |