view mercurial/bitmanipulation.h @ 48873:c95e5ba4de1e stable

run-tests: also send a message in the Keyboard interrupt case The next patch will do something equivalent, so lets do the change in an independant changeset first in case we need to bisect something in the future.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 24 May 2022 09:36:40 +0200
parents d86908050375
children
line wrap: on
line source

#ifndef HG_BITMANIPULATION_H
#define HG_BITMANIPULATION_H

#include <string.h>

#include "compat.h"

/* Reads a 64 bit integer from big-endian bytes. Assumes that the data is long
 enough */
static inline uint64_t getbe64(const char *c)
{
	const unsigned char *d = (const unsigned char *)c;

	return ((((uint64_t)d[0]) << 56) | (((uint64_t)d[1]) << 48) |
	        (((uint64_t)d[2]) << 40) | (((uint64_t)d[3]) << 32) |
	        (((uint64_t)d[4]) << 24) | (((uint64_t)d[5]) << 16) |
	        (((uint64_t)d[6]) << 8) | (d[7]));
}

static inline uint32_t getbe32(const char *c)
{
	const unsigned char *d = (const unsigned char *)c;

	return ((((uint32_t)d[0]) << 24) | (((uint32_t)d[1]) << 16) |
	        (((uint32_t)d[2]) << 8) | (d[3]));
}

static inline int16_t getbeint16(const char *c)
{
	const unsigned char *d = (const unsigned char *)c;

	return ((d[0] << 8) | (d[1]));
}

static inline uint16_t getbeuint16(const char *c)
{
	const unsigned char *d = (const unsigned char *)c;

	return ((d[0] << 8) | (d[1]));
}

/* Writes a 64 bit integer to bytes in a big-endian format.
 Assumes that the buffer is long enough */
static inline void putbe64(uint64_t x, char *c)
{
	c[0] = (x >> 56) & 0xff;
	c[1] = (x >> 48) & 0xff;
	c[2] = (x >> 40) & 0xff;
	c[3] = (x >> 32) & 0xff;
	c[4] = (x >> 24) & 0xff;
	c[5] = (x >> 16) & 0xff;
	c[6] = (x >> 8) & 0xff;
	c[7] = (x)&0xff;
}

static inline void putbe32(uint32_t x, char *c)
{
	c[0] = (x >> 24) & 0xff;
	c[1] = (x >> 16) & 0xff;
	c[2] = (x >> 8) & 0xff;
	c[3] = (x)&0xff;
}

static inline double getbefloat64(const char *c)
{
	const unsigned char *d = (const unsigned char *)c;
	double ret;
	int i;
	uint64_t t = 0;
	for (i = 0; i < 8; i++) {
		t = (t << 8) + d[i];
	}
	memcpy(&ret, &t, sizeof(t));
	return ret;
}

#endif