diff options
Diffstat (limited to 'gcc/ada/cstreams.c')
-rw-r--r-- | gcc/ada/cstreams.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/gcc/ada/cstreams.c b/gcc/ada/cstreams.c index a58d9e5..23f7480 100644 --- a/gcc/ada/cstreams.c +++ b/gcc/ada/cstreams.c @@ -31,12 +31,19 @@ /* Routines required for implementing routines in Interfaces.C.Streams. */ +#define _LARGEFILE_SOURCE #define _FILE_OFFSET_BITS 64 /* the define above will make off_t a 64bit type on GNU/Linux */ #include <stdio.h> #include <sys/types.h> +#ifdef _AIX +/* needed to avoid conflicting declarations */ +#include <unistd.h> +#include <sys/mman.h> +#endif + #ifdef __vxworks #include "vxWorks.h" #endif @@ -268,7 +275,10 @@ __gnat_fseek64 (FILE *stream, __int64 offset, int origin) return _fseeki64 (stream, offset, origin); } -#else +#elif defined(linux) || defined(sun) \ + || defined (__FreeBSD__) || defined(__APPLE__) +/* section for platforms having ftello/fseeko */ + __int64 __gnat_ftell64 (FILE *stream) { @@ -286,6 +296,26 @@ __gnat_fseek64 (FILE *stream, __int64 offset, int origin) else return -1; } + +#else + +__int64 +__gnat_ftell64 (FILE *stream) +{ + return (__int64)ftell (stream); +} + +int +__gnat_fseek64 (FILE *stream, __int64 offset, int origin) +{ + /* make sure that the offset is not bigger than the OS off_t, if so return + with error as this mean that we are trying to handle files larger than + 2Gb on a patform not supporting it. */ + if ((off_t)offset == offset) + return fseek (stream, (off_t) offset, origin); + else + return -1; +} #endif #ifdef __cplusplus |