ObjFW  Diff

Differences From Artifact [c085900a12]:

To Artifact [955a1ea2ce]:


11
12
13
14
15
16
17


18
19
20
21
22
23
24
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26







+
+







 * Alternatively, it may be distributed under the terms of the GNU General
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

#include <string.h>

#import "OFDataArray+MessagePackValue.h"
#import "OFNumber.h"
#import "OFNull.h"
#import "OFDataArray.h"
#import "OFString.h"
#import "OFArray.h"
194
195
196
197
198
199
200
201

202
203
204
205
206
207
208
196
197
198
199
200
201
202

203
204
205
206
207
208
209
210







-
+








	/* fixmap */
	if ((buffer[0] & 0xF0) == 0x80)
		return parseTable(buffer + 1, length - 1, object,
		    buffer[0] & 0xF, depthLimit) + 1;

	/* Prefix byte */
	switch (*buffer) {
	switch (buffer[0]) {
	/* Unsigned integers */
	case 0xCC: /* uint8 */
		if (length < 2)
			goto error;

		*object = [OFNumber numberWithUInt8: buffer[1]];
		return 2;
255
256
257
258
259
260
261
262
263

264
265
266
267
268
269
270
271
272
273
274
275
276
277

278
279
280
281
282
283
284
257
258
259
260
261
262
263


264
265
266
267
268
269
270
271
272
273
274
275
276


277
278
279
280
281
282
283
284







-
-
+












-
-
+







			uint8_t u8[4];
			float f;
		} f;

		if (length < 5)
			goto error;

		for (size_t i = 0; i < 4; i++)
			f.u8[i] = buffer[i + 1];
		memcpy(&f.u8, buffer + 1, 4);

		*object = [OFNumber numberWithFloat: OF_BSWAP_FLOAT_IF_LE(f.f)];
		return 5;
	case 0xCB:; /* float 64 */
		union {
			uint8_t u8[8];
			double d;
		} d;

		if (length < 9)
			goto error;

		for (size_t i = 0; i < 8; i++)
			d.u8[i] = buffer[i + 1];
		memcpy(&d.u8, buffer + 1, 8);

		*object = [OFNumber numberWithDouble:
		    OF_BSWAP_DOUBLE_IF_LE(d.d)];
		return 9;
	/* nil */
	case 0xC0:
		*object = [OFNull null];