edit to C++20, etc..
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#include <cstdio>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
@@ -17,46 +17,25 @@ int main()
|
||||
std::printf("==================== Hello Zip! ====================\r\n");
|
||||
int iRet = 0;
|
||||
|
||||
// Zip Format define check
|
||||
// 생성자를 만들어서, 생성되면서 사이즈 검사?
|
||||
|
||||
size_t iSizeTest = sizeof(LocalFileHeader);
|
||||
if (LOCAL_FILE_HEADER_BYTE != iSizeTest)
|
||||
{
|
||||
std::printf("1 Wrong Header Size : %zu / %d \r\n", iSizeTest, LOCAL_FILE_HEADER_BYTE);
|
||||
iRet = -1;
|
||||
}
|
||||
iSizeTest = sizeof(CentralDirectory);
|
||||
if (CENTRAL_DIRECTORY_BYTE != iSizeTest)
|
||||
{
|
||||
std::printf("2 Wrong Header Size : %zu / %d \r\n", iSizeTest, CENTRAL_DIRECTORY_BYTE);
|
||||
iRet = -1;
|
||||
}
|
||||
iSizeTest = sizeof(EoCDRecord);
|
||||
if (EOCD_BYTE != iSizeTest)
|
||||
{
|
||||
std::printf("3 Wrong Header Size : %zu / %d \r\n", iSizeTest, EOCD_BYTE);
|
||||
iRet = -1;
|
||||
}
|
||||
|
||||
// Main Zip archive method
|
||||
if (iRet != -1)
|
||||
if(!ZipArchiver())
|
||||
{
|
||||
if(!ZipArchiver())
|
||||
{
|
||||
iRet = -1;
|
||||
}
|
||||
iRet = -1;
|
||||
std::printf("[ ERROR ] Somthing went Wrong... \r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
std::printf("==================== Good Bye Zip! ====================\r\n");
|
||||
}
|
||||
|
||||
std::printf("==================== Good Bye Zip! ====================\r\n");
|
||||
return iRet;
|
||||
}
|
||||
|
||||
bool ZipArchiver()
|
||||
{
|
||||
LocalFileHeader LFHeader = {};
|
||||
CentralDirectory CentDir = {};
|
||||
EoCDRecord EOCDR = {};
|
||||
LocalFileHeader LFHeader{};
|
||||
CentralDirectory CentDir{};
|
||||
EoCDRecord EOCDR{};
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -77,6 +56,7 @@ bool ZipArchiver()
|
||||
|
||||
// TODO : Buffering 으로 구현. 현재는 파일 통짜로 읽음.
|
||||
// 메모리 할당
|
||||
// TODO : 자동으로 free 되는 구조로 변경
|
||||
auto pFile = (char *)malloc(fileInSize);
|
||||
|
||||
// Read
|
||||
@@ -117,7 +97,7 @@ bool ZipArchiver()
|
||||
CentDir.sizeOfCompressed = CentDir.sizeOfUncompressed;
|
||||
|
||||
// Put File name length
|
||||
uint16_t fileNameLeng = strlen(INPUT_FILE_NAME);
|
||||
uint16_t fileNameLeng = static_cast<uint16_t>(strlen(INPUT_FILE_NAME));
|
||||
LFHeader.lengthOfFileName = fileNameLeng;
|
||||
CentDir.lengthOfFileName = fileNameLeng;
|
||||
|
||||
@@ -153,8 +133,10 @@ bool ZipArchiver()
|
||||
else
|
||||
{
|
||||
// 1. Local File Header, file name (var), extra field (var)
|
||||
CentDir.offsetLocalFileHeader = fileOut.tellp();
|
||||
CentDir.offsetLocalFileHeader = static_cast<uint32_t>(fileOut.tellp());
|
||||
// TODO : sizeof 의 값이 스펙과 정확히 일치한다는 보장 필요 (현재는 compiler 에 종속적)
|
||||
// : offsetof((LocalFileHeader, crc32) 으로 멤버별 static_assert 로 변경할 지 고민.
|
||||
// : 아니면 필드 단위 직접쓰기로 struct 분해하기?
|
||||
fileOut.write(reinterpret_cast<const char*>(&LFHeader), sizeof(LFHeader));
|
||||
fileOut.write(INPUT_FILE_NAME, LFHeader.lengthOfFileName);
|
||||
//fileOut.write(NOT_USED, LFHeader.LFHeader.lengthOfExtraField);
|
||||
@@ -163,7 +145,7 @@ bool ZipArchiver()
|
||||
fileOut.write(pFile, fileInSize);
|
||||
|
||||
// 3. CentralDirectory, file name (var)
|
||||
EOCDR.offsetCentralDir = fileOut.tellp();
|
||||
EOCDR.offsetCentralDir = static_cast<uint32_t>(fileOut.tellp());
|
||||
// TODO : sizeof 의 값이 스펙과 정확히 일치한다는 보장 필요 (현재는 compiler 에 종속적)
|
||||
fileOut.write(reinterpret_cast<const char*>(&CentDir), sizeof(CentDir));
|
||||
fileOut.write(INPUT_FILE_NAME, CentDir.lengthOfFileName);
|
||||
|
||||
Reference in New Issue
Block a user