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)
41 #include "zlib-1.2.11/zlib.h"
42 #include "zlib-1.2.11/zconf.h"
59 bool FILEIO::IsFileExisting(const _TCHAR *file_path)
61 #if defined(_USE_QT) || defined(_USE_SDL)
63 f = fopen(file_path, "r");
70 DWORD attr = GetFileAttributes(file_path);
74 return ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0);
76 return (_taccess(file_path, 0) == 0);
81 # include <sys/types.h>
82 # include <sys/stat.h>
83 # if !defined(Q_OS_WIN)
87 bool FILEIO::IsFileProtected(const _TCHAR *file_path)
89 #if defined(_USE_QT) || defined(_USE_SDL)
91 if(stat(file_path, &st) == 0) {
93 if((st.st_mode & S_IWUSR) == 0) {
95 if((st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) == 0) {
101 #elif defined(_WIN32)
102 return ((GetFileAttributes(file_path) & FILE_ATTRIBUTE_READONLY) != 0);
104 return (_taccess(file_path, 2) != 0);
108 bool FILEIO::RemoveFile(const _TCHAR *file_path)
110 #if defined(_USE_QT) || defined(_USE_SDL)
111 return (remove(file_path) == 0);
112 #elif defined(_WIN32)
113 return (DeleteFile(file_path) != 0);
115 return (_tremove(file_path) == 0); // not supported on wince ???
119 bool FILEIO::RenameFile(const _TCHAR *existing_file_path, const _TCHAR *new_file_path)
121 #if defined(_USE_QT) || defined(_USE_SDL)
122 return (rename(existing_file_path, new_file_path) == 0);
123 #elif defined(_WIN32)
124 return (MoveFile(existing_file_path, new_file_path) != 0);
126 return (_trename(existing_file_path, new_file_path) == 0);
130 bool FILEIO::Fopen(const _TCHAR *file_path, int mode)
135 my_tcscpy_s(path, _MAX_PATH, file_path);
138 if(check_file_extension(file_path, _T(".gz"))) {
140 case FILEIO_READ_BINARY:
141 // case FILEIO_READ_WRITE_BINARY:
142 case FILEIO_READ_ASCII:
143 // case FILEIO_READ_WRITE_ASCII:
144 // case FILEIO_READ_WRITE_APPEND_ASCII:
145 if((fp = _tfopen(file_path, _T("rb"))) != NULL) {
147 uint8_t data[10], name[_MAX_PATH] = {0};
148 fread(data, 10, 1, fp);
151 fseek(fp, 2, SEEK_CUR);
155 fread(data + 4, 2, 1, fp);
156 fseek(fp, data[4] | (data[5] << 8), SEEK_CUR);
159 // read original file name
160 fread(name, sizeof(name), 1, fp);
161 my_stprintf_s(path, _MAX_PATH, _T("%s%s"), get_parent_dir(path), (char *)name);
163 // get uncompressed input size
164 fseek(fp, -4, SEEK_END);
165 fread(data, 4, 1, fp);
166 gz_size = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
173 case FILEIO_READ_BINARY:
174 return ((gz = gzopen(file_path, _T("rb"))) != NULL);
175 // case FILEIO_WRITE_BINARY:
176 // return ((gz = gzopen(file_path, _T("wb"))) != NULL);
177 // case FILEIO_READ_WRITE_BINARY:
178 // return ((gz = gzopen(file_path, _T("r+b"))) != NULL);
179 // case FILEIO_READ_WRITE_NEW_BINARY:
180 // return ((gz = gzopen(file_path, _T("w+b"))) != NULL);
181 case FILEIO_READ_ASCII:
182 return ((gz = gzopen(file_path, _T("r"))) != NULL);
183 // case FILEIO_WRITE_ASCII:
184 // return ((gz = gzopen(file_path, _T("w"))) != NULL);
185 // case FILEIO_WRITE_APPEND_ASCII:
186 // return ((gz = gzopen(file_path, _T("a"))) != NULL);
187 // case FILEIO_READ_WRITE_ASCII:
188 // return ((gz = gzopen(file_path, _T("r+"))) != NULL);
189 // case FILEIO_READ_WRITE_NEW_ASCII:
190 // return ((gz = gzopen(file_path, _T("w+"))) != NULL);
191 // case FILEIO_READ_WRITE_APPEND_ASCII:
192 // return ((gz = gzopen(file_path, _T("a+"))) != NULL);
197 case FILEIO_READ_BINARY:
198 return ((fp = _tfopen(file_path, _T("rb"))) != NULL);
199 case FILEIO_WRITE_BINARY:
200 return ((fp = _tfopen(file_path, _T("wb"))) != NULL);
201 case FILEIO_READ_WRITE_BINARY:
202 return ((fp = _tfopen(file_path, _T("r+b"))) != NULL);
203 case FILEIO_READ_WRITE_NEW_BINARY:
204 return ((fp = _tfopen(file_path, _T("w+b"))) != NULL);
205 case FILEIO_READ_ASCII:
206 return ((fp = _tfopen(file_path, _T("r"))) != NULL);
207 case FILEIO_WRITE_ASCII:
208 return ((fp = _tfopen(file_path, _T("w"))) != NULL);
209 case FILEIO_WRITE_APPEND_ASCII:
210 return ((fp = _tfopen(file_path, _T("a"))) != NULL);
211 case FILEIO_READ_WRITE_ASCII:
212 return ((fp = _tfopen(file_path, _T("r+"))) != NULL);
213 case FILEIO_READ_WRITE_NEW_ASCII:
214 return ((fp = _tfopen(file_path, _T("w+"))) != NULL);
215 case FILEIO_READ_WRITE_APPEND_ASCII:
216 return ((fp = _tfopen(file_path, _T("a+"))) != NULL);
221 void FILEIO::Fclose()
236 long FILEIO::FileLength()
239 Fseek(0, FILEIO_SEEK_END);
241 Fseek(pos, FILEIO_SEEK_SET);
245 #define GET_VALUE(type) \
246 uint8_t buffer[sizeof(type)]; \
247 type *tmpv = (type *)buffer; \
248 Fread(buffer, sizeof(buffer), 1); \
251 #define PUT_VALUE(type, v) \
252 Fwrite(&v, sizeof(type), 1)
254 bool FILEIO::FgetBool()
259 void FILEIO::FputBool(bool val)
261 PUT_VALUE(bool, val);
264 uint8_t FILEIO::FgetUint8()
269 void FILEIO::FputUint8(uint8_t val)
271 PUT_VALUE(uint8_t, val);
274 uint16_t FILEIO::FgetUint16()
279 void FILEIO::FputUint16(uint16_t val)
281 PUT_VALUE(uint16_t, val);
284 uint32_t FILEIO::FgetUint32()
289 void FILEIO::FputUint32(uint32_t val)
291 PUT_VALUE(uint32_t, val);
294 uint64_t FILEIO::FgetUint64()
299 void FILEIO::FputUint64(uint64_t val)
301 PUT_VALUE(uint64_t, val);
304 int8_t FILEIO::FgetInt8()
309 void FILEIO::FputInt8(int8_t val)
311 PUT_VALUE(int8_t, val);
314 int16_t FILEIO::FgetInt16()
319 void FILEIO::FputInt16(int16_t val)
321 PUT_VALUE(int16_t, val);
324 int32_t FILEIO::FgetInt32()
329 void FILEIO::FputInt32(int32_t val)
331 PUT_VALUE(int32_t, val);
334 int64_t FILEIO::FgetInt64()
339 void FILEIO::FputInt64(int64_t val)
341 PUT_VALUE(int64_t, val);
344 float FILEIO::FgetFloat()
349 void FILEIO::FputFloat(float val)
351 PUT_VALUE(float, val);
354 double FILEIO::FgetDouble()
359 void FILEIO::FputDouble(double val)
361 PUT_VALUE(double, val);
366 #ifdef __BIG_ENDIAN__
378 #ifdef __BIG_ENDIAN__
379 uint8_t h3, h2, h, l;
381 uint8_t l, h, h2, h3;
390 #ifdef __BIG_ENDIAN__
391 uint8_t h7, h6, h5, h4, h3, h2, h, l;
393 uint8_t l, h, h2, h3, h4, h5, h6, h7;
400 uint16_t FILEIO::FgetUint16_LE()
403 tmp.b.l = FgetUint8();
404 tmp.b.h = FgetUint8();
408 void FILEIO::FputUint16_LE(uint16_t val)
416 uint32_t FILEIO::FgetUint32_LE()
419 tmp.b.l = FgetUint8();
420 tmp.b.h = FgetUint8();
421 tmp.b.h2 = FgetUint8();
422 tmp.b.h3 = FgetUint8();
426 void FILEIO::FputUint32_LE(uint32_t val)
436 uint64_t FILEIO::FgetUint64_LE()
439 tmp.b.l = FgetUint8();
440 tmp.b.h = FgetUint8();
441 tmp.b.h2 = FgetUint8();
442 tmp.b.h3 = FgetUint8();
443 tmp.b.h4 = FgetUint8();
444 tmp.b.h5 = FgetUint8();
445 tmp.b.h6 = FgetUint8();
446 tmp.b.h7 = FgetUint8();
450 void FILEIO::FputUint64_LE(uint64_t val)
464 int16_t FILEIO::FgetInt16_LE()
467 tmp.b.l = FgetUint8();
468 tmp.b.h = FgetUint8();
472 void FILEIO::FputInt16_LE(int16_t val)
480 int32_t FILEIO::FgetInt32_LE()
483 tmp.b.l = FgetUint8();
484 tmp.b.h = FgetUint8();
485 tmp.b.h2 = FgetUint8();
486 tmp.b.h3 = FgetUint8();
490 void FILEIO::FputInt32_LE(int32_t val)
500 int64_t FILEIO::FgetInt64_LE()
503 tmp.b.l = FgetUint8();
504 tmp.b.h = FgetUint8();
505 tmp.b.h2 = FgetUint8();
506 tmp.b.h3 = FgetUint8();
507 tmp.b.h4 = FgetUint8();
508 tmp.b.h5 = FgetUint8();
509 tmp.b.h6 = FgetUint8();
510 tmp.b.h7 = FgetUint8();
514 void FILEIO::FputInt64_LE(int64_t val)
528 uint16_t FILEIO::FgetUint16_BE()
531 tmp.b.h = FgetUint8();
532 tmp.b.l = FgetUint8();
536 void FILEIO::FputUint16_BE(uint16_t val)
544 uint32_t FILEIO::FgetUint32_BE()
547 tmp.b.h3 = FgetUint8();
548 tmp.b.h2 = FgetUint8();
549 tmp.b.h = FgetUint8();
550 tmp.b.l = FgetUint8();
554 void FILEIO::FputUint32_BE(uint32_t val)
564 uint64_t FILEIO::FgetUint64_BE()
567 tmp.b.h7 = FgetUint8();
568 tmp.b.h6 = FgetUint8();
569 tmp.b.h5 = FgetUint8();
570 tmp.b.h4 = FgetUint8();
571 tmp.b.h3 = FgetUint8();
572 tmp.b.h2 = FgetUint8();
573 tmp.b.h = FgetUint8();
574 tmp.b.l = FgetUint8();
578 void FILEIO::FputUint64_BE(uint64_t val)
592 int16_t FILEIO::FgetInt16_BE()
595 tmp.b.h = FgetUint8();
596 tmp.b.l = FgetUint8();
600 void FILEIO::FputInt16_BE(int16_t val)
608 int32_t FILEIO::FgetInt32_BE()
611 tmp.b.h3 = FgetUint8();
612 tmp.b.h2 = FgetUint8();
613 tmp.b.h = FgetUint8();
614 tmp.b.l = FgetUint8();
618 void FILEIO::FputInt32_BE(int32_t val)
628 int64_t FILEIO::FgetInt64_BE()
631 tmp.b.h7 = FgetUint8();
632 tmp.b.h6 = FgetUint8();
633 tmp.b.h5 = FgetUint8();
634 tmp.b.h4 = FgetUint8();
635 tmp.b.h3 = FgetUint8();
636 tmp.b.h2 = FgetUint8();
637 tmp.b.h = FgetUint8();
638 tmp.b.l = FgetUint8();
642 void FILEIO::FputInt64_BE(int64_t val)
666 int FILEIO::Fputc(int c)
670 return gzputc(gz, c);
676 char *FILEIO::Fgets(char *str, int n)
680 return gzgets(gz, str, n);
683 return fgets(str, n, fp);
686 int FILEIO::Fprintf(const char* format, ...)
691 va_start(ap, format);
692 my_vsprintf_s(buffer, 1024, format, ap);
697 return gzprintf(gz, "%s", buffer);
700 return my_fprintf_s(fp, "%s", buffer);
703 size_t FILEIO::Fread(void* buffer, size_t size, size_t count)
707 return gzfread(buffer, size, count, gz);
710 return fread(buffer, size, count, fp);
713 size_t FILEIO::Fwrite(void* buffer, size_t size, size_t count)
717 return gzfwrite(buffer, size, count, gz);
720 return fwrite(buffer, size, count, fp);
723 int FILEIO::Fseek(long offset, int origin)
728 case FILEIO_SEEK_CUR:
729 return gzseek(gz, offset, SEEK_CUR);
730 case FILEIO_SEEK_END:
731 return gzseek(gz, offset + gz_size, SEEK_SET);
732 case FILEIO_SEEK_SET:
733 return gzseek(gz, offset, SEEK_SET);
738 case FILEIO_SEEK_CUR:
739 return fseek(fp, offset, SEEK_CUR);
740 case FILEIO_SEEK_END:
741 return fseek(fp, offset, SEEK_END);
742 case FILEIO_SEEK_SET:
743 return fseek(fp, offset, SEEK_SET);