OSDN Git Service

[EMU] Enable to Gzip'ed state saving / loading.
[csp-qt/common_source_project-fm7.git] / source / src / fileio.cpp
index 1b911d3..fd431ae 100644 (file)
 #endif
 
 #ifdef USE_ZLIB
-       #ifdef _WIN32
-               #define ZLIB_WINAPI
+       #if defined(USE_QT)
+               #include <zlib.h>
+               #include <zconf.h>
+       #else
+               #ifdef _WIN32
+                       #define ZLIB_WINAPI
+               #endif
+               #include "zlib-1.2.11/zlib.h"
+               #include "zlib-1.2.11/zconf.h"
        #endif
-       #include "zlib-1.2.11/zlib.h"
-       #include "zlib-1.2.11/zconf.h"
 #endif
 
+#if ZLIB_VERNUM < 0x1290
+inline size_t gzfread(void *buffer, size_t size, size_t count, gzFile file)
+{
+       uint8_t *p = (uint8_t *)buffer;
+       int s = 0;
+       int i = 0;
+       for(i = 0; i < count; i++) {
+               for(int j = 0; j < size; j++) {
+                       s = gzgetc(file);
+                       if(s < 0) return 0; // EOF
+                       *p++ = (uint8_t)s; 
+               }
+       }
+       return i + 1;
+}
+inline size_t gzfwrite(void *buffer, size_t size, size_t count, gzFile file)
+{
+       uint8_t *p = (uint8_t *)buffer;
+       uint8_t n;
+       int s = 0;
+       int i = 0;
+       for(i = 0; i < count; i++) {
+               for(int j = 0; j < size; j++) {
+                       n = *p++; 
+                       s = gzputc(file, n);
+                       if(s < 0) return 0; // EOF
+               }
+       }
+       return i + 1;
+}
+#endif                 
 FILEIO::FILEIO()
 {
 #ifdef USE_ZLIB
@@ -136,16 +172,50 @@ bool FILEIO::Fopen(const _TCHAR *file_path, int mode)
        
 #ifdef USE_ZLIB
        if(check_file_extension(file_path, _T(".gz"))) {
-               switch(mode) {
-               case FILEIO_READ_BINARY:
-//             case FILEIO_READ_WRITE_BINARY:
-               case FILEIO_READ_ASCII:
-//             case FILEIO_READ_WRITE_ASCII:
-//             case FILEIO_READ_WRITE_APPEND_ASCII:
-                       if((fp = _tfopen(file_path, _T("rb"))) != NULL) {
-                               // check gzip header
-                               uint8_t data[10], name[_MAX_PATH] = {0};
-                               fread(data, 10, 1, fp);
+               return Gzopen(file_path, mode);
+       }
+#endif
+       switch(mode) {
+       case FILEIO_READ_BINARY:
+               return ((fp = _tfopen(file_path, _T("rb"))) != NULL);
+       case FILEIO_WRITE_BINARY:
+               return ((fp = _tfopen(file_path, _T("wb"))) != NULL);
+       case FILEIO_READ_WRITE_BINARY:
+               return ((fp = _tfopen(file_path, _T("r+b"))) != NULL);
+       case FILEIO_READ_WRITE_NEW_BINARY:
+               return ((fp = _tfopen(file_path, _T("w+b"))) != NULL);
+       case FILEIO_READ_ASCII:
+               return ((fp = _tfopen(file_path, _T("r"))) != NULL);
+       case FILEIO_WRITE_ASCII:
+               return ((fp = _tfopen(file_path, _T("w"))) != NULL);
+       case FILEIO_WRITE_APPEND_ASCII:
+               return ((fp = _tfopen(file_path, _T("a"))) != NULL);
+       case FILEIO_READ_WRITE_ASCII:
+               return ((fp = _tfopen(file_path, _T("r+"))) != NULL);
+       case FILEIO_READ_WRITE_NEW_ASCII:
+               return ((fp = _tfopen(file_path, _T("w+"))) != NULL);
+       case FILEIO_READ_WRITE_APPEND_ASCII:
+               return ((fp = _tfopen(file_path, _T("a+"))) != NULL);
+       }
+       return false;
+}
+
+#ifdef USE_ZLIB
+bool FILEIO::Gzopen(const _TCHAR *file_path, int mode)
+{
+       gz_size = 0;
+       
+       switch(mode) {
+       case FILEIO_READ_BINARY:
+//     case FILEIO_READ_WRITE_BINARY:
+       case FILEIO_READ_ASCII:
+//     case FILEIO_READ_WRITE_ASCII:
+//     case FILEIO_READ_WRITE_APPEND_ASCII:
+               if((fp = _tfopen(file_path, _T("rb"))) != NULL) {
+                       // check gzip header
+                       uint8_t data[10], name[_MAX_PATH] = {0};
+                       fread(data, 10, 1, fp);
+                       if(data[0] == 0x1f && data[1] == 0x8b && data[2] == 0x08) {
                                if(data[3] & 2) {
                                        // skip part number
                                        fseek(fp, 2, SEEK_CUR);
@@ -164,59 +234,40 @@ bool FILEIO::Fopen(const _TCHAR *file_path, int mode)
                                fseek(fp, -4, SEEK_END);
                                fread(data, 4, 1, fp);
                                gz_size = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
-                               fclose(fp);
-                               fp = NULL;
                        }
-                       break;
+                       fclose(fp);
+                       fp = NULL;
                }
-               switch(mode) {
-               case FILEIO_READ_BINARY:
-                       return ((gz = gzopen(file_path, _T("rb"))) != NULL);
-//             case FILEIO_WRITE_BINARY:
-//                     return ((gz = gzopen(file_path, _T("wb"))) != NULL);
-//             case FILEIO_READ_WRITE_BINARY:
-//                     return ((gz = gzopen(file_path, _T("r+b"))) != NULL);
-//             case FILEIO_READ_WRITE_NEW_BINARY:
-//                     return ((gz = gzopen(file_path, _T("w+b"))) != NULL);
-               case FILEIO_READ_ASCII:
-                       return ((gz = gzopen(file_path, _T("r"))) != NULL);
-//             case FILEIO_WRITE_ASCII:
-//                     return ((gz = gzopen(file_path, _T("w"))) != NULL);
-//             case FILEIO_WRITE_APPEND_ASCII:
-//                     return ((gz = gzopen(file_path, _T("a"))) != NULL);
-//             case FILEIO_READ_WRITE_ASCII:
-//                     return ((gz = gzopen(file_path, _T("r+"))) != NULL);
-//             case FILEIO_READ_WRITE_NEW_ASCII:
-//                     return ((gz = gzopen(file_path, _T("w+"))) != NULL);
-//             case FILEIO_READ_WRITE_APPEND_ASCII:
-//                     return ((gz = gzopen(file_path, _T("a+"))) != NULL);
+               if(gz_size == 0) {
+                       return false;
                }
-       } else
-#endif
+               break;
+       }
        switch(mode) {
        case FILEIO_READ_BINARY:
-               return ((fp = _tfopen(file_path, _T("rb"))) != NULL);
+               return ((gz = gzopen(tchar_to_char(file_path), "rb")) != NULL);
        case FILEIO_WRITE_BINARY:
-               return ((fp = _tfopen(file_path, _T("wb"))) != NULL);
-       case FILEIO_READ_WRITE_BINARY:
-               return ((fp = _tfopen(file_path, _T("r+b"))) != NULL);
-       case FILEIO_READ_WRITE_NEW_BINARY:
-               return ((fp = _tfopen(file_path, _T("w+b"))) != NULL);
+               return ((gz = gzopen(tchar_to_char(file_path), "wb")) != NULL);
+//     case FILEIO_READ_WRITE_BINARY:
+//             return ((fp = _tfopen(file_path, _T("r+b"))) != NULL);
+//     case FILEIO_READ_WRITE_NEW_BINARY:
+//             return ((fp = _tfopen(file_path, _T("w+b"))) != NULL);
        case FILEIO_READ_ASCII:
-               return ((fp = _tfopen(file_path, _T("r"))) != NULL);
+               return ((gz = gzopen(tchar_to_char(file_path), "r")) != NULL);
        case FILEIO_WRITE_ASCII:
-               return ((fp = _tfopen(file_path, _T("w"))) != NULL);
-       case FILEIO_WRITE_APPEND_ASCII:
-               return ((fp = _tfopen(file_path, _T("a"))) != NULL);
-       case FILEIO_READ_WRITE_ASCII:
-               return ((fp = _tfopen(file_path, _T("r+"))) != NULL);
-       case FILEIO_READ_WRITE_NEW_ASCII:
-               return ((fp = _tfopen(file_path, _T("w+"))) != NULL);
-       case FILEIO_READ_WRITE_APPEND_ASCII:
-               return ((fp = _tfopen(file_path, _T("a+"))) != NULL);
+               return ((gz = gzopen(tchar_to_char(file_path), "w")) != NULL);
+//     case FILEIO_WRITE_APPEND_ASCII:
+//             return ((fp = _tfopen(file_path, _T("a"))) != NULL);
+//     case FILEIO_READ_WRITE_ASCII:
+//             return ((fp = _tfopen(file_path, _T("r+"))) != NULL);
+//     case FILEIO_READ_WRITE_NEW_ASCII:
+//             return ((fp = _tfopen(file_path, _T("w+"))) != NULL);
+//     case FILEIO_READ_WRITE_APPEND_ASCII:
+//             return ((fp = _tfopen(file_path, _T("a+"))) != NULL);
        }
        return false;
 }
+#endif
 
 void FILEIO::Fclose()
 {
@@ -660,7 +711,13 @@ int FILEIO::Fgetc()
                return gzgetc(gz);
        } else
 #endif
-       return fgetc(fp);
+       {
+               if(fp != NULL) {
+                       return getc(fp);
+               } else {
+                       return 0;
+               }
+       }
 }
 
 int FILEIO::Fputc(int c)
@@ -670,7 +727,13 @@ int FILEIO::Fputc(int c)
                return gzputc(gz, c);
        } else
 #endif
-       return fputc(c, fp);
+       {
+               if(fp != NULL) {
+                       return fputc(c, fp);
+               } else {
+                       return 0;
+               }
+       }
 }
 
 char *FILEIO::Fgets(char *str, int n)
