Exemplo n.º 1
0
// 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);
}
Exemplo n.º 2
0
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;
}