Commit 5981641a authored by Daniel Friesel's avatar Daniel Friesel
Browse files

correctly encode and decode integers

parent e1058170
Loading
Loading
Loading
Loading
+30 −29
Original line number Diff line number Diff line
#include "lib/xdr.h"


void XDRWriter::put(uint32_t number)
{
	*buffer++ = ((number >> 24) & 0xffU);
@@ -69,30 +68,38 @@ void XDRWriter::put(double number)
	put(v.i);
}

void XDRWriter::put(char const *data){
	if (!is_fixed_length) {
void XDRWriter::put(char const *data)
{
	if (!is_fixed_length)
	{
		put(next_array_len);
	}
	uint32_t i;
	for (i = 0; i < next_array_len; i++) {
	for (i = 0; i < next_array_len; i++)
	{
		*buffer++ = data[i];
	}
	while ((i++) % 4 != 0){
	while ((i++) % 4 != 0)
	{
		*buffer++ = 0;
	}
	pos += i;
}

template <uint32_t TSize>
void XDRWriter::put(char const (&data)[TSize]){
	if (!is_fixed_length) {
void XDRWriter::put(char const (&data)[TSize])
{
	if (!is_fixed_length)
	{
		put(TSize);
	}
	uint32_t i;
	for (i = 0; i < TSize; i++) {
	for (i = 0; i < TSize; i++)
	{
		*buffer++ = data[i];
	}
	while ((i++) % 4 != 0){
	while ((i++) % 4 != 0)
	{
		*buffer++ = 0;
	}
	pos += i;
@@ -100,37 +107,28 @@ void XDRWriter::put(char const (&data)[TSize]){

uint32_t XDRReader::get_uint32()
{
	uint32_t ret = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
	uint32_t ret = (((uint32_t)data[pos] & 0xffU) << 24) | (((uint32_t)data[pos + 1] & 0xffU) << 16) | (((uint32_t)data[pos + 2] & 0xffU) << 8) | ((uint32_t)data[pos + 3] & 0xffU);
	pos += 4;
	return ret;
}

int32_t XDRReader::get_int32()
{
	int32_t ret = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
	int32_t ret = (((int32_t)data[pos] & 0xff) << 24) | (((int32_t)data[pos + 1] & 0xff) << 16) | (((int32_t)data[pos + 2] & 0xff) << 8) | ((int32_t)data[pos + 3] & 0xff);
	pos += 4;
	return ret;
}

uint64_t XDRReader::get_uint64()
{
	uint64_t ret0 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
	pos += 4;
	uint64_t ret1 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
	pos += 4;
	return (ret0 << 32) | ret1;
	uint64_t ret = (((uint64_t)data[pos] & 0xffU) << 56) | (((uint64_t)data[pos + 1] & 0xffU) << 48) | (((uint64_t)data[pos + 2] & 0xffU) << 40) | (((uint64_t)data[pos + 3] & 0xffU) << 32) | (((uint64_t)data[pos + 4] & 0xffU) << 24) | (((uint64_t)data[pos + 5] & 0xffU) << 16) | (((uint64_t)data[pos + 6] & 0xffU) << 8) | ((uint64_t)data[pos + 7] & 0xffU);
	return ret;
}

int64_t XDRReader::get_int64()
{
	int64_t ret0 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
	pos += 4;
	int64_t ret1 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
	pos += 4;
	return (ret0 << 32) | ret1;
	int64_t ret = (((int64_t)data[pos] & 0xff) << 56) | (((int64_t)data[pos + 1] & 0xff) << 48) | (((int64_t)data[pos + 2] & 0xff) << 40) | (((int64_t)data[pos + 3] & 0xff) << 32) | (((int64_t)data[pos + 4] & 0xff) << 24) | (((int64_t)data[pos + 5] & 0xff) << 16) | (((int64_t)data[pos + 6] & 0xff) << 8) | ((int64_t)data[pos + 7] & 0xff);
	return ret;
}

float XDRReader::get_float()
@@ -166,7 +164,8 @@ char *XDRReader::get_opaque(uint32_t length)
{
	char *ret = data + pos;
	pos += length;
	if (length % 4) {
	if (length % 4)
	{
		pos += 4 - (length % 4);
	}
	return ret;
@@ -176,12 +175,14 @@ void XDRReader::get_string(char* target)
{
	uint16_t length = get_opaque_length();
	uint16_t i;
	for (i = 0; i < length; i++) {
	for (i = 0; i < length; i++)
	{
		target[i] = data[pos + i];
	}
	target[i] = 0;
	pos += length;
	if (length % 4) {
	if (length % 4)
	{
		pos += 4 - (length % 4);
	}
}
+32 −30
Original line number Diff line number Diff line
@@ -82,30 +82,38 @@ void XDRWriter::put(double number)
	put(v.i);
}

void XDRWriter::put(char const *data){
	if (!is_fixed_length) {
void XDRWriter::put(char const *data)
{
	if (!is_fixed_length)
	{
		put(next_array_len);
	}
	uint16_t i;
	for (i = 0; i < next_array_len; i++) {
	for (i = 0; i < next_array_len; i++)
	{
		*buffer++ = data[i];
	}
	while ((i++) % 2 != 0){
	while ((i++) % 2 != 0)
	{
		*buffer++ = 0;
	}
	pos += i;
}

template <uint16_t TSize>
void XDRWriter::put(char const (&data)[TSize]){
	if (!is_fixed_length) {
void XDRWriter::put(char const (&data)[TSize])
{
	if (!is_fixed_length)
	{
		put(TSize);
	}
	uint16_t i;
	for (i = 0; i < TSize; i++) {
	for (i = 0; i < TSize; i++)
	{
		*buffer++ = data[i];
	}
	while ((i++) % 2 != 0){
	while ((i++) % 2 != 0)
	{
		*buffer++ = 0;
	}
	pos += i;
@@ -113,51 +121,42 @@ void XDRWriter::put(char const (&data)[TSize]){

uint16_t XDRReader::get_uint16()
{
	uint16_t ret = ((uint8_t)data[pos]<<8) | (uint8_t)data[pos+1];
	uint16_t ret = (((uint16_t)data[pos] & 0xffU) << 8) | ((uint16_t)data[pos + 1] & 0xffU);
	pos += 2;
	return ret;
}

int16_t XDRReader::get_int16()
{
	int16_t ret = (data[pos]<<8) | data[pos+1];
	int16_t ret = (((int16_t)data[pos] & 0xff) << 8) | ((int16_t)data[pos + 1] & 0xff);
	pos += 2;
	return ret;
}

uint32_t XDRReader::get_uint32()
{
	uint32_t ret = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
	uint32_t ret = (((uint32_t)data[pos] & 0xffU) << 24) | (((uint32_t)data[pos + 1] & 0xffU) << 16) | (((uint32_t)data[pos + 2] & 0xffU) << 8) | ((uint32_t)data[pos + 3] & 0xffU);
	pos += 4;
	return ret;
}

int32_t XDRReader::get_int32()
{
	int32_t ret = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
	int32_t ret = (((int32_t)data[pos] & 0xff) << 24) | (((int32_t)data[pos + 1] & 0xff) << 16) | (((int32_t)data[pos + 2] & 0xff) << 8) | ((int32_t)data[pos + 3] & 0xff);
	pos += 4;
	return ret;
}

uint64_t XDRReader::get_uint64()
{
	uint64_t ret0 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
	pos += 4;
	uint64_t ret1 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
	pos += 4;
	return (ret0 << 32) | ret1;
	uint64_t ret = (((uint64_t)data[pos] & 0xffU) << 56) | (((uint64_t)data[pos + 1] & 0xffU) << 48) | (((uint64_t)data[pos + 2] & 0xffU) << 40) | (((uint64_t)data[pos + 3] & 0xffU) << 32) | (((uint64_t)data[pos + 4] & 0xffU) << 24) | (((uint64_t)data[pos + 5] & 0xffU) << 16) | (((uint64_t)data[pos + 6] & 0xffU) << 8) | ((uint64_t)data[pos + 7] & 0xffU);
	return ret;
}

int64_t XDRReader::get_int64()
{
	int64_t ret0 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
	pos += 4;
	int64_t ret1 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
	pos += 4;
	return (ret0 << 32) | ret1;
	int64_t ret = (((int64_t)data[pos] & 0xff) << 56) | (((int64_t)data[pos + 1] & 0xff) << 48) | (((int64_t)data[pos + 2] & 0xff) << 40) | (((int64_t)data[pos + 3] & 0xff) << 32) | (((int64_t)data[pos + 4] & 0xff) << 24) | (((int64_t)data[pos + 5] & 0xff) << 16) | (((int64_t)data[pos + 6] & 0xff) << 8) | ((int64_t)data[pos + 7] & 0xff);
	return ret;
}

float XDRReader::get_float()
@@ -193,7 +192,8 @@ char *XDRReader::get_opaque(uint32_t length)
{
	char *ret = data + pos;
	pos += length;
	if (length % 2) {
	if (length % 2)
	{
		pos += 2 - (length % 2);
	}
	return ret;
@@ -203,12 +203,14 @@ void XDRReader::get_string(char* target)
{
	uint16_t length = get_opaque_length();
	uint16_t i;
	for (i = 0; i < length; i++) {
	for (i = 0; i < length; i++)
	{
		target[i] = data[pos + i];
	}
	target[i] = 0;
	pos += length;
	if (length % 2) {
	if (length % 2)
	{
		pos += 2 - (length % 2);
	}
}