# HG changeset patch # User faust3 # Date 1080314504 0 # Node ID ab3590ad210174ba2f35f7c81483d1603c871ac2 # Parent 070fc453a20b77961aaf717da7417103e4b46132 fseeko emulation patch by Steven M. Schultz diff -r 070fc453a20b -r ab3590ad2101 configure --- a/configure Fri Mar 26 14:11:31 2004 +0000 +++ b/configure Fri Mar 26 15:21:44 2004 +0000 @@ -2613,6 +2613,19 @@ fi echores "$_strsep" +echocheck "fseeko()" +cat > $TMPC << EOF +#include +int main (void) { int i; i = fseeko(stdin, 0, 0); return 0; } +EOF +_fseeko=no +cc_check && _fseeko=yes +if test "$_fseeko" = yes ; then + _def_fseeko='#define HAVE_FSEEKO 1' +else + _def_fseeko='#undef HAVE_FSEEKO' +fi +echores "$_fseeko" echocheck "vsscanf()" cat > $TMPC << EOF @@ -5697,9 +5710,10 @@ fi echocheck "ftello()" -# if we don't have ftello map it to ftell +# if we don't have ftello use the osdep/ compatibility module cat > $TMPC << EOF #include +#include int main (void) { ftello(stdin); return 0; } EOF _ftello=no @@ -6133,11 +6147,14 @@ /* Define this if your system has the sysinfo header */ $_def_sys_sysinfo -/* Define this if your system uses ftello() for off_t seeking */ +/* Define this if your system has ftello() */ $_def_ftello #ifndef HAVE_FTELLO -# define ftello(a) ftell(a) +/* Need these for FILE and off_t an config.h is usually before other includes*/ +#include +#include +off_t ftello(FILE *); #endif /* Define this if your system has the "malloc.h" header file */ @@ -6176,6 +6193,15 @@ /* Define this if your system has strsep */ $_def_strsep +/* Define this if your system has fseeko */ +$_def_fseeko +#ifndef HAVE_FSEEKO +/* Need these for FILE and off_t an config.h is usually before other includes*/ +#include +#include +int fseeko(FILE *, off_t, int); +#endif + /* Define this if your system has vsscanf */ $_def_vsscanf diff -r 070fc453a20b -r ab3590ad2101 osdep/Makefile --- a/osdep/Makefile Fri Mar 26 14:11:31 2004 +0000 +++ b/osdep/Makefile Fri Mar 26 15:21:44 2004 +0000 @@ -3,7 +3,7 @@ LIBNAME = libosdep.a -SRCS= shmem.c strsep.c vsscanf.c scandir.c gettimeofday.c # timer.c +SRCS= shmem.c strsep.c vsscanf.c scandir.c gettimeofday.c fseeko.c # timer.c ifeq ($(TARGET_ARCH_X86),yes) ifeq ($(TARGET_OS),Linux) diff -r 070fc453a20b -r ab3590ad2101 osdep/fseeko.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/osdep/fseeko.c Fri Mar 26 15:21:44 2004 +0000 @@ -0,0 +1,84 @@ +/* + * fseeko.c + * 64-bit versions of fseeko/ftello() for systems which do not have them + */ + +#include "../config.h" + +#if !defined(HAVE_FSEEKO) || !defined(HAVE_FTELLO) +#include +#include +#include +#include +#endif + +#ifdef WIN32 +#define flockfile +#define funlockfile +#endif + +/* + * On BSD/OS and NetBSD (and perhaps others), off_t and fpos_t are the + * same. Standards say off_t is an arithmetic type, but not necessarily + * integral, while fpos_t might be neither. + * + * This is thread-safe on BSD/OS using flockfile/funlockfile. + */ + +#ifndef HAVE_FSEEKO +int +fseeko(FILE *stream, off_t offset, int whence) +{ + off_t floc; + struct stat filestat; + + switch (whence) + { + case SEEK_CUR: + flockfile(stream); + if (fgetpos(stream, &floc) != 0) + goto failure; + floc += offset; + if (fsetpos(stream, &floc) != 0) + goto failure; + funlockfile(stream); + return 0; + break; + case SEEK_SET: + if (fsetpos(stream, &offset) != 0) + return -1; + return 0; + break; + case SEEK_END: + flockfile(stream); + if (fstat(fileno(stream), &filestat) != 0) + goto failure; + floc = filestat.st_size; + if (fsetpos(stream, &floc) != 0) + goto failure; + funlockfile(stream); + return 0; + break; + default: + errno = EINVAL; + return -1; + } + +failure: + funlockfile(stream); + return -1; +} +#endif + + +#ifndef HAVE_FTELLO +off_t +ftello(FILE *stream) +{ + off_t floc; + + if (fgetpos(stream, &floc) != 0) + return -1; + return floc; +} +#endif