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

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

	@try {
		OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];





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


		seconds = [element doubleValue];

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








>
>
>
>







>
|







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 = 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
	return [self dateStringWithFormat: @"%Y-%m-%dT%H:%M:%SZ"];
}

- (OFXMLElement*)XMLElementBySerializing
{
	OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
	OFXMLElement *element;





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


	[element setStringValue: [OFString stringWithFormat: @"%la", seconds]];


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

	return element;
}







>
>
>
>



>
>
|
>







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: @"%016" PRIx64, d.u]];

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

	return element;
}