Newer
Older
vvd / src / utils.c
@dd86k dd86k on 9 Nov 2019 2 KB INIT
#include <stdio.h>
#include <stdlib.h>	// atof
#include <string.h>
#include "utils.h"

void fbins(uint64_t n, char *buf) { // Lazy code 2.0, sorry
	float f = n;
	char *fs;
	if (f >= TB) {
		fs = "%.2f TiB";
		f /= TB;
	} else if (f >= GB) {
		fs = "%.2f GiB";
		f /= GB;
	} else if (f >= MB) {
		fs = "%.1f MiB";
		f /= MB;
	} else if (f >= KB) {
		fs = "%.1f KiB";
		f /= KB;
	} else
		fs = "%g B";
	snprintf(buf, 16, fs, f);
}

int sbinf(_vchar *input, uint64_t *size) {
	float f;
	char c;
#ifdef _WIN32
	if (swscanf(input, L"%f%c", &f, &c) != 2) {
		return 1;
	}
#else
	if (sscanf(input, "%f%c", &f, &c) != 2) {
		return 1;
	}
#endif
	if (f <= 0) return 2;
	uint64_t u;
	switch (c) {
	case 'T': case 't':
		u = f * 1099511627776; break;
	case 'G': case 'g':
		u = f * 1073741824; break;
	case 'M': case 'm':
		u = f * 1048576; break;
	case 'K': case 'k':
		u = f * 1024; break;
	case 'B': case 'b':
		u = f; break;
	default: return 3;
	}
	*size = u;
	return 0;
}

uint16_t bswap16(uint16_t s) {
	return s >> 8 | s << 8;
}

uint32_t bswap32(uint32_t s) {
	return	(s & 0x000000ff) << 24 | (s & 0x0000ff00) <<  8 |
		(s & 0x00ff0000) >>  8 | (s & 0xff000000) >> 24;
}

uint64_t bswap64(uint64_t s) {
	uint32_t *p = (uint32_t*)&s;
	return (uint64_t)bswap32(p[0]) << 32 | (uint64_t)bswap32(p[1]);
}

void print_a(char *p, uint8_t *a, size_t s) {
	size_t i = 0;
	printl(p);
	while (--s)
		printf(" %02X", a[i++]);
	putchar('\n');
}

int extcmp(_vchar *s1, const _vchar *s2) {
#ifdef _WIN32
	wchar_t *ext = wcsrchr(s1, '.');
	if (ext == NULL) // Not found
		return 0;
	++ext;
	if (*ext == 0) // Return if no characters after '.'
		return 0;
	return wcscmp(ext, s2) == 0;
#else
	const char *ext = strrchr(s1, '.');
	if (ext == NULL) // Not found
		return 0;
	++ext;
	if (*ext == 0) // Return if no characters after '.'
		return 0;
	return strcmp(ext, s2) == 0;
#endif
}

void printl(const char *s) {
	fputs(s, stdout);
}

int pow2(int n) {
	return (n & (n - 1)) == 0;
}

void wstra(char16 *src, char *dest, int dsize) {
	size_t bi = 0; // buffer index
	if (src[bi] == 0) {
		strcpy(dest, "<NO NAME>");
		return;
	}
	--dsize; // to include null byte later on
	while (bi < dsize && src[bi]) {
		if (src[bi] >= 0x20 && src[bi] <= 0x7E)
			dest[bi] = (char)src[bi];
		else
			dest[bi] = '?';
		++bi;
	}
	dest[bi] = 0;
}