ObjFW  Diff

Differences From Artifact [92fb9ca7c6]:

To Artifact [1b24e74726]:


790
791
792
793
794
795
796
797

798
799
800
801
802
803
804
805
790
791
792
793
794
795
796

797

798
799
800
801
802
803
804







-
+
-







}

- (const char *)objCType
{
	return _typeEncoding;
}

- (void)getValue: (void *)value
- (void)getValue: (void *)value size: (size_t)size
	    size: (size_t)size
{
	switch (*self.objCType) {
#define CASE(enc, type, property)					\
	case enc: {							\
		type tmp = (type)self.property;				\
									\
		if (size != sizeof(type))				\
1047
1048
1049
1050
1051
1052
1053
1054

1055
1056
1057

1058
1059
1060
1061
1062
1063
1064

1065
1066
1067
1068
1069
1070
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
1046
1047
1048
1049
1050
1051
1052

1053

1054

1055

1056
1057
1058
1059
1060

1061

1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076

1077

1078
1079
1080
1081

1082

1083
1084
1085
1086
1087
1088
1089







-
+
-

-
+
-





-
+
-















-
+
-




-
+
-







	OFXMLElement *element;

	element = [OFXMLElement elementWithName: @"OFNumber"
				      namespace: OF_SERIALIZATION_NS
				    stringValue: self.description];

	if (*self.objCType == 'B')
		[element addAttributeWithName: @"type"
		[element addAttributeWithName: @"type" stringValue: @"bool"];
				  stringValue: @"bool"];
	else if (isFloat(self)) {
		[element addAttributeWithName: @"type"
		[element addAttributeWithName: @"type" stringValue: @"float"];
				  stringValue: @"float"];
		element.stringValue = [OFString
		    stringWithFormat: @"%016" PRIx64,
		    OF_BSWAP64_IF_LE(OF_DOUBLE_TO_INT_RAW(OF_BSWAP_DOUBLE_IF_LE(
		    self.doubleValue)))];
	} else if (isSigned(self))
		[element addAttributeWithName: @"type"
		[element addAttributeWithName: @"type" stringValue: @"signed"];
				  stringValue: @"signed"];
	else if (isUnsigned(self))
		[element addAttributeWithName: @"type"
				  stringValue: @"unsigned"];
	else
		@throw [OFInvalidFormatException exception];

	[element retain];

	objc_autoreleasePoolPop(pool);

	return [element autorelease];
}

- (OFString *)JSONRepresentation
{
	return [self of_JSONRepresentationWithOptions: 0
	return [self of_JSONRepresentationWithOptions: 0 depth: 0];
						depth: 0];
}

- (OFString *)JSONRepresentationWithOptions: (int)options
{
	return [self of_JSONRepresentationWithOptions: options
	return [self of_JSONRepresentationWithOptions: options depth: 0];
						depth: 0];
}

- (OFString *)of_JSONRepresentationWithOptions: (int)options
					 depth: (size_t)depth
{
	double doubleValue;

1113
1114
1115
1116
1117
1118
1119
1120
1121

1122
1123
1124
1125
1126
1127

1128
1129
1130
1131

1132
1133
1134
1135
1136
1137

1138
1139
1140
1141

1142
1143
1144
1145
1146
1147
1148
1149

1150
1151
1152
1153
1154
1155

1156
1157
1158
1159
1160
1161
1162
1163
1164

1165
1166
1167
1168

1169
1170
1171
1172
1173
1174

1175
1176
1177
1178

1179
1180
1181
1182
1183
1184

1185
1186
1187
1188

1189
1190
1191
1192
1193
1194
1195
1196
1197
1198

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
1232
1233

1234
1235
1236
1237

1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1107
1108
1109
1110
1111
1112
1113


1114

1115
1116
1117
1118

1119


1120

1121

1122
1123
1124
1125

1126


1127

1128

1129
1130
1131
1132
1133
1134

1135

1136
1137
1138
1139

1140


1141
1142
1143
1144
1145
1146

1147


1148

1149

1150
1151
1152
1153

1154


1155

1156

1157
1158
1159
1160

1161


1162

1163

1164
1165
1166
1167
1168
1169
1170


1171

1172
1173
1174
1175

1176


1177
1178
1179
1180
1181
1182

1183


1184

1185

1186
1187
1188
1189

1190


1191

1192

1193
1194
1195
1196

1197


1198

1199

1200
1201
1202
1203
1204
1205
1206
1207
1208
1209







-
-
+
-




-
+
-
-

-
+
-




-
+
-
-

-
+
-






-
+
-




-
+
-
-






-
+
-
-

-
+
-




-
+
-
-

-
+
-




-
+
-
-

-
+
-







-
-
+
-




-
+
-
-






-
+
-
-

-
+
-




-
+
-
-

-
+
-




-
+
-
-

-
+
-










- (OFData *)messagePackRepresentation
{
	OFMutableData *data;
	const char *typeEncoding = self.objCType;

	if (*typeEncoding == 'B') {
		uint8_t type = (self.boolValue ? 0xC3 : 0xC2);

		data = [OFMutableData dataWithItems: &type
		data = [OFMutableData dataWithItems: &type count: 1];
					      count: 1];
	} else if (*typeEncoding == 'f') {
		uint8_t type = 0xCA;
		float tmp = OF_BSWAP_FLOAT_IF_LE(self.floatValue);

		data = [OFMutableData dataWithItemSize: 1
		data = [OFMutableData dataWithCapacity: 5];
					      capacity: 5];

		[data addItem: &type];
		[data addItems: &tmp
		[data addItems: &tmp count: sizeof(tmp)];
			 count: sizeof(tmp)];
	} else if (*typeEncoding == 'd') {
		uint8_t type = 0xCB;
		double tmp = OF_BSWAP_DOUBLE_IF_LE(self.doubleValue);

		data = [OFMutableData dataWithItemSize: 1
		data = [OFMutableData dataWithCapacity: 9];
					      capacity: 9];

		[data addItem: &type];
		[data addItems: &tmp
		[data addItems: &tmp count: sizeof(tmp)];
			 count: sizeof(tmp)];
	} else if (isSigned(self)) {
		long long value = self.longLongValue;

		if (value >= -32 && value < 0) {
			uint8_t tmp = 0xE0 | ((uint8_t)(value - 32) & 0x1F);

			data = [OFMutableData dataWithItems: &tmp
			data = [OFMutableData dataWithItems: &tmp count: 1];
						      count: 1];
		} else if (value >= INT8_MIN && value <= INT8_MAX) {
			uint8_t type = 0xD0;
			int8_t tmp = (int8_t)value;

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 2];
						      capacity: 2];

			[data addItem: &type];
			[data addItem: &tmp];
		} else if (value >= INT16_MIN && value <= INT16_MAX) {
			uint8_t type = 0xD1;
			int16_t tmp = OF_BSWAP16_IF_LE((int16_t)value);

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 3];
						      capacity: 3];

			[data addItem: &type];
			[data addItems: &tmp
			[data addItems: &tmp count: sizeof(tmp)];
				 count: sizeof(tmp)];
		} else if (value >= INT32_MIN && value <= INT32_MAX) {
			uint8_t type = 0xD2;
			int32_t tmp = OF_BSWAP32_IF_LE((int32_t)value);

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 5];
						      capacity: 5];

			[data addItem: &type];
			[data addItems: &tmp
			[data addItems: &tmp count: sizeof(tmp)];
				 count: sizeof(tmp)];
		} else if (value >= INT64_MIN && value <= INT64_MAX) {
			uint8_t type = 0xD3;
			int64_t tmp = OF_BSWAP64_IF_LE((int64_t)value);

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 9];
						      capacity: 9];

			[data addItem: &type];
			[data addItems: &tmp
			[data addItems: &tmp count: sizeof(tmp)];
				 count: sizeof(tmp)];
		} else
			@throw [OFOutOfRangeException exception];
	} else if (isUnsigned(self)) {
		unsigned long long value = self.unsignedLongLongValue;

		if (value <= 127) {
			uint8_t tmp = ((uint8_t)value & 0x7F);

			data = [OFMutableData dataWithItems: &tmp
			data = [OFMutableData dataWithItems: &tmp count: 1];
						      count: 1];
		} else if (value <= UINT8_MAX) {
			uint8_t type = 0xCC;
			uint8_t tmp = (uint8_t)value;

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 2];
						      capacity: 2];

			[data addItem: &type];
			[data addItem: &tmp];
		} else if (value <= UINT16_MAX) {
			uint8_t type = 0xCD;
			uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)value);

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 3];
						      capacity: 3];

			[data addItem: &type];
			[data addItems: &tmp
			[data addItems: &tmp count: sizeof(tmp)];
				 count: sizeof(tmp)];
		} else if (value <= UINT32_MAX) {
			uint8_t type = 0xCE;
			uint32_t tmp = OF_BSWAP32_IF_LE((uint32_t)value);

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 5];
						      capacity: 5];

			[data addItem: &type];
			[data addItems: &tmp
			[data addItems: &tmp count: sizeof(tmp)];
				 count: sizeof(tmp)];
		} else if (value <= UINT64_MAX) {
			uint8_t type = 0xCF;
			uint64_t tmp = OF_BSWAP64_IF_LE((uint64_t)value);

			data = [OFMutableData dataWithItemSize: 1
			data = [OFMutableData dataWithCapacity: 9];
						      capacity: 9];

			[data addItem: &type];
			[data addItems: &tmp
			[data addItems: &tmp count: sizeof(tmp)];
				 count: sizeof(tmp)];
		} else
			@throw [OFOutOfRangeException exception];
	} else
		@throw [OFInvalidFormatException exception];

	[data makeImmutable];

	return data;
}
@end