@@ -680,7 +743,31 @@ char *FILEIO::Fgets(char *str, int n)
                return gzgets(gz, str, n);
        } else
 #endif
-       return fgets(str, n, fp);
+       {
+               if(fp != NULL) {
+                       return fgets(str, n, fp);
+               } else {
+                       return 0;
+               }
+       }
+}
+
+_TCHAR *FILEIO::Fgetts(_TCHAR *str, int n)
+{
+#ifdef USE_ZLIB
+       if(gz != NULL) {
+#if defined(_UNICODE) && defined(SUPPORT_TCHAR_TYPE)
+               char *str_mb = (char *)calloc(sizeof(char), n + 1);
+               gzgets(gz, str_mb, n);
+               my_swprintf_s(str, n, L"%s", char_to_wchar(str_mb));
+               free(str_mb);
+               return str;
+#else
+               return gzgets(gz, str, n);
+#endif
+       } else
+#endif
+       return _fgetts(str, n, fp);
 }
 
 int FILEIO::Fprintf(const char* format, ...)
@@ -697,7 +784,30 @@ int FILEIO::Fprintf(const char* format, ...)
                return gzprintf(gz, "%s", buffer);
        } else
 #endif
-       return my_fprintf_s(fp, "%s", buffer);
+       {
+               if(fp != NULL) {
+                       return my_fprintf_s(fp, "%s", buffer);
+               } else {
+                       return 0;
+               }
+       }
+}
+
+int FILEIO::Ftprintf(const _TCHAR* format, ...)
+{
+       va_list ap;
+       _TCHAR buffer[1024];
+       
+       va_start(ap, format);
+       my_vstprintf_s(buffer, 1024, format, ap);
+       va_end(ap);
+       
+#ifdef USE_ZLIB
+       if(gz != NULL) {
+               return gzprintf(gz, "%s", tchar_to_char(buffer));
+       } else
+#endif
+       return my_ftprintf_s(fp, _T("%s"), buffer);
 }
 
 size_t FILEIO::Fread(void* buffer, size_t size, size_t count)
