OSDN Git Service

[EMU] Enable to Gzip'ed state saving / loading.
[csp-qt/common_source_project-fm7.git] / source / src / fileio.cpp
index ca33b6b..fd431ae 100644 (file)
@@ -172,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);
@@ -200,80 +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:
-                       {
-                               //memset(path, 0x00, _MAX_PATH);
-                               gz = gzopen(file_path, _T("rb"));
-                               if(gz != NULL) {
-                                       my_tcscpy_s(path, _MAX_PATH, get_file_path_without_extensiton(file_path));
-                                       return true;
-                               } else {
-                                       my_tcscpy_s(path, _MAX_PATH, file_path);
-                                       return false;
-                               }                                       
-                       }
-                       break;
-//             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:
-                       {
-                               gz = gzopen(file_path, _T("r"));
-                               if(gz != NULL) {
-                                       my_tcscpy_s(path, _MAX_PATH, get_file_path_without_extensiton(file_path));
-                                       return true;
-                               } else {
-                                       my_tcscpy_s(path, _MAX_PATH, file_path);
-                                       return false;
-                               }
-                       }
-                       break;
-//             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()
 {
@@ -758,6 +752,24 @@ char *FILEIO::Fgets(char *str, int n)
        }
 }
 
+_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, ...)
 {
        va_list ap;
@@ -781,6 +793,23 @@ int FILEIO::Fprintf(const char* format, ...)
        }
 }
 
+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)
 {
 #ifdef USE_ZLIB
@@ -797,7 +826,7 @@ size_t FILEIO::Fread(void* buffer, size_t size, size_t count)
        }
 }
 
-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) {
@@ -857,3 +886,15 @@ long FILEIO::Ftell()
        }
 }
 
+
+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;
+}