// Returns a pretty factional byte size string for given input size LPCSTR byteSizeString(UINT64 bytes) { static const UINT64 KILLOBYTE = 1024; static const UINT64 MEGABYTE = (KILLOBYTE * 1024); // 1048576 static const UINT64 GIGABYTE = (MEGABYTE * 1024); // 1073741824 static const UINT64 TERABYTE = (GIGABYTE * 1024); // 1099511627776 #define BYTESTR(_Size, _Suffix) \ { \ double fSize = ((double) bytes / (double) _Size); \ double fIntegral; double fFractional = modf(fSize, &fIntegral); \ if(fFractional > 0.05) \ _snprintf(buffer, SIZESTR(buffer), ("%.1f " ## _Suffix), fSize); \ else \ _snprintf(buffer, SIZESTR(buffer), ("%.0f " ## _Suffix), fIntegral); \ } static char buffer[32]; ZeroMemory(buffer, sizeof(buffer)); if (bytes >= TERABYTE) BYTESTR(TERABYTE, "TB") else if (bytes >= GIGABYTE) BYTESTR(GIGABYTE, "GB") else if (bytes >= MEGABYTE) BYTESTR(MEGABYTE, "MB") else if (bytes >= KILLOBYTE) BYTESTR(KILLOBYTE, "KB") else _snprintf(buffer, SIZESTR(buffer), "%u byte%c", bytes, (bytes == 1) ? 0 : 's'); return(buffer); }
int archive_write_header(int fd, tArchiveFile *files, int numFiles) { int i, ret = 0; char *name = NULL; unsigned char dataByte[1] = { 0 }, dataWord[2] = { 0 }; unsigned char data32[4] = { 0 }, data64[8] = { 0 }; write(fd, SIGNATURE, sizeof(SIGNATURE)); ret = sizeof(SIGNATURE); WORDSTR(dataWord, ARCHIVER_VERSION); write(fd, dataWord, sizeof(dataWord)); ret += sizeof(dataWord); /* Extra header size */ WORDSTR(dataWord, 0); write(fd, dataWord, sizeof(dataWord)); ret += sizeof(dataWord); WORDSTR(dataWord, numFiles); write(fd, dataWord, sizeof(dataWord)); ret += sizeof(dataWord); WORDSTR(dataWord, 0x0000); write(fd, dataWord, sizeof(dataWord)); ret += sizeof(dataWord); for (i = 0; i < numFiles; i++) { BYTESTR(dataByte, strlen(files[i].name)); write(fd, dataByte, sizeof(dataByte)); ret += sizeof(dataByte); name = strdup( basename(files[i].name) ); write(fd, name, strlen(name)); ret += strlen(name); free(name); UINT32STR(data32, files[i].crc); write(fd, data32, sizeof(data32)); ret += sizeof(data32); UINT64STR(data64, files[i].size); write(fd, data64, sizeof(data64)); ret += sizeof(data64); UINT64STR(data64, files[i].compressed_size); write(fd, data64, sizeof(data64)); ret += sizeof(data64); BYTESTR(dataByte, files[i].encrypted ? 1 : 0); write(fd, dataByte, sizeof(dataByte)); ret += sizeof(dataByte); WORDSTR(dataWord, 0x4e45); write(fd, dataWord, sizeof(dataWord)); ret += sizeof(dataWord); } WORDSTR(dataWord, 0x4e46); write(fd, dataWord, sizeof(dataWord)); ret += sizeof(dataWord); return ret; }