@@ -707,17 +817,29 @@ size_t FILEIO::Fread(void* buffer, size_t size, size_t count)
                return gzfread(buffer, size, count, gz);
        } else
 #endif
-       return fread(buffer, size, count, fp);
+       {
+               if(fp != NULL) {
+                       return fread(buffer, size, count, fp);
+               } else {
+                       return 0;
+               }
+       }
 }
 
-size_t FILEIO::Fwrite(void* buffer, size_t size, size_t count)
+size_t FILEIO::Fwrite(const void* buffer, size_t size, size_t count)
 {
 #ifdef USE_ZLIB
        if(gz != NULL) {
                return gzfwrite(buffer, size, count, gz);
        } else
 #endif
-       return fwrite(buffer, size, count, fp);
+       {
+               if(fp != NULL) {
+                       return fwrite(buffer, size, count, fp);
+               } else {
+                       return 0;
+               }
+       }
 }
 
 int FILEIO::Fseek(long offset, int origin)
@@ -734,13 +856,16 @@ int FILEIO::Fseek(long offset, int origin)
                }
        } else
 #endif
-       switch(origin) {
-       case FILEIO_SEEK_CUR:
-               return fseek(fp, offset, SEEK_CUR);
-       case FILEIO_SEEK_END:
-               return fseek(fp, offset, SEEK_END);
-       case FILEIO_SEEK_SET:
-               return fseek(fp, offset, SEEK_SET);
+       {
+               if(fp == NULL) return -1;
+               switch(origin) {
+               case FILEIO_SEEK_CUR:
+                       return fseek(fp, offset, SEEK_CUR);
+               case FILEIO_SEEK_END:
+                       return fseek(fp, offset, SEEK_END);
+               case FILEIO_SEEK_SET:
+                       return fseek(fp, offset, SEEK_SET);
+               }
        }
        return -1;
 }
@@ -752,6 +877,24 @@ long FILEIO::Ftell()
                return gztell(gz);
        } else
 #endif
-       return ftell(fp);
+       {
+               if(fp != NULL) {
+                       return ftell(fp);
+               } else {
+                       return 0;
+               }
+       }
 }
 
+
+bool FILEIO::Fcompare(const void* buffer, size_t size)
+{
+       bool result = false;
+       void *tmp = malloc(size);
+       
+       if(Fread(tmp, size, 1) == 1) {
+               result = (memcmp(buffer, tmp, size) == 0);
+       }
+       free(tmp);
+       return result;
+}