packages feed

clickhouse-haskell-0.1.1.0: src/Database/ClickHouseDriver/CBits/varuint.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "varuint.h"

/**
 *Encode integer using LEB128
 */

const char *write_varint(u_int16_t number)
{
	char *ostr = malloc(sizeof(char) *32);
	char *ptr = ostr;
	memset(ostr, '\0', sizeof(char) *32);
	for (size_t i = 0; i < 9; ++i)
	{
		u_int8_t byte = number &0x7F;
		if (number > 0x7F)
			byte |= 0x80;
		*ptr = byte;
		++ptr;

		number >>= 7;
		if (!number)
			return ostr;
	}
	return ostr;
}

u_int16_t read_varint(u_int16_t cont,char *istr, size_t size)
{
	const char *end = istr + size;
	int byte;
	for (size_t i = 0; i < 9; ++i)
	{
		if(istr == end){
			break;
		}
		byte = *istr;
		++istr;
		cont |= (byte & 0x7F) << (7 *i);
		if (!(byte & 0x80))
			break;
	}
	return cont;
}

size_t count_read(char *istr, size_t size)
{
	const char *end = istr + size;
	size_t n = 0;
	int byte;
	for (size_t i = 0; i < 9; ++i)
	{
		if (istr == end){
			return 0;
		}
		byte = *istr;
		++istr;
		++n;
		if (!(byte & 0x80))
			break;
	}
	return n;
}