extern FILE *os_path_open (const char *, const char *);
extern FILE *os_load_story (void);
+extern int os_storyfile_seek (FILE * fp, long offset, int whence);
+extern int os_storyfile_tell (FILE * fp);
extern zword save_quetzal (FILE *, FILE *);
extern zword restore_quetzal (FILE *, FILE *);
} else { /* some old games lack the file size entry */
- fseek (story_fp, 0, SEEK_END);
- story_size = ftell (story_fp);
- fseek (story_fp, 64, SEEK_SET);
+ os_storyfile_seek (story_fp, 0, SEEK_END);
+ story_size = os_storyfile_tell (story_fp);
+ os_storyfile_seek (story_fp, 64, SEEK_SET);
}
if (!first_restart) {
- fseek (story_fp, 0, SEEK_SET);
+ os_storyfile_seek (story_fp, 0, SEEK_SET);
if (fread (zmp, 1, h_dynamic_size, story_fp) != h_dynamic_size)
os_fatal ("Story file read error");
stack[i] |= fgetc (gfp);
}
- fseek (story_fp, 0, SEEK_SET);
+ os_storyfile_seek (story_fp, 0, SEEK_SET);
for (addr = 0; addr < h_dynamic_size; addr++) {
int skip = fgetc (gfp);
fputc ((int) lo (stack[i]), gfp);
}
- fseek (story_fp, 0, SEEK_SET);
+ os_storyfile_seek (story_fp, 0, SEEK_SET);
for (addr = 0, skip = 0; addr < h_dynamic_size; addr++)
if (zmp[addr] != fgetc (story_fp) || skip == 255 || addr + 1 == h_dynamic_size) {
/* Sum all bytes in story file except header bytes */
- fseek (story_fp, 64, SEEK_SET);
+ os_storyfile_seek (story_fp, 64, SEEK_SET);
+
for (i = 64; i < story_size; i++)
checksum += fgetc (story_fp);
#define get_c fgetc
#define put_c fputc
+/*
+ * externs
+ */
+
+extern int os_storyfile_seek(FILE * fp, long offset, int whence);
+
typedef unsigned long zlong;
/*
case ID_CMem:
if (!(progress & GOT_MEMORY)) /* Don't complain if two. */
{
- (void) fseek (stf, 0, SEEK_SET);
+ (void) os_storyfile_seek (stf, 0, SEEK_SET);
i=0; /* Bytes written to data area. */
for (; currlen > 0; --currlen)
{
/* Write `CMem' chunk. */
if ((cmempos = ftell (svf)) < 0) return 0;
if (!write_chnk (svf, ID_CMem, 0)) return 0;
- (void) fseek (stf, 0, SEEK_SET);
+ (void) os_storyfile_seek (stf, 0, SEEK_SET);
/* j holds current run length. */
for (i=0, j=0, cmemlen=0; i < h_dynamic_size; ++i)
{
return fp;
}
+/*
+ * Seek into a storyfile, either a standalone file or the
+ * ZCODE chunk of a blorb file
+ */
+int os_storyfile_seek(FILE * fp, long offset, int whence)
+{
+ /* Is this a Blorb file containing Zcode? */
+ if (u_setup.exec_in_blorb)
+ {
+ switch (whence)
+ {
+ case SEEK_END:
+ return fseek(fp, blorb_res.data.startpos + blorb_res.length + offset, SEEK_SET);
+ break;
+ case SEEK_CUR:
+ return fseek(fp, offset, SEEK_CUR);
+ break;
+ case SEEK_SET:
+ default:
+ return fseek(fp, blorb_res.data.startpos + offset, SEEK_SET);
+ break;
+ }
+ }
+ else
+ {
+ return fseek(fp, offset, whence);
+ }
+
+}
+
+/*
+ * Tell the position in a storyfile, either a standalone file
+ * or the ZCODE chunk of a blorb file
+ */
+int os_storyfile_tell(FILE * fp)
+{
+ /* Is this a Blorb file containing Zcode? */
+ if (u_setup.exec_in_blorb)
+ {
+ return ftell(fp) - blorb_res.data.startpos;
+ }
+ else
+ {
+ return ftell(fp);
+ }
+
+}
/*
* pathopen
return 0;\r
}\r
\r
+/*\r
+ * Seek into a storyfile, either a standalone file or the \r
+ * ZCODE chunk of a blorb file\r
+ */\r
+int os_storyfile_seek(FILE * fp, long offset, int whence)\r
+{\r
+ /* Is this a Blorb file containing Zcode? */\r
+ if (exec_in_blorb)\r
+ {\r
+ switch (whence)\r
+ {\r
+ case SEEK_END:\r
+ return fseek(fp, blorb_res.data.startpos + blorb_res.length + offset, SEEK_SET);\r
+ break;\r
+ case SEEK_CUR:\r
+ return fseek(fp, offset, SEEK_CUR);\r
+ break;\r
+ case SEEK_SET:\r
+ default:\r
+ return fseek(fp, blorb_res.data.startpos + offset, SEEK_SET);\r
+ break;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ return fseek(fp, offset, whence);\r
+ }\r
+\r
+}\r
+\r
+/*\r
+ * Tell the position in a storyfile, either a standalone file \r
+ * or the ZCODE chunk of a blorb file\r
+ */\r
+int os_storyfile_tell(FILE * fp)\r
+{\r
+ /* Is this a Blorb file containing Zcode? */\r
+ if (exec_in_blorb)\r
+ {\r
+ return ftell(fp) - blorb_res.data.startpos;\r
+ }\r
+ else\r
+ {\r
+ return ftell(fp);\r
+ }\r
+\r
+}\r
+\r
return fopen(f_setup.story_file, "rb");
}
+/*
+ * Seek into a storyfile, either a standalone file or the
+ * ZCODE chunk of a blorb file (dumb does not support blorb
+ * so this is just a wrapper for fseek)
+ */
+int os_storyfile_seek(FILE * fp, long offset, int whence)
+{
+ return fseek(fp, offset, whence);
+}
+
+/*
+ * Tell the position in a storyfile, either a standalone file
+ * or the ZCODE chunk of a blorb file (dumb does not support
+ * blorb so this is just a wrapper for fseek)
+ */
+int os_storyfile_tell(FILE * fp)
+{
+ return ftell(fp);
+}
+
+
void os_init_setup(void)
{
f_setup.attribute_assignment = 0;