diff options
Diffstat (limited to 'C/Util/Lzma')
| -rw-r--r-- | C/Util/Lzma/LzmaUtil.c | 145 | ||||
| -rw-r--r-- | C/Util/Lzma/LzmaUtil.dsp | 16 | ||||
| -rw-r--r-- | C/Util/Lzma/Precomp.h | 14 |
3 files changed, 116 insertions, 59 deletions
diff --git a/C/Util/Lzma/LzmaUtil.c b/C/Util/Lzma/LzmaUtil.c index 62a5907..b9b974b 100644 --- a/C/Util/Lzma/LzmaUtil.c +++ b/C/Util/Lzma/LzmaUtil.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* LzmaUtil.c -- Test application for LZMA compression | 1 | /* LzmaUtil.c -- Test application for LZMA compression |
| 2 | 2021-11-01 : Igor Pavlov : Public domain */ | 2 | 2023-03-07 : Igor Pavlov : Public domain */ |
| 3 | 3 | ||
| 4 | #include "../../Precomp.h" | 4 | #include "Precomp.h" |
| 5 | 5 | ||
| 6 | #include <stdio.h> | 6 | #include <stdio.h> |
| 7 | #include <stdlib.h> | 7 | #include <stdlib.h> |
| @@ -21,48 +21,80 @@ static const char * const kCantWriteMessage = "Cannot write output file"; | |||
| 21 | static const char * const kCantAllocateMessage = "Cannot allocate memory"; | 21 | static const char * const kCantAllocateMessage = "Cannot allocate memory"; |
| 22 | static const char * const kDataErrorMessage = "Data error"; | 22 | static const char * const kDataErrorMessage = "Data error"; |
| 23 | 23 | ||
| 24 | static void PrintHelp(char *buffer) | 24 | static void Print(const char *s) |
| 25 | { | 25 | { |
| 26 | strcat(buffer, | 26 | fputs(s, stdout); |
| 27 | "\nLZMA-C " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE "\n\n" | ||
| 28 | "Usage: lzma <e|d> inputFile outputFile\n" | ||
| 29 | " e: encode file\n" | ||
| 30 | " d: decode file\n"); | ||
| 31 | } | 27 | } |
| 32 | 28 | ||
| 33 | static int PrintError(char *buffer, const char *message) | 29 | static void PrintHelp(void) |
| 34 | { | 30 | { |
| 35 | strcat(buffer, "\nError: "); | 31 | Print( |
| 36 | strcat(buffer, message); | 32 | "\n" "LZMA-C " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE |
| 37 | strcat(buffer, "\n"); | 33 | "\n" |
| 34 | "\n" "Usage: lzma <e|d> inputFile outputFile" | ||
| 35 | "\n" " e: encode file" | ||
| 36 | "\n" " d: decode file" | ||
| 37 | "\n"); | ||
| 38 | } | ||
| 39 | |||
| 40 | static int PrintError(const char *message) | ||
| 41 | { | ||
| 42 | Print("\nError: "); | ||
| 43 | Print(message); | ||
| 44 | Print("\n"); | ||
| 38 | return 1; | 45 | return 1; |
| 39 | } | 46 | } |
| 40 | 47 | ||
| 41 | static int PrintError_WRes(char *buffer, const char *message, WRes wres) | 48 | #define CONVERT_INT_TO_STR(charType, tempSize) \ |
| 49 | unsigned char temp[tempSize]; unsigned i = 0; \ | ||
| 50 | while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ | ||
| 51 | *s++ = (charType)('0' + (unsigned)val); \ | ||
| 52 | while (i != 0) { i--; *s++ = (charType)temp[i]; } \ | ||
| 53 | *s = 0; \ | ||
| 54 | return s; | ||
| 55 | |||
| 56 | static char * Convert_unsigned_To_str(unsigned val, char *s) | ||
| 42 | { | 57 | { |
| 43 | strcat(buffer, "\nError: "); | 58 | CONVERT_INT_TO_STR(char, 32) |
| 44 | strcat(buffer, message); | 59 | } |
| 45 | sprintf(buffer + strlen(buffer), "\nSystem error code: %d", (unsigned)wres); | 60 | |
| 61 | static void Print_unsigned(unsigned code) | ||
| 62 | { | ||
| 63 | char str[32]; | ||
| 64 | Convert_unsigned_To_str(code, str); | ||
| 65 | Print(str); | ||
| 66 | } | ||
| 67 | |||
| 68 | static int PrintError_WRes(const char *message, WRes wres) | ||
| 69 | { | ||
| 70 | PrintError(message); | ||
| 71 | Print("\nSystem error code: "); | ||
| 72 | Print_unsigned((unsigned)wres); | ||
| 46 | #ifndef _WIN32 | 73 | #ifndef _WIN32 |
| 47 | { | 74 | { |
| 48 | const char *s = strerror(wres); | 75 | const char *s = strerror(wres); |
| 49 | if (s) | 76 | if (s) |
| 50 | sprintf(buffer + strlen(buffer), " : %s", s); | 77 | { |
| 78 | Print(" : "); | ||
| 79 | Print(s); | ||
| 80 | } | ||
| 51 | } | 81 | } |
| 52 | #endif | 82 | #endif |
| 53 | strcat(buffer, "\n"); | 83 | Print("\n"); |
| 54 | return 1; | 84 | return 1; |
| 55 | } | 85 | } |
| 56 | 86 | ||
| 57 | static int PrintErrorNumber(char *buffer, SRes val) | 87 | static int PrintErrorNumber(SRes val) |
| 58 | { | 88 | { |
| 59 | sprintf(buffer + strlen(buffer), "\n7-Zip error code: %d\n", (unsigned)val); | 89 | Print("\n7-Zip error code: "); |
| 90 | Print_unsigned((unsigned)val); | ||
| 91 | Print("\n"); | ||
| 60 | return 1; | 92 | return 1; |
| 61 | } | 93 | } |
| 62 | 94 | ||
| 63 | static int PrintUserError(char *buffer) | 95 | static int PrintUserError(void) |
| 64 | { | 96 | { |
| 65 | return PrintError(buffer, "Incorrect command"); | 97 | return PrintError("Incorrect command"); |
| 66 | } | 98 | } |
| 67 | 99 | ||
| 68 | 100 | ||
| @@ -70,10 +102,10 @@ static int PrintUserError(char *buffer) | |||
| 70 | #define OUT_BUF_SIZE (1 << 16) | 102 | #define OUT_BUF_SIZE (1 << 16) |
| 71 | 103 | ||
| 72 | 104 | ||
| 73 | static SRes Decode2(CLzmaDec *state, ISeqOutStream *outStream, ISeqInStream *inStream, | 105 | static SRes Decode2(CLzmaDec *state, ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream, |
| 74 | UInt64 unpackSize) | 106 | UInt64 unpackSize) |
| 75 | { | 107 | { |
| 76 | int thereIsSize = (unpackSize != (UInt64)(Int64)-1); | 108 | const int thereIsSize = (unpackSize != (UInt64)(Int64)-1); |
| 77 | Byte inBuf[IN_BUF_SIZE]; | 109 | Byte inBuf[IN_BUF_SIZE]; |
| 78 | Byte outBuf[OUT_BUF_SIZE]; | 110 | Byte outBuf[OUT_BUF_SIZE]; |
| 79 | size_t inPos = 0, inSize = 0, outPos = 0; | 111 | size_t inPos = 0, inSize = 0, outPos = 0; |
| @@ -83,7 +115,7 @@ static SRes Decode2(CLzmaDec *state, ISeqOutStream *outStream, ISeqInStream *inS | |||
| 83 | if (inPos == inSize) | 115 | if (inPos == inSize) |
| 84 | { | 116 | { |
| 85 | inSize = IN_BUF_SIZE; | 117 | inSize = IN_BUF_SIZE; |
| 86 | RINOK(inStream->Read(inStream, inBuf, &inSize)); | 118 | RINOK(inStream->Read(inStream, inBuf, &inSize)) |
| 87 | inPos = 0; | 119 | inPos = 0; |
| 88 | } | 120 | } |
| 89 | { | 121 | { |
| @@ -124,7 +156,7 @@ static SRes Decode2(CLzmaDec *state, ISeqOutStream *outStream, ISeqInStream *inS | |||
| 124 | } | 156 | } |
| 125 | 157 | ||
| 126 | 158 | ||
| 127 | static SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream) | 159 | static SRes Decode(ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream) |
| 128 | { | 160 | { |
| 129 | UInt64 unpackSize; | 161 | UInt64 unpackSize; |
| 130 | int i; | 162 | int i; |
| @@ -137,27 +169,29 @@ static SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream) | |||
| 137 | 169 | ||
| 138 | /* Read and parse header */ | 170 | /* Read and parse header */ |
| 139 | 171 | ||
| 140 | RINOK(SeqInStream_Read(inStream, header, sizeof(header))); | 172 | { |
| 141 | 173 | size_t size = sizeof(header); | |
| 174 | RINOK(SeqInStream_ReadMax(inStream, header, &size)) | ||
| 175 | if (size != sizeof(header)) | ||
| 176 | return SZ_ERROR_INPUT_EOF; | ||
| 177 | } | ||
| 142 | unpackSize = 0; | 178 | unpackSize = 0; |
| 143 | for (i = 0; i < 8; i++) | 179 | for (i = 0; i < 8; i++) |
| 144 | unpackSize += (UInt64)header[LZMA_PROPS_SIZE + i] << (i * 8); | 180 | unpackSize += (UInt64)header[LZMA_PROPS_SIZE + i] << (i * 8); |
| 145 | 181 | ||
| 146 | LzmaDec_Construct(&state); | 182 | LzmaDec_CONSTRUCT(&state) |
| 147 | RINOK(LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc)); | 183 | RINOK(LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc)) |
| 148 | res = Decode2(&state, outStream, inStream, unpackSize); | 184 | res = Decode2(&state, outStream, inStream, unpackSize); |
| 149 | LzmaDec_Free(&state, &g_Alloc); | 185 | LzmaDec_Free(&state, &g_Alloc); |
| 150 | return res; | 186 | return res; |
| 151 | } | 187 | } |
| 152 | 188 | ||
| 153 | static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize, char *rs) | 189 | static SRes Encode(ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream, UInt64 fileSize) |
| 154 | { | 190 | { |
| 155 | CLzmaEncHandle enc; | 191 | CLzmaEncHandle enc; |
| 156 | SRes res; | 192 | SRes res; |
| 157 | CLzmaEncProps props; | 193 | CLzmaEncProps props; |
| 158 | 194 | ||
| 159 | UNUSED_VAR(rs); | ||
| 160 | |||
| 161 | enc = LzmaEnc_Create(&g_Alloc); | 195 | enc = LzmaEnc_Create(&g_Alloc); |
| 162 | if (enc == 0) | 196 | if (enc == 0) |
| 163 | return SZ_ERROR_MEM; | 197 | return SZ_ERROR_MEM; |
| @@ -187,7 +221,7 @@ static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 file | |||
| 187 | } | 221 | } |
| 188 | 222 | ||
| 189 | 223 | ||
| 190 | static int main2(int numArgs, const char *args[], char *rs) | 224 | int Z7_CDECL main(int numArgs, const char *args[]) |
| 191 | { | 225 | { |
| 192 | CFileSeqInStream inStream; | 226 | CFileSeqInStream inStream; |
| 193 | CFileOutStream outStream; | 227 | CFileOutStream outStream; |
| @@ -208,29 +242,31 @@ static int main2(int numArgs, const char *args[], char *rs) | |||
| 208 | 242 | ||
| 209 | if (numArgs == 1) | 243 | if (numArgs == 1) |
| 210 | { | 244 | { |
| 211 | PrintHelp(rs); | 245 | PrintHelp(); |
| 212 | return 0; | 246 | return 0; |
| 213 | } | 247 | } |
| 214 | 248 | ||
| 215 | if (numArgs < 3 || numArgs > 4 || strlen(args[1]) != 1) | 249 | if (numArgs < 3 || numArgs > 4 || strlen(args[1]) != 1) |
| 216 | return PrintUserError(rs); | 250 | return PrintUserError(); |
| 217 | 251 | ||
| 218 | c = args[1][0]; | 252 | c = args[1][0]; |
| 219 | encodeMode = (c == 'e' || c == 'E'); | 253 | encodeMode = (c == 'e' || c == 'E'); |
| 220 | if (!encodeMode && c != 'd' && c != 'D') | 254 | if (!encodeMode && c != 'd' && c != 'D') |
| 221 | return PrintUserError(rs); | 255 | return PrintUserError(); |
| 222 | 256 | ||
| 257 | /* | ||
| 223 | { | 258 | { |
| 224 | size_t t4 = sizeof(UInt32); | 259 | size_t t4 = sizeof(UInt32); |
| 225 | size_t t8 = sizeof(UInt64); | 260 | size_t t8 = sizeof(UInt64); |
| 226 | if (t4 != 4 || t8 != 8) | 261 | if (t4 != 4 || t8 != 8) |
| 227 | return PrintError(rs, "Incorrect UInt32 or UInt64"); | 262 | return PrintError("Incorrect UInt32 or UInt64"); |
| 228 | } | 263 | } |
| 264 | */ | ||
| 229 | 265 | ||
| 230 | { | 266 | { |
| 231 | WRes wres = InFile_Open(&inStream.file, args[2]); | 267 | const WRes wres = InFile_Open(&inStream.file, args[2]); |
| 232 | if (wres != 0) | 268 | if (wres != 0) |
| 233 | return PrintError_WRes(rs, "Cannot open input file", wres); | 269 | return PrintError_WRes("Cannot open input file", wres); |
| 234 | } | 270 | } |
| 235 | 271 | ||
| 236 | if (numArgs > 3) | 272 | if (numArgs > 3) |
| @@ -239,18 +275,18 @@ static int main2(int numArgs, const char *args[], char *rs) | |||
| 239 | useOutFile = True; | 275 | useOutFile = True; |
| 240 | wres = OutFile_Open(&outStream.file, args[3]); | 276 | wres = OutFile_Open(&outStream.file, args[3]); |
| 241 | if (wres != 0) | 277 | if (wres != 0) |
| 242 | return PrintError_WRes(rs, "Cannot open output file", wres); | 278 | return PrintError_WRes("Cannot open output file", wres); |
| 243 | } | 279 | } |
| 244 | else if (encodeMode) | 280 | else if (encodeMode) |
| 245 | PrintUserError(rs); | 281 | PrintUserError(); |
| 246 | 282 | ||
| 247 | if (encodeMode) | 283 | if (encodeMode) |
| 248 | { | 284 | { |
| 249 | UInt64 fileSize; | 285 | UInt64 fileSize; |
| 250 | WRes wres = File_GetLength(&inStream.file, &fileSize); | 286 | const WRes wres = File_GetLength(&inStream.file, &fileSize); |
| 251 | if (wres != 0) | 287 | if (wres != 0) |
| 252 | return PrintError_WRes(rs, "Cannot get file length", wres); | 288 | return PrintError_WRes("Cannot get file length", wres); |
| 253 | res = Encode(&outStream.vt, &inStream.vt, fileSize, rs); | 289 | res = Encode(&outStream.vt, &inStream.vt, fileSize); |
| 254 | } | 290 | } |
| 255 | else | 291 | else |
| 256 | { | 292 | { |
| @@ -264,23 +300,14 @@ static int main2(int numArgs, const char *args[], char *rs) | |||
| 264 | if (res != SZ_OK) | 300 | if (res != SZ_OK) |
| 265 | { | 301 | { |
| 266 | if (res == SZ_ERROR_MEM) | 302 | if (res == SZ_ERROR_MEM) |
| 267 | return PrintError(rs, kCantAllocateMessage); | 303 | return PrintError(kCantAllocateMessage); |
| 268 | else if (res == SZ_ERROR_DATA) | 304 | else if (res == SZ_ERROR_DATA) |
| 269 | return PrintError(rs, kDataErrorMessage); | 305 | return PrintError(kDataErrorMessage); |
| 270 | else if (res == SZ_ERROR_WRITE) | 306 | else if (res == SZ_ERROR_WRITE) |
| 271 | return PrintError_WRes(rs, kCantWriteMessage, outStream.wres); | 307 | return PrintError_WRes(kCantWriteMessage, outStream.wres); |
| 272 | else if (res == SZ_ERROR_READ) | 308 | else if (res == SZ_ERROR_READ) |
| 273 | return PrintError_WRes(rs, kCantReadMessage, inStream.wres); | 309 | return PrintError_WRes(kCantReadMessage, inStream.wres); |
| 274 | return PrintErrorNumber(rs, res); | 310 | return PrintErrorNumber(res); |
| 275 | } | 311 | } |
| 276 | return 0; | 312 | return 0; |
| 277 | } | 313 | } |
| 278 | |||
| 279 | |||
| 280 | int MY_CDECL main(int numArgs, const char *args[]) | ||
| 281 | { | ||
| 282 | char rs[1000] = { 0 }; | ||
| 283 | int res = main2(numArgs, args, rs); | ||
| 284 | fputs(rs, stdout); | ||
| 285 | return res; | ||
| 286 | } | ||
diff --git a/C/Util/Lzma/LzmaUtil.dsp b/C/Util/Lzma/LzmaUtil.dsp index 4e38e4a..e2e7d42 100644 --- a/C/Util/Lzma/LzmaUtil.dsp +++ b/C/Util/Lzma/LzmaUtil.dsp | |||
| @@ -106,6 +106,10 @@ SOURCE=..\..\7zVersion.h | |||
| 106 | # End Source File | 106 | # End Source File |
| 107 | # Begin Source File | 107 | # Begin Source File |
| 108 | 108 | ||
| 109 | SOURCE=..\..\7zWindows.h | ||
| 110 | # End Source File | ||
| 111 | # Begin Source File | ||
| 112 | |||
| 109 | SOURCE=..\..\Alloc.c | 113 | SOURCE=..\..\Alloc.c |
| 110 | # End Source File | 114 | # End Source File |
| 111 | # Begin Source File | 115 | # Begin Source File |
| @@ -114,6 +118,10 @@ SOURCE=..\..\Alloc.h | |||
| 114 | # End Source File | 118 | # End Source File |
| 115 | # Begin Source File | 119 | # Begin Source File |
| 116 | 120 | ||
| 121 | SOURCE=..\..\Compiler.h | ||
| 122 | # End Source File | ||
| 123 | # Begin Source File | ||
| 124 | |||
| 117 | SOURCE=..\..\CpuArch.h | 125 | SOURCE=..\..\CpuArch.h |
| 118 | # End Source File | 126 | # End Source File |
| 119 | # Begin Source File | 127 | # Begin Source File |
| @@ -162,6 +170,14 @@ SOURCE=.\LzmaUtil.c | |||
| 162 | # End Source File | 170 | # End Source File |
| 163 | # Begin Source File | 171 | # Begin Source File |
| 164 | 172 | ||
| 173 | SOURCE=..\..\Precomp.h | ||
| 174 | # End Source File | ||
| 175 | # Begin Source File | ||
| 176 | |||
| 177 | SOURCE=.\Precomp.h | ||
| 178 | # End Source File | ||
| 179 | # Begin Source File | ||
| 180 | |||
| 165 | SOURCE=..\..\Threads.c | 181 | SOURCE=..\..\Threads.c |
| 166 | # End Source File | 182 | # End Source File |
| 167 | # Begin Source File | 183 | # Begin Source File |
diff --git a/C/Util/Lzma/Precomp.h b/C/Util/Lzma/Precomp.h new file mode 100644 index 0000000..bc8fa21 --- /dev/null +++ b/C/Util/Lzma/Precomp.h | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | /* Precomp.h -- StdAfx | ||
| 2 | 2023-03-04 : Igor Pavlov : Public domain */ | ||
| 3 | |||
| 4 | #ifndef ZIP7_INC_PRECOMP_H | ||
| 5 | #define ZIP7_INC_PRECOMP_H | ||
| 6 | |||
| 7 | #if defined(_MSC_VER) && _MSC_VER >= 1800 | ||
| 8 | #pragma warning(disable : 4464) // relative include path contains '..' | ||
| 9 | #endif | ||
| 10 | |||
| 11 | #include "../../Compiler.h" | ||
| 12 | #include "../../7zTypes.h" | ||
| 13 | |||
| 14 | #endif | ||
