comparison srogue/state.c @ 36:2128c7dc8a40

Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 25 Nov 2010 12:21:41 +0000
parents
children 3aa87373c908
comparison
equal deleted inserted replaced
35:05018c63a721 36:2128c7dc8a40
1 /*
2 state.c - Portable Rogue Save State Code
3
4 Copyright (C) 1999, 2000, 2005 Nicholas J. Kisseberth
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
8 are met:
9 1. Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 2. Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
14 3. Neither the name(s) of the author(s) nor the names of other contributors
15 may be used to endorse or promote products derived from this software
16 without specific prior written permission.
17
18 THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTORS ``AS IS'' AND
19 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTORS BE LIABLE
22 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 SUCH DAMAGE.
29 */
30
31 /************************************************************************/
32 /* Save State Code */
33 /************************************************************************/
34
35 #define RSID_STATS 0xABCD0001
36 #define RSID_THING 0xABCD0002
37 #define RSID_THING_NULL 0xDEAD0002
38 #define RSID_OBJECT 0xABCD0003
39 #define RSID_MAGICITEMS 0xABCD0004
40 #define RSID_KNOWS 0xABCD0005
41 #define RSID_GUESSES 0xABCD0006
42 #define RSID_OBJECTLIST 0xABCD0007
43 #define RSID_BAGOBJECT 0xABCD0008
44 #define RSID_MONSTERLIST 0xABCD0009
45 #define RSID_MONSTERSTATS 0xABCD000A
46 #define RSID_MONSTERS 0xABCD000B
47 #define RSID_TRAP 0xABCD000C
48 #define RSID_WINDOW 0xABCD000D
49 #define RSID_DAEMONS 0xABCD000E
50 #define RSID_IWEAPS 0xABCD000F
51 #define RSID_IARMOR 0xABCD0010
52 #define RSID_SPELLS 0xABCD0011
53 #define RSID_ILIST 0xABCD0012
54 #define RSID_HLIST 0xABCD0013
55 #define RSID_DEATHTYPE 0xABCD0014
56 #define RSID_CTYPES 0XABCD0015
57 #define RSID_COORDLIST 0XABCD0016
58 #define RSID_ROOMS 0XABCD0017
59
60
61 #include <curses.h>
62 #include <sys/stat.h>
63 #include <stdio.h>
64 #include <stdlib.h>
65 #include <assert.h>
66 #include "rogue.h"
67 #include "rogue.ext"
68
69 #define READSTAT ((format_error == 0) && (read_error == 0))
70 #define WRITESTAT (write_error == 0)
71
72 int read_error = FALSE;
73 int write_error = FALSE;
74 int format_error = FALSE;
75 int end_of_file = FALSE;
76 int big_endian = 0;
77 const char *fmterr = "";
78
79 char encstr[] = "\354\251\243\332A\201|\301\321p\210\251\327\"\257\365t\341%3\271^`~\203z{\341};\f\341\231\222e\234\351]\321";
80
81 /*
82 * perform an encrypted write
83 */
84 encwrite(starta, size, outf)
85 register void *starta;
86 unsigned int size;
87 register FILE *outf;
88 {
89 register char *ep;
90 register char *start = starta;
91
92 ep = encstr;
93
94 while (size--)
95 {
96 putc(*start++ ^ *ep++, outf);
97 if (*ep == '\0')
98 ep = encstr;
99 }
100 }
101
102 /*
103 * perform an encrypted read
104 */
105 encread(starta, size, inf)
106 register void *starta;
107 unsigned int size;
108 register int inf;
109 {
110 register char *ep;
111 register int read_size;
112 register char *start = starta;
113
114 if ((read_size = read(inf, start, size)) == -1 || read_size == 0)
115 return read_size;
116
117 ep = encstr;
118
119 while (size--)
120 {
121 *start++ ^= *ep++;
122 if (*ep == '\0')
123 ep = encstr;
124 }
125 return read_size;
126 }
127
128 void *
129 get_list_item(struct linked_list *l, int i)
130 {
131 int count = 0;
132
133 while(l != NULL)
134 {
135 if (count == i)
136 return(l->l_data);
137
138 l = l->l_next;
139
140 count++;
141 }
142
143 return(NULL);
144 }
145
146 int
147 find_list_ptr(struct linked_list *l, void *ptr)
148 {
149 int count = 0;
150
151 while(l != NULL)
152 {
153 if (l->l_data == ptr)
154 return(count);
155
156 l = l->l_next;
157 count++;
158 }
159
160 return(-1);
161 }
162
163 int
164 list_size(struct linked_list *l)
165 {
166 int count = 0;
167
168 while(l != NULL)
169 {
170 if (l->l_data == NULL)
171 return(count);
172
173 count++;
174
175 l = l->l_next;
176 }
177
178 return(count);
179 }
180
181 int
182 rs_write(FILE *savef, void *ptr, int size)
183 {
184 if (!write_error)
185 encwrite(ptr,size,savef);
186
187 if (0)
188 write_error = TRUE;
189
190 assert(write_error == 0);
191
192 return(WRITESTAT);
193 }
194
195 int
196 rs_write_char(FILE *savef, char c)
197 {
198 rs_write(savef, &c, 1);
199
200 return(WRITESTAT);
201 }
202
203 int
204 rs_write_boolean(FILE *savef, bool c)
205 {
206 unsigned char buf = (c == 0) ? 0 : 1;
207
208 rs_write(savef, &buf, 1);
209
210 return(WRITESTAT);
211 }
212
213 int
214 rs_write_booleans(FILE *savef, bool *c, int count)
215 {
216 int n = 0;
217
218 rs_write_int(savef,count);
219
220 for(n = 0; n < count; n++)
221 rs_write_boolean(savef,c[n]);
222
223 return(WRITESTAT);
224 }
225
226 int
227 rs_write_shint(FILE *savef, unsigned char c)
228 {
229 unsigned char buf = c;
230
231 rs_write(savef, &buf, 1);
232
233 return(WRITESTAT);
234 }
235
236 int
237 rs_write_short(FILE *savef, short c)
238 {
239 unsigned char bytes[2];
240 unsigned char *buf = (unsigned char *) &c;
241
242 if (big_endian)
243 {
244 bytes[1] = buf[0];
245 bytes[0] = buf[1];
246 buf = bytes;
247 }
248
249 rs_write(savef, buf, 2);
250
251 return(WRITESTAT);
252 }
253
254 int
255 rs_write_shorts(FILE *savef, short *c, int count)
256 {
257 int n = 0;
258
259 rs_write_int(savef,count);
260
261 for(n = 0; n < count; n++)
262 rs_write_short(savef,c[n]);
263
264 return(WRITESTAT);
265 }
266
267 int
268 rs_write_ushort(FILE *savef, unsigned short c)
269 {
270 unsigned char bytes[2];
271 unsigned char *buf = (unsigned char *) &c;
272
273 if (big_endian)
274 {
275 bytes[1] = buf[0];
276 bytes[0] = buf[1];
277 buf = bytes;
278 }
279
280 rs_write(savef, buf, 2);
281
282 return(WRITESTAT);
283 }
284
285 int
286 rs_write_int(FILE *savef, int c)
287 {
288 unsigned char bytes[4];
289 unsigned char *buf = (unsigned char *) &c;
290
291 if (big_endian)
292 {
293 bytes[3] = buf[0];
294 bytes[2] = buf[1];
295 bytes[1] = buf[2];
296 bytes[0] = buf[3];
297 buf = bytes;
298 }
299
300 rs_write(savef, buf, 4);
301
302 return(WRITESTAT);
303 }
304
305 int
306 rs_write_ints(FILE *savef, int *c, int count)
307 {
308 int n = 0;
309
310 rs_write_int(savef,count);
311
312 for(n = 0; n < count; n++)
313 rs_write_int(savef,c[n]);
314
315 return(WRITESTAT);
316 }
317
318 int
319 rs_write_uint(FILE *savef, unsigned int c)
320 {
321 unsigned char bytes[4];
322 unsigned char *buf = (unsigned char *) &c;
323
324 if (big_endian)
325 {
326 bytes[3] = buf[0];
327 bytes[2] = buf[1];
328 bytes[1] = buf[2];
329 bytes[0] = buf[3];
330 buf = bytes;
331 }
332
333 rs_write(savef, buf, 4);
334
335 return(WRITESTAT);
336 }
337
338 int
339 rs_write_long(FILE *savef, long c)
340 {
341 int c2;
342 unsigned char bytes[4];
343 unsigned char *buf = (unsigned char *)&c;
344
345 if (sizeof(long) == 8)
346 {
347 c2 = c;
348 buf = (unsigned char *) &c2;
349 }
350
351 if (big_endian)
352 {
353 bytes[3] = buf[0];
354 bytes[2] = buf[1];
355 bytes[1] = buf[2];
356 bytes[0] = buf[3];
357 buf = bytes;
358 }
359
360 rs_write(savef, buf, 4);
361
362 return(WRITESTAT);
363 }
364
365 int
366 rs_write_longs(FILE *savef, long *c, int count)
367 {
368 int n = 0;
369
370 rs_write_int(savef,count);
371
372 for(n = 0; n < count; n++)
373 rs_write_long(savef,c[n]);
374
375 return(WRITESTAT);
376 }
377
378 int
379 rs_write_ulong(FILE *savef, unsigned long c)
380 {
381 unsigned int c2;
382 unsigned char bytes[4];
383 unsigned char *buf = (unsigned char *)&c;
384
385 if ( (sizeof(long) == 8) && (sizeof(int) == 4) )
386 {
387 c2 = c;