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