2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
10 #if defined(_USE_QT) || defined(_USE_SDL)
18 #include <sys/types.h>
20 #if !defined(Q_OS_WIN)
28 #if !defined(_MSC_VER)
45 #include "zlib-1.2.11/zlib.h"
46 #include "zlib-1.2.11/zconf.h"
50 #if ZLIB_VERNUM < 0x1290
51 inline size_t gzfread(void *buffer, size_t size, size_t count, gzFile file)
53 uint8_t *p = (uint8_t *)buffer;
56 for(i = 0; i < count; i++) {
57 for(int j = 0; j < size; j++) {
59 if(s < 0) return 0; // EOF
65 inline size_t gzfwrite(void *buffer, size_t size, size_t count, gzFile file)
67 uint8_t *p = (uint8_t *)buffer;
71 for(i = 0; i < count; i++) {
72 for(int j = 0; j < size; j++) {
75 if(s < 0) return 0; // EOF
95 bool FILEIO::IsFileExisting(const _TCHAR *file_path)
97 #if defined(_USE_QT) || defined(_USE_SDL)
99 f = fopen(file_path, "r");
105 #elif defined(_WIN32)
106 DWORD attr = GetFileAttributes(file_path);
110 return ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0);
112 return (_taccess(file_path, 0) == 0);
117 # include <sys/types.h>
118 # include <sys/stat.h>
119 # if !defined(Q_OS_WIN)
123 bool FILEIO::IsFileProtected(const _TCHAR *file_path)
125 #if defined(_USE_QT) || defined(_USE_SDL)
127 if(stat(file_path, &st) == 0) {
129 if((st.st_mode & S_IWUSR) == 0) {
131 if((st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) == 0) {
137 #elif defined(_WIN32)
138 return ((GetFileAttributes(file_path) & FILE_ATTRIBUTE_READONLY) != 0);
140 return (_taccess(file_path, 2) != 0);
144 bool FILEIO::RemoveFile(const _TCHAR *file_path)
146 #if defined(_USE_QT) || defined(_USE_SDL)
147 return (remove(file_path) == 0);
148 #elif defined(_WIN32)
149 return (DeleteFile(file_path) != 0);
151 return (_tremove(file_path) == 0); // not supported on wince ???
155 bool FILEIO::RenameFile(const _TCHAR *existing_file_path, const _TCHAR *new_file_path)
157 #if defined(_USE_QT) || defined(_USE_SDL)
158 return (rename(existing_file_path, new_file_path) == 0);
159 #elif defined(_WIN32)
160 return (MoveFile(existing_file_path, new_file_path) != 0);
162 return (_trename(existing_file_path, new_file_path) == 0);
166 bool FILEIO::Fopen(const _TCHAR *file_path, int mode)
171 my_tcscpy_s(path, _MAX_PATH, file_path);
174 if(check_file_extension(file_path, _T(".gz"))) {
176 case FILEIO_READ_BINARY:
177 // case FILEIO_READ_WRITE_BINARY:
178 case FILEIO_READ_ASCII:
179 // case FILEIO_READ_WRITE_ASCII:
180 // case FILEIO_READ_WRITE_APPEND_ASCII:
181 if((fp = _tfopen(file_path, _T("rb"))) != NULL) {
183 uint8_t data[10], name[_MAX_PATH] = {0};
184 fread(data, 10, 1, fp);
187 fseek(fp, 2, SEEK_CUR);
191 fread(data + 4, 2, 1, fp);
192 fseek(fp, data[4] | (data[5] << 8), SEEK_CUR);
195 // read original file name
196 fread(name, sizeof(name), 1, fp);
197 my_stprintf_s(path, _MAX_PATH, _T("%s%s"), get_parent_dir(path), (char *)name);
199 // get uncompressed input size
200 fseek(fp, -4, SEEK_END);
201 fread(data, 4, 1, fp);
202 gz_size = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
209 case FILEIO_READ_BINARY:
211 //memset(path, 0x00, _MAX_PATH);
212 gz = gzopen(file_path, _T("rb"));
214 my_tcscpy_s(path, _MAX_PATH, get_file_path_without_extensiton(file_path));
217 my_tcscpy_s(path, _MAX_PATH, file_path);
222 // case FILEIO_WRITE_BINARY:
223 // return ((gz = gzopen(file_path, _T("wb"))) != NULL);
224 // case FILEIO_READ_WRITE_BINARY:
225 // return ((gz = gzopen(file_path, _T("r+b"))) != NULL);
226 // case FILEIO_READ_WRITE_NEW_BINARY:
227 // return ((gz = gzopen(file_path, _T("w+b"))) != NULL);
228 case FILEIO_READ_ASCII:
230 gz = gzopen(file_path, _T("r"));
232 my_tcscpy_s(path, _MAX_PATH, get_file_path_without_extensiton(file_path));
235 my_tcscpy_s(path, _MAX_PATH, file_path);
240 // case FILEIO_WRITE_ASCII:
241 // return ((gz = gzopen(file_path, _T("w"))) != NULL);
242 // case FILEIO_WRITE_APPEND_ASCII:
243 // return ((gz = gzopen(file_path, _T("a"))) != NULL);
244 // case FILEIO_READ_WRITE_ASCII:
245 // return ((gz = gzopen(file_path, _T("r+"))) != NULL);
246 // case FILEIO_READ_WRITE_NEW_ASCII:
247 // return ((gz = gzopen(file_path, _T("w+"))) != NULL);
248 // case FILEIO_READ_WRITE_APPEND_ASCII:
249 // return ((gz = gzopen(file_path, _T("a+"))) != NULL);
254 case FILEIO_READ_BINARY:
255 return ((fp = _tfopen(file_path, _T("rb"))) != NULL);
256 case FILEIO_WRITE_BINARY:
257 return ((fp = _tfopen(file_path, _T("wb"))) != NULL);
258 case FILEIO_READ_WRITE_BINARY:
259 return ((fp = _tfopen(file_path, _T("r+b"))) != NULL);
260 case FILEIO_READ_WRITE_NEW_BINARY:
261 return ((fp = _tfopen(file_path, _T("w+b"))) != NULL);
262 case FILEIO_READ_ASCII:
263 return ((fp = _tfopen(file_path, _T("r"))) != NULL);
264 case FILEIO_WRITE_ASCII:
265 return ((fp = _tfopen(file_path, _T("w"))) != NULL);
266 case FILEIO_WRITE_APPEND_ASCII:
267 return ((fp = _tfopen(file_path, _T("a"))) != NULL);
268 case FILEIO_READ_WRITE_ASCII:
269 return ((fp = _tfopen(file_path, _T("r+"))) != NULL);
270 case FILEIO_READ_WRITE_NEW_ASCII:
271 return ((fp = _tfopen(file_path, _T("w+"))) != NULL);
272 case FILEIO_READ_WRITE_APPEND_ASCII:
273 return ((fp = _tfopen(file_path, _T("a+"))) != NULL);
278 void FILEIO::Fclose()
293 long FILEIO::FileLength()
296 Fseek(0, FILEIO_SEEK_END);
298 Fseek(pos, FILEIO_SEEK_SET);
302 #define GET_VALUE(type) \
303 uint8_t buffer[sizeof(type)]; \
304 type *tmpv = (type *)buffer; \
305 Fread(buffer, sizeof(buffer), 1); \
308 #define PUT_VALUE(type, v) \
309 Fwrite(&v, sizeof(type), 1)
311 bool FILEIO::FgetBool()
316 void FILEIO::FputBool(bool val)
318 PUT_VALUE(bool, val);
321 uint8_t FILEIO::FgetUint8()
326 void FILEIO::FputUint8(uint8_t val)
328 PUT_VALUE(uint8_t, val);
331 uint16_t FILEIO::FgetUint16()
336 void FILEIO::FputUint16(uint16_t val)
338 PUT_VALUE(uint16_t, val);
341 uint32_t FILEIO::FgetUint32()
346 void FILEIO::FputUint32(uint32_t val)
348 PUT_VALUE(uint32_t, val);
351 uint64_t FILEIO::FgetUint64()
356 void FILEIO::FputUint64(uint64_t val)
358 PUT_VALUE(uint64_t, val);
361 int8_t FILEIO::FgetInt8()
366 void FILEIO::FputInt8(int8_t val)
368 PUT_VALUE(int8_t, val);
371 int16_t FILEIO::FgetInt16()
376 void FILEIO::FputInt16(int16_t val)
378 PUT_VALUE(int16_t, val);
381 int32_t FILEIO::FgetInt32()
386 void FILEIO::FputInt32(int32_t val)
388 PUT_VALUE(int32_t, val);
391 int64_t FILEIO::FgetInt64()
396 void FILEIO::FputInt64(int64_t val)
398 PUT_VALUE(int64_t, val);
401 float FILEIO::FgetFloat()
406 void FILEIO::FputFloat(float val)
408 PUT_VALUE(float, val);
411 double FILEIO::FgetDouble()
416 void FILEIO::FputDouble(double val)
418 PUT_VALUE(double, val);
423 #ifdef __BIG_ENDIAN__
435 #ifdef __BIG_ENDIAN__
436 uint8_t h3, h2, h, l;
438 uint8_t l, h, h2, h3;
447 #ifdef __BIG_ENDIAN__
448 uint8_t h7, h6, h5, h4, h3, h2, h, l;
450 uint8_t l, h, h2, h3, h4, h5, h6, h7;
457 uint16_t FILEIO::FgetUint16_LE()
460 tmp.b.l = FgetUint8();
461 tmp.b.h = FgetUint8();
465 void FILEIO::FputUint16_LE(uint16_t val)
473 uint32_t FILEIO::FgetUint32_LE()
476 tmp.b.l = FgetUint8();
477 tmp.b.h = FgetUint8();
478 tmp.b.h2 = FgetUint8();
479 tmp.b.h3 = FgetUint8();
483 void FILEIO::FputUint32_LE(uint32_t val)
493 uint64_t FILEIO::FgetUint64_LE()
496 tmp.b.l = FgetUint8();
497 tmp.b.h = FgetUint8();
498 tmp.b.h2 = FgetUint8();
499 tmp.b.h3 = FgetUint8();
500 tmp.b.h4 = FgetUint8();
501 tmp.b.h5 = FgetUint8();
502 tmp.b.h6 = FgetUint8();
503 tmp.b.h7 = FgetUint8();
507 void FILEIO::FputUint64_LE(uint64_t val)
521 int16_t FILEIO::FgetInt16_LE()
524 tmp.b.l = FgetUint8();
525 tmp.b.h = FgetUint8();
529 void FILEIO::FputInt16_LE(int16_t val)
537 int32_t FILEIO::FgetInt32_LE()
540 tmp.b.l = FgetUint8();
541 tmp.b.h = FgetUint8();
542 tmp.b.h2 = FgetUint8();
543 tmp.b.h3 = FgetUint8();
547 void FILEIO::FputInt32_LE(int32_t val)
557 int64_t FILEIO::FgetInt64_LE()
560 tmp.b.l = FgetUint8();
561 tmp.b.h = FgetUint8();
562 tmp.b.h2 = FgetUint8();
563 tmp.b.h3 = FgetUint8();
564 tmp.b.h4 = FgetUint8();
565 tmp.b.h5 = FgetUint8();
566 tmp.b.h6 = FgetUint8();
567 tmp.b.h7 = FgetUint8();
571 void FILEIO::FputInt64_LE(int64_t val)
585 uint16_t FILEIO::FgetUint16_BE()
588 tmp.b.h = FgetUint8();
589 tmp.b.l = FgetUint8();
593 void FILEIO::FputUint16_BE(uint16_t val)
601 uint32_t FILEIO::FgetUint32_BE()
604 tmp.b.h3 = FgetUint8();
605 tmp.b.h2 = FgetUint8();
606 tmp.b.h = FgetUint8();
607 tmp.b.l = FgetUint8();
611 void FILEIO::FputUint32_BE(uint32_t val)
621 uint64_t FILEIO::FgetUint64_BE()
624 tmp.b.h7 = FgetUint8();
625 tmp.b.h6 = FgetUint8();
626 tmp.b.h5 = FgetUint8();
627 tmp.b.h4 = FgetUint8();
628 tmp.b.h3 = FgetUint8();
629 tmp.b.h2 = FgetUint8();
630 tmp.b.h = FgetUint8();
631 tmp.b.l = FgetUint8();
635 void FILEIO::FputUint64_BE(uint64_t val)
649 int16_t FILEIO::FgetInt16_BE()
652 tmp.b.h = FgetUint8();
653 tmp.b.l = FgetUint8();
657 void FILEIO::FputInt16_BE(int16_t val)
665 int32_t FILEIO::FgetInt32_BE()
668 tmp.b.h3 = FgetUint8();
669 tmp.b.h2 = FgetUint8();
670 tmp.b.h = FgetUint8();
671 tmp.b.l = FgetUint8();
675 void FILEIO::FputInt32_BE(int32_t val)
685 int64_t FILEIO::FgetInt64_BE()
688 tmp.b.h7 = FgetUint8();
689 tmp.b.h6 = FgetUint8();
690 tmp.b.h5 = FgetUint8();
691 tmp.b.h4 = FgetUint8();
692 tmp.b.h3 = FgetUint8();
693 tmp.b.h2 = FgetUint8();
694 tmp.b.h = FgetUint8();
695 tmp.b.l = FgetUint8();
699 void FILEIO::FputInt64_BE(int64_t val)
729 int FILEIO::Fputc(int c)
733 return gzputc(gz, c);
745 char *FILEIO::Fgets(char *str, int n)
749 return gzgets(gz, str, n);
754 return fgets(str, n, fp);
761 int FILEIO::Fprintf(const char* format, ...)
766 va_start(ap, format);
767 my_vsprintf_s(buffer, 1024, format, ap);
772 return gzprintf(gz, "%s", buffer);
777 return my_fprintf_s(fp, "%s", buffer);
784 size_t FILEIO::Fread(void* buffer, size_t size, size_t count)
788 return gzfread(buffer, size, count, gz);
793 return fread(buffer, size, count, fp);
800 size_t FILEIO::Fwrite(void* buffer, size_t size, size_t count)
804 return gzfwrite(buffer, size, count, gz);
809 return fwrite(buffer, size, count, fp);
816 int FILEIO::Fseek(long offset, int origin)
821 case FILEIO_SEEK_CUR:
822 return gzseek(gz, offset, SEEK_CUR);
823 case FILEIO_SEEK_END:
824 return gzseek(gz, offset + gz_size, SEEK_SET);
825 case FILEIO_SEEK_SET:
826 return gzseek(gz, offset, SEEK_SET);
831 if(fp == NULL) return -1;
833 case FILEIO_SEEK_CUR:
834 return fseek(fp, offset, SEEK_CUR);
835 case FILEIO_SEEK_END:
836 return fseek(fp, offset, SEEK_END);
837 case FILEIO_SEEK_SET:
838 return fseek(fp, offset, SEEK_SET);