35 # define HUGE_VAL HUGE
42 #if BINIO_ENABLE_STRING
44 #define STRINGBUFSIZE 256
68 if(
sizeof(
float) == 4 &&
sizeof(double) == 8)
72 if(dat[0] == 0x40 && dat[1] == 0xD0 && !dat[2] && !dat[3])
77 if(dat[3] == 0x40 && dat[2] == 0xD0 && !dat[1] && !dat[0])
86 : my_flags(system_flags), err(NoError)
104 return (
my_flags & f ?
true :
false);
117 return (
err &
Eof ?
true :
false);
136 if(size >
sizeof(
Int)) {
138 throw runtime_error (
"The size of the integer to be read exceeds our system's biggest type");
142 for(i = 0; i < size; i++) {
167 case Single: size = 4;
break;
168 case Double: size = 8;
break;
177 if (!
swap && ((size ==
sizeof (
float)) || (size ==
sizeof (
double))))
182 getRaw ((
char *)&f, size);
188 getRaw ((
char *)&d, size);
195 for(i = 0; i < size; i++)
204 case Single:
return *(
float *)in;
205 case Double:
return *(
double *)in;
222 signed int sign = data[0] >> 7 ? -1 : 1;
223 unsigned int exp = ((data[0] << 1) & 0xff) | ((data[1] >> 7) & 1),
224 fracthi7 = data[1] & 0x7f;
225 Float fract = fracthi7 * 65536.0 + data[2] * 256.0 + data[3];
228 if(!exp && !fracthi7 && !data[2] && !data[3])
return sign * 0.0;
233 if(!fracthi7 && !data[2] && !data[3])
239 if(
sign == -1)
return -1.0;
else return 1.0;
253 return sign * pow(2, -126.) * fract * pow(2, -23.);
255 return sign * pow(2, exp - 127.) * (fract * pow(2, -23.) + 1);
262 signed int sign = data[0] >> 7 ? -1 : 1;
263 unsigned int exp = ((
unsigned int)(data[0] & 0x7f) << 4) | (data[1] >> 4),
264 fracthi4 = data[1] & 0xf;
265 Float fract = fracthi4 * pow(2, 48.) + data[2] * pow(2, 40.) + data[3] *
266 pow(2, 32.) + data[4] * pow(2, 24.) + data[5] * pow(2, 16.) + data[6] *
267 pow(2, 8.) + data[7];
270 if(!exp && !fracthi4 && !data[2] && !data[3] && !data[4] && !data[5] &&
271 !data[6] && !data[7])
return sign * 0.0;
276 if(!fracthi4 && !data[2] && !data[3] && !data[4] && !data[5] && !data[6] &&
283 if(
sign == -1)
return -1.0;
else return 1.0;
297 return sign * pow(2, -1022.) * fract * pow(2, -52.);
299 return sign * pow(2, exp - 1023.) * (fract * pow(2, -52.) + 1);
316 for(i = 1; i < (exp < 0 ? -exp : exp); i++)
319 if(exp < 0) val = 1.0 / val;
329 for(i = 0; i < maxlen; i++) {
331 if(
err) { str[i] =
'\0';
return i; }
342 for(i = 0; i < maxlen; i++) {
344 if(str[i] == delim ||
err) { str[i] =
'\0';
return i; }
351 #if BINIO_ENABLE_STRING
360 tempstr.append(buf, read);
402 for(i = 0; i < amount; i++)
421 if(size >
sizeof(
Int)) {
423 throw runtime_error (
"The size of the integer to be stored exceeds our system's biggest type");
427 for(i = 0; i < size; i++) {
429 putByte((
unsigned char)(val >> ((size - i - 1) * 8)) & 0xff);
431 putByte((
unsigned char)val & 0xff);
448 float outf = (float)f;
449 double outd = (double)f;
455 case Single: size = 4;
break;
456 case Double: size = 8;
break;
459 if (!
swap && ((size ==
sizeof (
float)) || (size ==
sizeof (
double))))
462 {
putRaw ((
char *)&outf, size);
return; }
464 {
putRaw ((
char *)&outd, size);
return; }
497 if(
swap) out += size - 1;
498 for(i = 0; i < size; i++) {
500 if(
swap) out--;
else out++;
510 #ifdef BINIO_WITH_MATH
541 # define FloatToUnsigned(f) ((unsigned long)(f))
543 # define FloatToUnsigned(f) ((unsigned long)(((long)((f) - 2147483648.0)) + 2147483647L + 1))
547 #define SEXP_OFFSET 127
549 #define SEXP_POSITION (32-SEXP_SIZE-1)
569 fMant = frexp(num, &expon);
573 bits =
sign | 0x7F800000;
585 mantissa = (long)(fMant * (
double)(1L << shift));
586 bits =
sign | mantissa;
598 bytes[0] = (
unsigned char)(bits >> 24);
599 bytes[1] = (
unsigned char)(bits >> 16);
600 bytes[2] = (
unsigned char)(bits >> 8);
601 bytes[3] = (
unsigned char)bits;
604 #define DEXP_MAX 2047
605 #define DEXP_OFFSET 1023
607 #define DEXP_POSITION (32-DEXP_SIZE-1)
628 fMant = frexp(num, &expon);
632 first =
sign | 0x7FF00000;
652 fsMant = ldexp(fMant, shift);
653 mantissa = (long)floor(fsMant);
654 first =
sign | mantissa;
661 mantissa = (long)floor(fsMant);
670 bytes[0] = (
unsigned char)(first >> 24);
671 bytes[1] = (
unsigned char)(first >> 16);
672 bytes[2] = (
unsigned char)(first >> 8);
673 bytes[3] = (
unsigned char)first;
674 bytes[4] = (
unsigned char)(second >> 24);
675 bytes[5] = (
unsigned char)(second >> 16);
676 bytes[6] = (
unsigned char)(second >> 8);
677 bytes[7] = (
unsigned char)second;
680 #endif // BINIO_WITH_MATH
686 if(!amount) amount = strlen(str);
688 for(i = 0; i < amount; i++) {
696 #if BINIO_ENABLE_STRING