ObjFW  Diff

Differences From Artifact [c0e29e0a91]:

To Artifact [1da3535d97]:

  • File src/OFDate.m — part of check-in [a6ee2b2065] at 2012-07-31 12:05:46 on branch trunk — Slightly changed serialization format.

    printf's %a was too fragile to serialize floats and doubles, as it was
    behaving differently on different OSes and OS versions. Instead, a hex
    representation of the float/double in big endian is used now. While this
    is less readable, it is guaranteed to be accurate and always the same. (user: js, size: 13112) [annotate] [blame] [check-ins using]


319
320
321
322
323
324
325




326
327
328
329
330
331
332

333

334
335
336
337
338
339
340
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337

338
339
340
341
342
343
344
345







+
+
+
+







+
-
+








- initWithSerialization: (OFXMLElement*)element
{
	self = [super init];

	@try {
		OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
		union {
			double d;
			uint64_t u;
		} d;

		if (![[element name] isEqual: [self className]] ||
		    ![[element namespace] isEqual: OF_SERIALIZATION_NS])
			@throw [OFInvalidArgumentException
			    exceptionWithClass: [self class]
				      selector: _cmd];

		d.u = (uint64_t)[element hexadecimalValue];
		seconds = [element doubleValue];
		seconds = of_bswap_double_if_le(d.d);

		[pool release];
	} @catch (id e) {
		[self release];
		@throw e;
	}

406
407
408
409
410
411
412




413
414
415


416


417
418
419
420
421
422
423
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426

427
428
429
430
431
432
433
434
435







+
+
+
+



+
+
-
+
+







	return [self dateStringWithFormat: @"%Y-%m-%dT%H:%M:%SZ"];
}

- (OFXMLElement*)XMLElementBySerializing
{
	OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
	OFXMLElement *element;
	union {
		double d;
		uint64_t u;
	} d;

	element = [OFXMLElement elementWithName: [self className]
				      namespace: OF_SERIALIZATION_NS];

	d.d = of_bswap_double_if_le(seconds);
	[element setStringValue: [OFString stringWithFormat: @"%la", seconds]];
	[element setStringValue:
	    [OFString stringWithFormat: @"%016" PRIx64, d.u]];

	[element retain];
	[pool release];
	[element autorelease];

	return element;
}