1 /*
2  * savedate.c  �����֥ǡ����δ���
3  *
4  * Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
5  *               1998-                           <masaki-c@is.aist-nara.ac.jp>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21 */
22 /* $Id: savedata.c,v 1.36 2003/07/21 23:06:47 chikama Exp $ */
23 
24 #include "config.h"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
30 
31 #include "portab.h"
32 #include "savedata.h"
33 #include "scenario.h"
34 #include "xsystem35.h"
35 #include "LittleEndian.h"
36 #include "eucsjis.h"
37 #include "filecheck.h"
38 #include "windowframe.h"
39 #include "selection.h"
40 #include "message.h"
41 
42 /* �����֥ǡ��� */
43 static char *saveDataFile[SAVE_MAXNUMBER];
44 static char *saveDataPath;
45 static int savefile_sysvar_cnt = SYSVAR_MAX;
46 
47 static void* saveStackInfo(Ald_stackHdr *head);
48 static void  loadStackInfo(char *buf);
49 static void* saveStrVar(Ald_strVarHdr *head);
50 static void  loadStrVar(char *buf);
51 static void* saveSysVar(Ald_sysVarHdr *head, int page);
52 static int   loadSysVar(char *buf);
53 static void* loadGameData(int no, int *status, int *size);
54 static int   saveGameData(int no, char *buf, int size);
55 
56 
57 
58 /* savefile ������ directory ����Ͽ */
save_set_path(char * path)59 void save_set_path(char *path) {
60 	nact->files.savedir = strdup(path);
61 	saveDataPath = strdup(path);
62 	fc_init(path);
63 }
64 
65 /* savefile ����Ͽ */
save_register_file(char * name,int index)66 void save_register_file(char *name, int index) {
67 	saveDataFile[index] = strdup(name);
68 }
69 
70 /* savefile ���� */
save_get_file(int index)71 char *save_get_file(int index) {
72 	return saveDataFile[index];
73 }
74 
75 /* savefile ���� */
save_delete_file(int index)76 int save_delete_file(int index) {
77 	int ret = unlink(saveDataFile[index]);
78 
79 	if (ret == 0) {
80 		return 1;
81 	}
82 	return 1; /* �Ȥꤢ���� */
83 }
84 
get_fullpath(char * filename)85 static char *get_fullpath(char *filename) {
86 	char *fn = malloc(strlen(filename) + strlen(saveDataPath) + 3);
87 	if (fn == NULL) {
88 		return NULL;
89 	}
90 	strcpy(fn, saveDataPath);
91 	strcat(fn, "/");
92 	strcat(fn, filename);
93 	return fn;
94 }
95 
backup_oldfile(char * filename)96 static void backup_oldfile(char *filename) {
97 	char *newname;
98 
99 	if (!filename) return;
100 	newname = malloc(strlen(filename) + 3);
101 
102 	strcpy(newname, filename);
103 	strcat(newname, ".");
104 	rename(filename, newname);
105 
106 	free(newname);
107 }
108 
fileopen(char * filename,char type)109 static FILE *fileopen(char *filename, char type) {
110 	char *fc = fc_search(filename);
111 	char *fullpath;
112 	FILE *fp;
113 
114 	if (fc == NULL) { /* if file does not exist */
115 		if (type == 'r') return NULL;
116 		fc = fc_add(filename);
117 	}
118 	fullpath = get_fullpath(fc);
119 
120 	if (type == 'w') {
121 		backup_oldfile(fullpath);
122 		fp = fopen(fullpath, "w");
123 	} else {
124 		fp = fopen(fullpath, "r");
125 	}
126 	free(fullpath);
127 	return fp;
128 }
129 
130 /* ����ե�����ؤ��ѿ��ν����� */
save_save_var_with_file(char * filename,int * start,int cnt)131 int save_save_var_with_file(char *filename, int *start, int cnt) {
132 	int status = 0, size, i;
133 	FILE *fp;
134 	WORD *tmp, *_tmp;
135 
136 	tmp = _tmp = (WORD *)malloc(cnt * sizeof(WORD));
137 
138 	if (tmp == NULL) {
139 		WARNING("Out of memory\n");
140 		return SAVE_SAVEERR;
141 	}
142 
143 	for (i = 0; i < cnt; i++) {
144 #ifdef WORDS_BIGENDIAN
145 		*tmp = swap16((WORD)*start); start++; tmp++;
146 #else
147 		*tmp = (WORD)*start; start++; tmp++;
148 #endif
149 	}
150 
151 	if (NULL == (fp = fileopen(filename, 'w'))) {
152 		status = SAVE_SAVEERR; goto errexit;
153 	}
154 
155 	size = fwrite(_tmp, sizeof(WORD), cnt, fp);
156 
157 	if (size != cnt) {
158 		status = SAVE_OTHERERR;
159 	} else {
160 		status = SAVE_SAVEOK0;
161 	}
162 
163 	fclose(fp);
164  errexit:
165 	free(_tmp);
166 
167 	return status;
168 }
169 
170 /* ����ե����뤫����ѿ����ɤ߹��� */
save_load_var_with_file(char * filename,int * start,int cnt)171 int save_load_var_with_file(char *filename, int *start, int cnt) {
172 	int status = 0, size, i;
173 	FILE *fp;
174 	WORD *tmp, *_tmp;
175 
176 	tmp = _tmp = (WORD *)malloc(cnt * sizeof(WORD));
177 
178 	if (tmp == NULL) {
179 		WARNING("Out of memory\n");
180 		return SAVE_LOADERR;
181 	}
182 
183 	if (NULL == (fp = fileopen(filename, 'r'))) {
184 		status = SAVE_LOADERR; goto errexit;
185 	}
186 
187 	size = fread(tmp, sizeof(WORD), cnt, fp);
188 
189 	if (size != cnt) {
190 		status = SAVE_LOADSHORTAGE;
191 	} else {
192 		status = SAVE_LOADOK;
193 	}
194 
195 	for (i = 0; i < cnt; i++) {
196 #ifdef WORDS_BIGENDIAN
197 		*start = swap16(*tmp); start++; tmp++;
198 #else
199 		*start = *tmp; start++; tmp++;
200 #endif
201 	}
202 
203 	fclose(fp);
204  errexit:
205 	free(_tmp);
206 	return status;
207 }
208 
209 
210 /* ����ե�����ؤ�ʸ����ν�����, start = 1~ */
save_save_str_with_file(char * filename,int start,int cnt)211 int save_save_str_with_file(char *filename, int start, int cnt) {
212 	int status = 0, size, _size,i;
213 	FILE *fp;
214 	char *tmp, *_tmp;
215 
216 	_tmp = tmp = malloc(strvar_cnt * strvar_len);
217 	if (tmp == NULL) {
218 		WARNING("Out of memory\n");
219 		return SAVE_LOADSHORTAGE;
220 	}
221 
222 	*tmp = 0;
223 	for (i = 0; i < cnt; i++) {
224 		strncpy(tmp, v_str(start + i - 1), strvar_len - 1);
225 		tmp += v_strlen(start + i - 1) + 1;
226 	}
227 
228 
229 	if (NULL == (fp = fileopen(filename, 'w'))) {
230 		status = SAVE_SAVEERR; goto errexit;
231 	}
232 	size = tmp - _tmp;
233 	_size = fwrite(_tmp, sizeof(char), size , fp);
234 
235 	if (size != _size) {
236 		status = SAVE_OTHERERR;
237 	} else {
238 		status = SAVE_SAVEOK0;
239 	}
240 
241 	fclose(fp);
242  errexit:
243 	free(_tmp);
244 
245 	return status;
246 }
247 
248 /* ����ե����뤫���ʸ������ɤ߹��� */
save_load_str_with_file(char * filename,int start,int cnt)249 int save_load_str_with_file(char *filename, int start, int cnt) {
250 	int status = 0, size, i;
251 	FILE *fp;
252 	char *tmp, *_tmp=NULL;
253 	long filesize;
254 
255 	if (NULL == (fp = fileopen(filename, 'r'))) {
256 		return SAVE_LOADERR;
257 	}
258 
259 	fseek(fp, 0L, SEEK_END);
260 	filesize = ftell(fp);
261 	if (filesize == 0) {
262 		return SAVE_LOADERR;
263 	}
264 
265 	tmp = _tmp = (char *)malloc(filesize);
266 	if (tmp == NULL) {
267 		WARNING("Out of memory\n");
268 		return SAVE_LOADERR;
269 	}
270 
271 	fseek(fp, 0L, SEEK_SET);
272 	size = fread(tmp, 1, filesize,fp);
273 
274 	if (size != filesize) {
275 		status = SAVE_LOADSHORTAGE;
276 	} else {
277 		status = SAVE_LOADOK;
278 	}
279 	for (i = 0; i < cnt; i++) {
280 		strncpy(v_str(start + i - 1), tmp, strvar_len);
281 		tmp += v_strlen(start + i - 1) + 1;
282 	}
283 	fclose(fp);
284 	free(_tmp);
285 
286 	return status;
287 }
288 
289 /* �����֥ե�����Υ��ԡ� */
save_copyAll(int dstno,int srcno)290 int save_copyAll(int dstno, int srcno) {
291 	char *saveTop;
292 	int status, filesize;
293 
294 	if (dstno >= SAVE_MAXNUMBER || srcno >= SAVE_MAXNUMBER) {
295 		// fprintf(stderr, "dstno or srcno is outof range\n");
296 		return SAVE_SAVEERR;
297 	}
298 	saveTop = loadGameData(srcno, &status, &filesize);
299 	if (saveTop == NULL)
300 		return SAVE_SAVEERR;
301 	if (((Ald_baseHdr *)saveTop)->version != SAVE_DATAVERSION) {
302 		fprintf(stderr, "save_copyAll(): endian mismatch\n");
303 		free(saveTop);
304 		return SAVE_SAVEERR;
305         }
306 	status = saveGameData(dstno, saveTop, filesize);
307 
308 	free(saveTop);
309 
310 	return status;
311 }
312 
313 /* �ǡ����ΰ������� */
save_loadPartial(int no,int page,int offset,int cnt)314 int save_loadPartial(int no, int page, int offset, int cnt) {
315 	Ald_baseHdr *save_base;
316 	char *vtop;
317 	WORD *tmp;
318 	int *var;
319 	char *saveTop = NULL;
320 	int i, status, filesize;
321 
322 	if (no >= SAVE_MAXNUMBER) {
323 		return SAVE_SAVEERR;
324 	}
325 	if (page == 0) {
326 		cnt = min(cnt, SYSVAR_MAX - offset);
327 		var = sysVar + offset;
328 	} else {
329 		cnt = min(cnt, arrayVarBuffer[page - 1].max - offset);
330 		var = arrayVarBuffer[page - 1].value + offset;
331 	}
332 
333 	saveTop = loadGameData(no, &status, &filesize);
334 	if (saveTop == NULL) {
335 		// fprintf(stderr, "loadGameData() faild\n");
336 		return status;
337 	}
338 
339 	if (filesize <= sizeof(Ald_baseHdr)) {
340 		// fprintf(stderr, "filesize too short\n");
341 		goto errexit;
342 	}
343 
344 	save_base = (Ald_baseHdr *)saveTop;
345 	if (save_base->version != SAVE_DATAVERSION) {
346 		fprintf(stderr, "save_loadPartial(): endian mismatch\n");
347 		goto errexit;
348         }
349 
350 	if (save_base->varSys[page] == 0) {
351 		// fprintf(stderr, "No available Variable\n");
352 		goto errexit;
353 	}
354 	vtop = saveTop + save_base->varSys[page] + sizeof(Ald_sysVarHdr);
355 	tmp = (WORD *)vtop + offset;
356 	for (i = 0; i < cnt; i++) {
357 		*var = *tmp; tmp++; var++;
358 	}
359 	free(saveTop);
360 	return SAVE_LOADOK;
361 
362  errexit:
363 	if (saveTop != NULL)
364 		free(saveTop);
365 
366 	return SAVE_LOADERR;
367 }
368 
369 /* �ǡ����ΰ��������� */
save_savePartial(int no,int page,int offset,int cnt)370 int save_savePartial(int no, int page, int offset, int cnt) {
371 	Ald_baseHdr *save_base;
372 	WORD *tmp;
373 	char *vtop;
374 	int *var;
375 	char *saveTop = NULL;
376 	int i, status, filesize;
377 
378 	if (no >= SAVE_MAXNUMBER) {
379 		return SAVE_SAVEERR;
380 	}
381 	if (page == 0) {
382 		cnt = min(cnt, SYSVAR_MAX - offset);
383 		var = sysVar + offset;
384 	} else {
385 		if (arrayVarBuffer[page - 1].saveflag == FALSE)
386 			goto errexit;
387 		cnt = min(cnt, arrayVarBuffer[page - 1].max - offset);
388 		var = arrayVarBuffer[page - 1].value + offset;
389 	}
390 
391 	saveTop = loadGameData(no, &status, &filesize);
392 	if (saveTop == NULL)
393 		return status;
394 	if (filesize <= sizeof(Ald_baseHdr))
395 		goto errexit;
396 	save_base = (Ald_baseHdr *)saveTop;
397 	if (save_base->version != SAVE_DATAVERSION) {
398 		fprintf(stderr, "save_savePartial(): endian mismatch\n");
399 		goto errexit;
400         }
401 	vtop = saveTop + save_base->varSys[page] + sizeof(Ald_sysVarHdr);
402 	tmp = (WORD *)vtop + offset;
403 	for (i = 0; i < cnt; i++) {
404 		*tmp = (WORD)*var; tmp++; var++;
405 	}
406 	status = saveGameData(no, saveTop, filesize);
407 	free(saveTop);
408 
409 	return status;
410 
411  errexit:
412 	if (saveTop != NULL)
413 		free(saveTop);
414 
415 	return SAVE_SAVEERR;
416 }
417 
418 
419 /* �ǡ����Υ��� */
save_loadAll(int no)420 int save_loadAll(int no) {
421 	Ald_baseHdr *save_base;
422 	char *saveTop = NULL;
423 	int i, status, filesize;
424 
425 	if (no >= SAVE_MAXNUMBER) {
426 		return SAVE_SAVEERR;
427 	}
428 	saveTop = loadGameData(no, &status, &filesize);
429 	if (saveTop == NULL)
430 		return status;
431 	if (filesize <= sizeof(Ald_baseHdr))
432 		goto errexit;
433 	/* �Ƽ�ǡ�����ȿ�� */
434 	save_base = (Ald_baseHdr *)saveTop;
435 	if (save_base->version != SAVE_DATAVERSION) {
436 		fprintf(stderr, "save_loadAll(): endian mismatch\n");
437 		goto errexit;
438 	}
439 	if (strcmp(SAVE_DATAID, save_base->ID) != 0)
440 		goto errexit;
441 	nact->sel.MsgFontSize        = save_base->selMsgSize;
442 	nact->sel.MsgFontColor       = save_base->selMsgColor;
443 	nact->sel.WinBackgroundColor = save_base->selBackColor;
444 	nact->sel.WinFrameColor      = save_base->selFrameColor;
445 	nact->msg.MsgFontSize        = save_base->msgMsgSize;
446 	nact->msg.MsgFontColor       = save_base->msgMsgColor;
447 	nact->msg.WinBackgroundColor = save_base->msgBackColor;
448 	nact->msg.WinFrameColor      = save_base->msgFrameColor;
449 	sl_jmpFar2(save_base->scoPage, save_base->scoIndex);
450 
451 	for (i = 0; i < SELWINMAX; i++) {
452 		selWinInfo[i].x      = save_base->selWinInfo[i].x;
453 		selWinInfo[i].y      = save_base->selWinInfo[i].y;
454 		selWinInfo[i].width  = save_base->selWinInfo[i].width;
455 		selWinInfo[i].height = save_base->selWinInfo[i].height;
456 		// selWinInfo[i].save   = TRUE;
457 	}
458 	for (i = 0; i < MSGWINMAX; i++) {
459 		msgWinInfo[i].x      = save_base->msgWinInfo[i].x;
460 		msgWinInfo[i].y      = save_base->msgWinInfo[i].y;
461 		msgWinInfo[i].width  = save_base->msgWinInfo[i].width;
462 		msgWinInfo[i].height = save_base->msgWinInfo[i].height;
463 		// msgWinInfo[i].savedImage = NULL;
464 		// msgWinInfo[i].save   = FALSE;
465 	}
466 	/* �����å��Υ��� */
467 	loadStackInfo(saveTop + save_base->stackinfo);
468 	/* ʸ�����ѿ��Υ��� */
469 	loadStrVar(saveTop + save_base->varStr);
470 	/* ���͡������ѿ��Υ��� */
471 	for (i = 0; i < 256; i++) {
472 		if (save_base->varSys[i] != 0) {
473 			if (SAVE_LOADOK != loadSysVar(saveTop + save_base->varSys[i]))
474 				goto errexit;
475 
476 		}
477 	}
478 	free(saveTop);
479 	return SAVE_LOADOK;
480  errexit:
481 	free(saveTop);
482 	return SAVE_LOADERR;
483 }
484 
485 /* �ǡ����Υ����� */
save_saveAll(int no)486 int save_saveAll(int no) {
487 	Ald_baseHdr   *save_base = calloc(1, sizeof(Ald_baseHdr));
488 	Ald_strVarHdr save_strHdr;
489 	Ald_stackHdr  save_stackHdr;
490 	Ald_sysVarHdr save_sysHdr;
491 	char *sd_varStr = NULL;
492 	char *sd_stack  = NULL;
493 	char *sd_varSys = NULL;
494 	int i, totalsize = sizeof(Ald_baseHdr);
495 	FILE *fp;
496 
497 	if (no >= SAVE_MAXNUMBER)
498 		return SAVE_SAVEERR;
499 
500 	if (save_base == NULL)
501 		return SAVE_SAVEERR;
502 
503 	backup_oldfile(saveDataFile[no]);
504 	fp = fopen(saveDataFile[no],"wb");
505 
506 	if (fp == NULL)
507 		return SAVE_SAVEERR;
508 
509 	memset(&save_stackHdr, 0, sizeof(Ald_stackHdr));
510 	memset(&save_strHdr, 0, sizeof(Ald_strVarHdr));
511 	memset(&save_sysHdr, 0, sizeof(Ald_sysVarHdr));
512 
513 	/* �Ƽ�ǡ����Υ����� */
514 	strncpy(save_base->ID, SAVE_DATAID, 32);
515 	save_base->version       = SAVE_DATAVERSION;
516 	save_base->selMsgSize    = (BYTE)nact->sel.MsgFontSize;
517 	save_base->selMsgColor   = (BYTE)nact->sel.MsgFontColor;
518 	save_base->selBackColor  = (BYTE)nact->sel.WinBackgroundColor;
519 	save_base->selFrameColor = (BYTE)nact->sel.WinFrameColor;
520 	save_base->msgMsgSize    = (BYTE)nact->msg.MsgFontSize;
521 	save_base->msgMsgColor   = (BYTE)nact->msg.MsgFontColor;
522 	save_base->msgBackColor  = (BYTE)nact->msg.WinBackgroundColor;
523 	save_base->msgFrameColor = (BYTE)nact->msg.WinFrameColor;
524 	save_base->scoPage       = sl_getPage();
525 	save_base->scoIndex      = sl_getIndex();
526 
527 	for (i = 0; i < SELWINMAX; i++) {
528 		save_base->selWinInfo[i].x      = (WORD)selWinInfo[i].x;
529 		save_base->selWinInfo[i].y      = (WORD)selWinInfo[i].y;
530 		save_base->selWinInfo[i].width  = (WORD)selWinInfo[i].width;
531 		save_base->selWinInfo[i].height = (WORD)selWinInfo[i].height;
532 	}
533 
534 	for (i = 0; i < MSGWINMAX; i++) {
535 		save_base->msgWinInfo[i].x      = (WORD)msgWinInfo[i].x;
536 		save_base->msgWinInfo[i].y      = (WORD)msgWinInfo[i].y;
537 		save_base->msgWinInfo[i].width  = (WORD)msgWinInfo[i].width;
538 		save_base->msgWinInfo[i].height = (WORD)msgWinInfo[i].height;
539 	}
540 
541 	fseek(fp, sizeof(Ald_baseHdr), SEEK_SET);
542 
543 	/* �����å����� */
544 	if (NULL == (sd_stack = saveStackInfo(&save_stackHdr)))
545 		goto errexit;
546 
547 	if (1 != fwrite(&save_stackHdr, sizeof(save_stackHdr), 1, fp))
548 		goto errexit;
549 
550 	if (save_stackHdr.size != 0 && 1 != fwrite(sd_stack, save_stackHdr.size, 1, fp))
551 		goto errexit;
552 
553 	save_base->stackinfo  = totalsize;
554 	totalsize            += save_stackHdr.size + sizeof(Ald_stackHdr);
555 
556 	/* ʸ�����ѿ� */
557 	if (NULL == (sd_varStr = saveStrVar(&save_strHdr)))
558 		goto errexit;
559 
560 	if (1 != fwrite(&save_strHdr, sizeof(Ald_strVarHdr), 1, fp))
561 		goto errexit;
562 
563 	if (save_strHdr.size != 0 && 1 != fwrite(sd_varStr, save_strHdr.size, 1, fp))
564 		goto errexit;
565 
566 	save_base->varStr  = totalsize;
567 	totalsize         += save_strHdr.size + sizeof(Ald_strVarHdr);
568 	free(sd_varStr);
569 
570 	/* �����ѿ��������ѿ� */
571 	for (i = 0; i < 256; i++) {
572 		sd_varSys = saveSysVar(&save_sysHdr, i);
573 		if (sd_varSys == NULL) {
574 			save_base->varSys[i] = 0;
575 		} else {
576 			if (1 != fwrite(&save_sysHdr, sizeof(Ald_sysVarHdr), 1, fp))
577 				goto errexit;
578 			if (1 != fwrite(sd_varSys, save_sysHdr.size, 1, fp))
579 				goto errexit;
580 			save_base->varSys[i] = totalsize;
581 			totalsize           += save_sysHdr.size + sizeof(Ald_sysVarHdr);
582 			free(sd_varSys);
583 		}
584 	}
585 
586 	fseek(fp, 0, SEEK_SET);
587 
588 	if (1 != fwrite(save_base, sizeof(Ald_baseHdr), 1, fp))
589 		goto errexit;
590 
591 	fclose(fp);
592 	free(save_base);
593 
594 	return SAVE_SAVEOK1;
595 
596  errexit:
597 	if (fp != NULL)
598 		fclose(fp);
599 	if (save_base != NULL)
600 		free(save_base);
601 	if (sd_varStr != NULL)
602 		free(sd_varStr);
603 	if (sd_varSys != NULL)
604 		free(sd_varSys);
605 
606 	return SAVE_SAVEERR;
607 }
608 
609 /* �����å�����Υ����� */
saveStackInfo(Ald_stackHdr * head)610 static void *saveStackInfo(Ald_stackHdr *head) {
611 	int count;
612 	int *info = sl_getStackInfo(&count);
613 
614 	head->size = count * sizeof(int);
615 	return (void *)info;
616 }
617 
618 /* �����å�����Υ��� */
loadStackInfo(char * buf)619 static void loadStackInfo(char *buf) {
620 	Ald_stackHdr *head = (Ald_stackHdr *)buf;
621 	char         *data = buf + sizeof(Ald_stackHdr);
622 	sl_putStackInfo((int *)data, head->size / sizeof(int));
623 }
624 
625 /* ʸ�����ѿ��Υ����� */
saveStrVar(Ald_strVarHdr * head)626 static void *saveStrVar(Ald_strVarHdr *head) {
627 	int i;
628 	char *tmp, *_tmp;
629 	_tmp = tmp = malloc(strvar_cnt * strvar_len);
630 	if (tmp == NULL) {
631 		WARNING("Out of memory\n");
632 		return NULL;
633 	}
634 	*tmp = 0;
635 	for (i = 0; i < strvar_cnt; i++) {
636 		strncpy(tmp, v_str(i), strvar_len - 1);
637 		tmp += v_strlen(i) + 1;
638 	}
639 	head->size   = tmp - _tmp;
640 	head->count  = strvar_cnt;
641 	head->maxlen = strvar_len;
642 	return _tmp;
643 }
644 
645 /* ʸ�����ѿ��Υ��� */
loadStrVar(char * buf)646 static void loadStrVar(char *buf) {
647 	Ald_strVarHdr *head = (Ald_strVarHdr *)buf;
648 	int cnt, max, i;
649 
650 	cnt = head->count;
651 	max = head->maxlen;
652 	if (strvar_cnt != cnt || strvar_len != max)
653 		v_initStringVars(cnt, max);
654 	buf += sizeof(Ald_strVarHdr);
655 	for (i = 0; i < cnt; i++) {
656 		strncpy(v_str(i), buf, max - 1);
657 		buf += v_strlen(i) + 1;
658 	}
659 }
660 
661 /* ���͡������ѿ��Υ����� */
saveSysVar(Ald_sysVarHdr * head,int page)662 static void *saveSysVar(Ald_sysVarHdr *head, int page) {
663 	int *var;
664 	int cnt, i;
665 	WORD *tmp, *_tmp;
666 	if (page == 0) { /* sysVar */
667 		cnt = min(savefile_sysvar_cnt, SYSVAR_MAX);
668 		var = sysVar;
669 	} else if (!arrayVarBuffer[page - 1].saveflag) {
670 		return NULL;
671 	} else {
672 		cnt = arrayVarBuffer[page - 1].max;
673 		var = arrayVarBuffer[page - 1].value;
674 		if (var == NULL)
675 			return NULL;
676 	}
677 	head->size   = cnt * sizeof(WORD);
678 	head->pageNo = page;
679 	tmp = _tmp = (WORD *)malloc(cnt * sizeof(WORD));
680 	if (tmp == NULL) {
681 		WARNING("Out of memory\n");
682 		return NULL;
683 	}
684 	for (i = 0; i < cnt; i++) {
685 		*tmp = (WORD)*var; var++; tmp++;
686 	}
687 	return _tmp;
688 }
689 
690 /* ���͡������ѿ��Υ��� */
loadSysVar(char * buf)691 static int loadSysVar(char *buf) {
692 	int i, cnt;
693 	int  *var;
694 	int bool;
695 	WORD *data;
696 	Ald_sysVarHdr *head = (Ald_sysVarHdr *)buf;
697 	int page = head->pageNo;
698 
699 	if (page == 0) {
700 #if 0
701 		if (head->size != SYSVAR_MAX * sizeof(WORD))
702 			return SAVE_LOADERR;
703 		var = sysVar;
704 		cnt = SYSVAR_MAX;
705 #endif
706 		var = sysVar;
707 		cnt = savefile_sysvar_cnt = head->size / sizeof(WORD);
708 	} else {
709 		cnt = head->size / sizeof(WORD);
710 		if (arrayVarBuffer[page - 1].max != cnt ||
711 		    arrayVarBuffer[page - 1].value == NULL) {
712 			/*
713 			fprintf(stderr, "loadSysVar(): undef array\n");
714 			return SAVE_LOADERR;
715 			*/
716 
717 			bool = v_allocateArrayBuffer(page, cnt, TRUE);
718 			if (!bool) {
719 				fprintf(stderr, "v_allocateArrayBuffer fail\n");
720 				return SAVE_LOADERR;
721 			}
722 
723 		}
724 		var = arrayVarBuffer[page - 1].value;
725 	}
726 	buf += sizeof(Ald_sysVarHdr);
727 	data = (WORD *)buf;
728 	for (i = 0; i < cnt; i++) {
729 		*var++ = *data++;
730 	}
731 	return SAVE_LOADOK;
732 }
733 
734 
735 /* ������ǡ����Υ���
736 
737  no:    �����֥ե������ֹ� 0~
738  *status:  ���ơ�����
739  *size: �ǡ������礭�����֤��ݥ���
740 
741 ���Ȥ� free(*buf)����Τ�˺��ʤ��褦��
742 */
loadGameData(int no,int * status,int * size)743 static void* loadGameData(int no, int *status, int *size) {
744 	FILE *fp;
745 	long filesize;
746 	char *buf;
747 
748 	fp = fopen(saveDataFile[no], "rb");
749 	if (fp == NULL)
750 		goto errexit;
751 	fseek(fp, 0L, SEEK_END);
752 	filesize = ftell(fp);
753 	if (filesize == 0)
754 		goto errexit;
755 
756 	buf = (char *)malloc(filesize);
757 	if (buf == NULL)
758 		goto errexit;
759 
760 	fseek(fp, 0L, SEEK_SET);
761 	fread(buf, filesize, 1, fp);
762 	fclose(fp);
763 
764 	*size = (int)filesize;
765 	*status = SAVE_LOADOK;
766 	return buf;
767 
768  errexit:
769 	if (fp != NULL)
770 		fclose(fp);
771 	*status = SAVE_LOADERR;
772 	return NULL;
773 }
774 
saveGameData(int no,char * buf,int size)775 static int saveGameData(int no, char *buf, int size) {
776         FILE *fp;
777         int status = SAVE_SAVEOK1;
778 
779 	backup_oldfile(saveDataFile[no]);
780         fp = fopen(saveDataFile[no],"wb");
781         if (fp == NULL) {
782                 return SAVE_SAVEERR;
783         }
784         if (size != fwrite(buf, size, 1, fp)) {
785                 status = SAVE_SAVEERR;
786         }
787         fclose(fp);
788         return status;
789 }
790 
791 /* ����ե����뤫��β������ɤ߹��� thanx tajiru@wizard */
load_cg_with_file(char * filename,int * status)792 BYTE* load_cg_with_file(char *filename, int *status){
793 	int size;
794 	FILE *fp;
795 	static BYTE *tmp;
796 	long filesize;
797 
798 	*status = 0;
799 
800 	if (NULL == (fp = fileopen(filename, 'r'))) {
801 		*status = SAVE_LOADERR; return NULL;
802 	}
803 
804 	fseek(fp, 0L, SEEK_END);
805 	filesize = ftell(fp);
806 	if (filesize == 0) {
807 		*status = SAVE_LOADERR; return NULL;
808 	}
809 
810 	tmp = (char *)malloc(filesize);
811 	if (tmp == NULL) {
812 		WARNING("Out of memory\n");
813 		*status = SAVE_LOADERR; return NULL;
814 	}
815 	fseek(fp, 0L, SEEK_SET);
816 	size = fread(tmp, 1, filesize,fp);
817 
818 	if (size != filesize) {
819 		*status = SAVE_LOADSHORTAGE;
820 	} else {
821 		*status = SAVE_LOADOK;
822 	}
823 
824 	fclose(fp);
825 	return tmp;
826 }
827