Hey Stef,

I think what GNUstep is doing is OK...

On 2013-08-20, at 3:34 PM, Stefan Bidi <[email protected]> wrote:

> I'm re-writing the CoreBase string formatting function (printf with %@ 
> support) and while going through the printf(), Apple docs and other sources 
> on the internet I ran across a potential problem with some of the assumptions 
> made when defining these types.
> 
> I understand that despite being very portable, GNUstep isn't made to work on 
> all platforms, but I'm still going to use an unlikely platform as example...
> 
> Anyway, in the Apple docs, they have:
> typedef long NSInteger;
> typedef unsigned long NSUInteger
> typedef long CFIndex;

> Yet, the discussion says:
> When building 32-bit applications, NSInteger is a 32-bit integer. A 64-bit 
> application treats NSInteger as a 64-bit integer.
> 
> This is true on LP64 platforms but not on any other platform.

It's tricky,  because we don't have a definitive specification.

I don't think the "typedef long NSInteger" mentioned in the docs is the 
final/proper definition of NSInteger. For example, on OS X 10.8, NSInteger can 
be defined as 'int' under some circumstances.
> 

>   The problem that I see here is that the Apple docs about string formatting 
> say that if you want to format a NSInteger/NSUInteger/CFIndex you should use 
> '%ld' or '%lu'.

This is from a table in "String Programming Guide", right? I think you may have 
missed the "Considerations" column which says to cast the value to a long when 
using the %ld format specifier.

This seems to be the accepted interpretation on stackoverflow as well:
http://stackoverflow.com/questions/4405006/nslog-specifier-for-nsinteger

> GNUstep, on the other hand, defines these values as intptr_t/uintptr_t, which 
> in my opinion is wrong.  We essentially assume these types are as long as a 
> pointer, which is true if you assume LP64.  However, this assumption is not 
> true for a cross-platform library.

> Lastly, I was browsing the web and came across this 
> (http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html) where 
> int is 16-bits, long is 32-bits and intptr_t is 16-bits.  I realize AVR is 
> not a target, but I just wanted to use it as another example where long is 
> not equivalent to intptr_t.  And who known, someone might want to use it in 
> the future.
> 
> I would like to suggest typedef'ing NSInteger/NSUInteger/CFIndex as long.  
> That way we can correctly format these integers across all platforms 
> supported by GNUstep.

Hope my point addresses your concern.

Cheers,
Eric
_______________________________________________
Gnustep-dev mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to