[PATCH] Avoid more problems with type clashes

J. Johnston jjohnstn@redhat.com
Thu Mar 13 23:51:00 GMT 2003


Corinna Vinschen wrote:
> On Thu, Mar 13, 2003 at 11:31:07AM -0500, J. Johnston wrote:
> 
>>Ok, I see now.
>>
>>I would prefer a cleaner solution that doesn't do this via the 
>>_COMPILING_NEWLIB
>>flag in stdio.h.  I also would like it to be a generic solution so other 
>>platforms can
>>use it, if desired/needed.
>>
>>What I am thinking of is to add the wrapper functions that take the 
>>external type and
>>call the correct function underneath.  For example, we change the current 
>>fgetpos
>>routine to be called _fgetpos() which takes _fpos_t and we also add to 
>>fgetpos.c,
>>an fgetpos() wrapper routine that takes fpos_t.  The wrapper function calls 
>>_fgetpos()
>>or fgetpos64 based on a compiler flag.  Prototypes for _fgetpos() etc..
>>could be hidden in stdio/local.h.  The wrapper function would be #ifdef'd
>>out if the flag isn't set and instead, we redefine _fgetpos to be fgetpos.
>>
>>Currently you are using __CYGWIN_USE_BIG_TYPES__, but if this were renamed 
>>to
>>be something more generic (e.g. __LARGE64_DEFAULTED__), then any platform
>>could use it if desired.
>>
>>I can implement the patch if you would like.
> 
> 
> Hmm, I don't think it's actually necessary to do it that complicated.
> The only unclean part is IMHO the usage of __CYGWIN_USE_BIG_TYPES__
> in stdio.h which should be changed to a more generic name but otherwise
> everything's fine as it is.
> 

Not exactly fine.  This change is still very cygwin-specific.  You are prototyping an
external function which is not provided in newlib.  Internally, there is an fgetpos()
which takes an _fpos_t, but to the external user, they will see an fgetpos() which takes
fpos_t = fpos64_t which is not provided.  This requires that a platform provide
their own fgetpos to override newlib's.

> There's also a problem with already existing function calls which are
> expected in the underlying system API.  E. g. you can't change lseek to
> _lseek and open to _open for that reason.
> 

There are the _r wrapper functions in libc/reent to handle newlib internal calls
(which should be calling the _r versions).  The syscalls code can likewise be modified to
handle external calls.  I don't claim this is going to be bullet-proof, but
it seems that it wouldn't be that bad to implement.  As I said, I am willing to help
out with this as I see it could be of use for supporting Linux.


-- Jeff J.



More information about the Newlib mailing list