1 /* $Id: cfile.h,v 1.16 2005-01-23 14:38:04 schaffner Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 * Wrappers for physfs abstraction layer
34 #define CFILE PHYSFS_file
35 #define cfread(p,s,n,fp) PHYSFS_read(fp,p,s,n)
36 #define cfclose PHYSFS_close
37 #define cftell PHYSFS_tell
38 #define cfexist PHYSFS_exists
39 #define cfilelength PHYSFS_fileLength
41 //Open a file, set up a buffer
42 static inline PHYSFS_file *cfopen(char *filename, char *mode)
45 PHYSFS_uint64 bufSize = 1024*1024;
47 if (filename[0] == '\x01')
49 //FIXME: don't look in dir, only in hogfile
53 if (!stricmp(mode, "rb"))
55 fp = PHYSFS_openRead(filename);
58 bufSize = PHYSFS_fileLength(fp);
60 else if (!stricmp(mode, "wb"))
62 fp = PHYSFS_openWrite(filename);
67 while (!PHYSFS_setBuffer(fp, bufSize) && bufSize)
68 bufSize /= 2; // even if the error isn't memory full, for a 20MB file it'll only do this 8 times
73 //Specify the name of the hogfile. Returns 1 if hogfile found & had files
74 static inline int cfile_init(char *hogname)
76 char pathname[PATH_MAX];
78 if (!PHYSFSX_getRealPath(hogname, pathname))
81 return PHYSFS_addToSearchPath(pathname, 1);
84 static inline int cfile_close(char *hogname)
86 char pathname[PATH_MAX];
88 if (!PHYSFSX_getRealPath(hogname, pathname))
91 return PHYSFS_removeFromSearchPath(pathname);
95 static inline int cfile_size(char *hogname)
100 fp = PHYSFS_openRead(hogname);
103 size = PHYSFS_fileLength(fp);
109 static inline int cfgetc(PHYSFS_file *const fp)
113 if (PHYSFS_read(fp, &c, 1, 1) != 1)
119 static inline int cfseek(PHYSFS_file *fp, long int offset, int where)
121 int c, goal_position;
126 goal_position = offset;
129 goal_position = PHYSFS_tell(fp) + offset;
132 goal_position = PHYSFS_fileLength(fp) + offset;
137 c = PHYSFS_seek(fp, goal_position);
141 static inline char * cfgets(char *buf, size_t n, PHYSFS_file *const fp)
146 for (i = 0; i < n - 1; i++)
157 if (c == 0 || c == 10) // Unix line ending
159 if (c == 13) // Mac or DOS line ending
164 if (c1 != EOF) // The file could end with a Mac line ending
165 cfseek(fp, -1, SEEK_CUR);
166 if (c1 == 10) // DOS line ending
168 else // Mac line ending
172 if (c == 13) // because cr-lf is a bad thing on the mac
173 c = '\n'; // and anyway -- 0xod is CR on mac, not 0x0a
185 * read some data types...
188 static inline int cfile_read_int(PHYSFS_file *file)
192 if (!PHYSFS_readSLE32(file, &i))
194 fprintf(stderr, "Error reading int in cfile_read_int()");
201 static inline short cfile_read_short(PHYSFS_file *file)
205 if (!PHYSFS_readSLE16(file, &s))
207 fprintf(stderr, "Error reading short in cfile_read_short()");
214 static inline sbyte cfile_read_byte(PHYSFS_file *file)
218 if (PHYSFS_read(file, &b, sizeof(b), 1) != 1)
220 fprintf(stderr, "Error reading byte in cfile_read_byte()");
227 static inline fix cfile_read_fix(PHYSFS_file *file)
229 int f; // a fix is defined as a long for Mac OS 9, and MPW can't convert from (long *) to (int *)
231 if (!PHYSFS_readSLE32(file, &f))
233 fprintf(stderr, "Error reading fix in cfile_read_fix()");
240 static inline fixang cfile_read_fixang(PHYSFS_file *file)
244 if (!PHYSFS_readSLE16(file, &f))
246 fprintf(stderr, "Error reading fixang in cfile_read_fixang()");
253 static inline void cfile_read_vector(vms_vector *v, PHYSFS_file *file)
255 v->x = cfile_read_fix(file);
256 v->y = cfile_read_fix(file);
257 v->z = cfile_read_fix(file);
260 static inline void cfile_read_angvec(vms_angvec *v, PHYSFS_file *file)
262 v->p = cfile_read_fixang(file);
263 v->b = cfile_read_fixang(file);
264 v->h = cfile_read_fixang(file);
267 static inline void cfile_read_matrix(vms_matrix *m,PHYSFS_file *file)
269 cfile_read_vector(&m->rvec,file);
270 cfile_read_vector(&m->uvec,file);
271 cfile_read_vector(&m->fvec,file);