tools/limlzpack: Write CRC header as little-endian on any host

This commit is contained in:
Mintsuki
2026-04-20 17:16:06 +02:00
parent 94912265ec
commit b1c28f00e4

View File

@@ -28,9 +28,60 @@
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
typedef unsigned char byte;
static uint16_t endswap16(uint16_t value) {
uint16_t ret = 0;
ret |= (value >> 8) & 0x00ff;
ret |= (value << 8) & 0xff00;
return ret;
}
static uint32_t endswap32(uint32_t value) {
uint32_t ret = 0;
ret |= (value >> 24) & 0x000000ff;
ret |= (value >> 8) & 0x0000ff00;
ret |= (value << 8) & 0x00ff0000;
ret |= (value << 24) & 0xff000000;
return ret;
}
static uint64_t endswap64(uint64_t value) {
uint64_t ret = 0;
ret |= (value >> 56) & 0x00000000000000ff;
ret |= (value >> 40) & 0x000000000000ff00;
ret |= (value >> 24) & 0x0000000000ff0000;
ret |= (value >> 8) & 0x00000000ff000000;
ret |= (value << 8) & 0x000000ff00000000;
ret |= (value << 24) & 0x0000ff0000000000;
ret |= (value << 40) & 0x00ff000000000000;
ret |= (value << 56) & 0xff00000000000000;
return ret;
}
#ifdef __BYTE_ORDER__
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define bigendian true
#else
#define bigendian false
#endif
#else /* !__BYTE_ORDER__ */
static bool bigendian = false;
#endif /* !__BYTE_ORDER__ */
#define ENDSWAP(VALUE) (bigendian ? ( \
sizeof(VALUE) == 1 ? (VALUE) : \
sizeof(VALUE) == 2 ? endswap16(VALUE) : \
sizeof(VALUE) == 4 ? endswap32(VALUE) : \
sizeof(VALUE) == 8 ? endswap64(VALUE) : (abort(), 1) \
) : (VALUE))
/* Higher -> better compression with exponentally dimnishing gains. */
#define LIMLZ_SA_NEIGHBORS 32
@@ -295,6 +346,11 @@ static uint32_t crc32_nibble(const byte *data, size_t len) {
}
int main(int argc, char *argv[]) {
#ifndef __BYTE_ORDER__
uint32_t endcheck = 0x12345678;
uint8_t endbyte = *((uint8_t *)&endcheck);
bigendian = endbyte == 0x12;
#endif
if (argc != 3) {
fprintf(stderr, "? %s <input> <output>\n", argv[0]); return 1;
}
@@ -318,7 +374,7 @@ int main(int argc, char *argv[]) {
if (!outsz) {
fprintf(stderr, "? limlzpack\n"); return 1;
}
uint32_t crc = crc32_nibble(inbuf, insz);
uint32_t crc = ENDSWAP(crc32_nibble(inbuf, insz));
fwrite(&crc, sizeof(crc), 1, fout);
fwrite(outbuf, 1, outsz, fout);
fclose(fout);