| 1035 | } |
| 1036 | |
| 1037 | int STORMAPI SCompDecompress2(void * pvOutBuffer, int * pcbOutBuffer, void * pvInBuffer, int cbInBuffer) |
| 1038 | { |
| 1039 | DECOMPRESS pfnDecompress1 = NULL; |
| 1040 | DECOMPRESS pfnDecompress2 = NULL; |
| 1041 | unsigned char * pbWorkBuffer = (unsigned char *)pvOutBuffer; |
| 1042 | unsigned char * pbInBuffer = (unsigned char *)pvInBuffer; |
| 1043 | int cbWorkBuffer = *pcbOutBuffer; |
| 1044 | int nResult; |
| 1045 | char CompressionMethod; |
| 1046 | |
| 1047 | // Verify buffer sizes |
| 1048 | if(*pcbOutBuffer < cbInBuffer || cbInBuffer < 1) |
| 1049 | return 0; |
| 1050 | |
| 1051 | // If the outputbuffer is as big as input buffer, just copy the block |
| 1052 | if(*pcbOutBuffer == cbInBuffer) |
| 1053 | { |
| 1054 | if(pvOutBuffer != pvInBuffer) |
| 1055 | memcpy(pvOutBuffer, pvInBuffer, cbInBuffer); |
| 1056 | return 1; |
| 1057 | } |
| 1058 | |
| 1059 | // Get the compression methods |
| 1060 | CompressionMethod = *pbInBuffer++; |
| 1061 | cbInBuffer--; |
| 1062 | |
| 1063 | // We only recognize a fixed set of compression methods |
| 1064 | switch((unsigned char)CompressionMethod) |
| 1065 | { |
| 1066 | #ifdef FULL |
| 1067 | case MPQ_COMPRESSION_ZLIB: |
| 1068 | pfnDecompress1 = Decompress_ZLIB; |
| 1069 | break; |
| 1070 | #endif |
| 1071 | |
| 1072 | case MPQ_COMPRESSION_PKWARE: |
| 1073 | pfnDecompress1 = Decompress_PKLIB; |
| 1074 | break; |
| 1075 | |
| 1076 | #ifdef FULL |
| 1077 | case MPQ_COMPRESSION_BZIP2: |
| 1078 | pfnDecompress1 = Decompress_BZIP2; |
| 1079 | break; |
| 1080 | |
| 1081 | case MPQ_COMPRESSION_LZMA: |
| 1082 | pfnDecompress1 = Decompress_LZMA; |
| 1083 | break; |
| 1084 | |
| 1085 | case MPQ_COMPRESSION_SPARSE: |
| 1086 | pfnDecompress1 = Decompress_SPARSE; |
| 1087 | break; |
| 1088 | |
| 1089 | case (MPQ_COMPRESSION_SPARSE | MPQ_COMPRESSION_ZLIB): |
| 1090 | pfnDecompress1 = Decompress_ZLIB; |
| 1091 | pfnDecompress2 = Decompress_SPARSE; |
| 1092 | break; |
| 1093 | |
| 1094 | case (MPQ_COMPRESSION_SPARSE | MPQ_COMPRESSION_BZIP2): |
no test coverage detected