554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
|
*/
_type = OF_NUMBER_TYPE_UINTMAX;
_value.uIntMax = element.decimalValue;
} else if ([typeString isEqual: @"signed"]) {
_type = OF_NUMBER_TYPE_INTMAX;
_value.intMax = element.decimalValue;
} else if ([typeString isEqual: @"float"]) {
union {
float f;
uint32_t u;
} f;
f.u = OF_BSWAP32_IF_LE(
(uint32_t)element.hexadecimalValue);
_type = OF_NUMBER_TYPE_FLOAT;
_value.float_ = OF_BSWAP_FLOAT_IF_LE(f.f);
} else if ([typeString isEqual: @"double"]) {
union {
double d;
uint64_t u;
} d;
d.u = OF_BSWAP64_IF_LE(
(uint64_t)element.hexadecimalValue);
_type = OF_NUMBER_TYPE_DOUBLE;
_value.double_ = OF_BSWAP_DOUBLE_IF_LE(d.d);
} else
@throw [OFInvalidArgumentException exception];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
@throw e;
|
<
<
<
<
<
<
<
<
|
<
<
<
<
<
|
<
|
|
|
>
>
|
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
|
*/
_type = OF_NUMBER_TYPE_UINTMAX;
_value.uIntMax = element.decimalValue;
} else if ([typeString isEqual: @"signed"]) {
_type = OF_NUMBER_TYPE_INTMAX;
_value.intMax = element.decimalValue;
} else if ([typeString isEqual: @"float"]) {
_type = OF_NUMBER_TYPE_FLOAT;
_value.float_ = OF_BSWAP_FLOAT_IF_LE(
OF_INT_TO_FLOAT_RAW(OF_BSWAP32_IF_LE(
(uint32_t)element.hexadecimalValue)));
} else if ([typeString isEqual: @"double"]) {
_type = OF_NUMBER_TYPE_DOUBLE;
_value.double_ = OF_BSWAP_DOUBLE_IF_LE(
OF_INT_TO_DOUBLE_RAW(OF_BSWAP64_IF_LE(
(uint64_t)element.hexadecimalValue)));
} else
@throw [OFInvalidArgumentException exception];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
@throw e;
|
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
|
type &= ~OF_NUMBER_TYPE_FLOAT;
}
}
OF_HASH_INIT(hash);
if (type & OF_NUMBER_TYPE_FLOAT) {
union {
double d;
uint8_t b[sizeof(double)];
} d;
if (isnan(self.doubleValue))
return 0;
d.d = OF_BSWAP_DOUBLE_IF_BE(self.doubleValue);
for (uint_fast8_t i = 0; i < sizeof(double); i++)
OF_HASH_ADD(hash, d.b[i]);
} else if (type & OF_NUMBER_TYPE_SIGNED) {
intmax_t v = self.intMaxValue * -1;
while (v != 0) {
OF_HASH_ADD(hash, v & 0xFF);
v >>= 8;
}
|
<
|
<
<
|
|
|
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
|
type &= ~OF_NUMBER_TYPE_FLOAT;
}
}
OF_HASH_INIT(hash);
if (type & OF_NUMBER_TYPE_FLOAT) {
double d;
if (isnan(self.doubleValue))
return 0;
d = OF_BSWAP_DOUBLE_IF_BE(self.doubleValue);
for (uint_fast8_t i = 0; i < sizeof(double); i++)
OF_HASH_ADD(hash, ((char *)&d)[i]);
} else if (type & OF_NUMBER_TYPE_SIGNED) {
intmax_t v = self.intMaxValue * -1;
while (v != 0) {
OF_HASH_ADD(hash, v & 0xFF);
v >>= 8;
}
|
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
|
case OF_NUMBER_TYPE_INT8:
case OF_NUMBER_TYPE_INT16:
case OF_NUMBER_TYPE_INT32:
case OF_NUMBER_TYPE_INT64:
case OF_NUMBER_TYPE_SSIZE:
case OF_NUMBER_TYPE_INTMAX:
case OF_NUMBER_TYPE_PTRDIFF:
case OF_NUMBER_TYPE_INTPTR:;
[element addAttributeWithName: @"type"
stringValue: @"signed"];
break;
case OF_NUMBER_TYPE_FLOAT:;
union {
float f;
uint32_t u;
} f;
f.f = OF_BSWAP_FLOAT_IF_LE(_value.float_);
[element addAttributeWithName: @"type"
stringValue: @"float"];
element.stringValue =
[OFString stringWithFormat: @"%08" PRIx32,
OF_BSWAP32_IF_LE(f.u)];
break;
case OF_NUMBER_TYPE_DOUBLE:;
union {
double d;
uint64_t u;
} d;
d.d = OF_BSWAP_DOUBLE_IF_LE(_value.double_);
[element addAttributeWithName: @"type"
stringValue: @"double"];
element.stringValue =
[OFString stringWithFormat: @"%016" PRIx64,
OF_BSWAP64_IF_LE(d.u)];
break;
default:
@throw [OFInvalidFormatException exception];
}
[element retain];
|
|
|
<
<
<
<
<
<
<
<
|
|
>
|
<
<
<
<
<
<
<
|
|
|
>
|
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
|
case OF_NUMBER_TYPE_INT8:
case OF_NUMBER_TYPE_INT16:
case OF_NUMBER_TYPE_INT32:
case OF_NUMBER_TYPE_INT64:
case OF_NUMBER_TYPE_SSIZE:
case OF_NUMBER_TYPE_INTMAX:
case OF_NUMBER_TYPE_PTRDIFF:
case OF_NUMBER_TYPE_INTPTR:
[element addAttributeWithName: @"type"
stringValue: @"signed"];
break;
case OF_NUMBER_TYPE_FLOAT:
[element addAttributeWithName: @"type"
stringValue: @"float"];
element.stringValue = [OFString stringWithFormat: @"%08" PRIx32,
OF_BSWAP32_IF_LE(OF_FLOAT_TO_INT_RAW(OF_BSWAP_FLOAT_IF_LE(
_value.float_)))];
break;
case OF_NUMBER_TYPE_DOUBLE:
[element addAttributeWithName: @"type"
stringValue: @"double"];
element.stringValue = [OFString
stringWithFormat: @"%016" PRIx64,
OF_BSWAP64_IF_LE(OF_DOUBLE_TO_INT_RAW(OF_BSWAP_DOUBLE_IF_LE(
_value.double_)))];
break;
default:
@throw [OFInvalidFormatException exception];
}
[element retain];
|