#include "common/Utils.h"
#include <stdbool.h>
#include <string.h>
int32_t RabbitizerUtils_From2Complement(uint32_t number, int bits) {
bool isNegative = number & (1ULL << (bits - 1));
if (isNegative) {
return -((~number + 1) & ((1ULL << bits) - 1));
}
return number;
}
size_t RabbitizerUtils_CharFill(char *dst, int count, char fillchar) {
if (count <= 0) {
return 0;
}
memset(dst, fillchar, count);
return count;
}
size_t RabbitizerUtils_escapeString(char *dst, size_t dstSize, const char *src, size_t srcSize) {
size_t srcPos = 0;
size_t dstpos = 0;
for (; srcPos < srcSize && dstpos < dstSize; srcPos++, src++) {
switch (*src) {
case '\a':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'a');
break;
case '\t':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 't');
break;
case '\n':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'n');
break;
case '\f':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'f');
break;
case '\r':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, 'r');
break;
case '"':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '"');
break;
case '\\':
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, '\\');
break;
default:
RABUTILS_BUFFER_WRITE_CHAR(dst, dstpos, *src);
break;
}
}
return dstpos;
}
uint32_t RabbitizerUtils_floatRepr_32From16(uint16_t arg) {
uint32_t ret;
int32_t sign;
int32_t encodedExponent;
int32_t realExponent;
bool mantissaIsZero;
ret = 0;
sign = arg >> 15;
if ((arg & ~(1ULL << 15)) == 0) {
ret |= (sign << 31);
return ret;
}
arg &= ~(1ULL << 15);
encodedExponent = arg >> 10;
arg &= ~0x7C00ULL;
realExponent = encodedExponent - 0xF;
mantissaIsZero = (arg == 0);
if (encodedExponent == 0) {
ret |= ((uint32_t)sign) << 31;
ret |= arg >> (23 - 10);
return ret;
}
if (encodedExponent == 0x1F) {
ret |= ((uint32_t)sign) << 31;
ret |= 0x7F800000ULL;
if (!mantissaIsZero) {
ret |= arg << (23 - 10);
}
return ret;
}
ret |= ((uint32_t)sign) << 31;
ret |= ((uint32_t)(realExponent + 0x7F)) << 23;
ret |= arg << (23 - 10);
return ret;
}