Changeset 1594 for zzuf


Ignore:
Timestamp:
Jan 7, 2007, 10:34:42 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • Implemented fseeko().
Location:
zzuf/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/configure.ac

    r1590 r1594  
    1616
    1717AC_CHECK_HEADERS(inttypes.h stdint.h getopt.h)
    18 AC_CHECK_FUNCS(open64 lseek64 mmap64 fopen64 getline getdelim __getdelim fgetln)
     18AC_CHECK_FUNCS(open64 lseek64 mmap64 fopen64 fseeko getline getdelim __getdelim fgetln)
    1919AC_CHECK_TYPES(sighandler_t, [], [],
    2020  [#define _GNU_SOURCE
  • zzuf/trunk/doc/zzuf.1

    r1584 r1594  
    255255.TP
    256256Standard IO streams:
    257 \fBfopen\fR(), \fBfseek\fR(), \fBrewind\fR(), \fBfread\fR(), \fBgetc\fR(),
    258 \fBfgetc\fR(), \fBfgets\fR(), \fBungetc\fR(), \fBfclose\fR()
     257\fBfopen\fR(), \fBfseek\fR(), \fBfseeko\fR(), \fBrewind\fR(), \fBfread\fR(),
     258\fBgetc\fR(), \fBfgetc\fR(), \fBfgets\fR(), \fBungetc\fR(), \fBfclose\fR()
    259259.TP
    260260GNU libc specific:
  • zzuf/trunk/src/load-stream.c

    r1593 r1594  
    3030
    3131#include <stdio.h>
     32#include <sys/types.h>
    3233
    3334#include "libzzuf.h"
     
    4243#endif
    4344static int     (*fseek_orig)   (FILE *stream, long offset, int whence);
     45#ifdef HAVE_FSEEKO
     46static int     (*fseeko_orig)  (FILE *stream, off_t offset, int whence);
     47#endif
    4448static void    (*rewind_orig)  (FILE *stream);
    4549static size_t  (*fread_orig)   (void *ptr, size_t size, size_t nmemb,
     
    7680#endif
    7781    LOADSYM(fseek);
     82#ifdef HAVE_FSEEKO
     83    LOADSYM(fseeko);
     84#endif
    7885    LOADSYM(rewind);
    7986    LOADSYM(fread);
     
    129136#endif
    130137
     138#define FSEEK(fn, fn2) \
     139    do \
     140    { \
     141        int fd; \
     142        if(!_zz_ready) \
     143            LOADSYM(fn); \
     144        fd = fileno(stream); \
     145        if(!_zz_ready || !_zz_iswatched(fd)) \
     146            return ORIG(fn)(stream, offset, whence); \
     147        _zz_disabled = 1; \
     148        ret = ORIG(fn)(stream, offset, whence); \
     149        _zz_disabled = 0; \
     150        debug(STR(fn)"([%i], %lli, %i) = %i", \
     151              fd, (long long int)offset, whence, ret); \
     152        if(ret == 0) \
     153        { \
     154            /* FIXME: check what happens when fseek()ing a pipe */ \
     155            switch(whence) \
     156            { \
     157                case SEEK_END: \
     158                    offset = fn2(stream); \
     159                    /* fall through */ \
     160                case SEEK_SET: \
     161                    _zz_setpos(fd, offset); \
     162                    break; \
     163                case SEEK_CUR: \
     164                    _zz_addpos(fd, offset); \
     165                    break; \
     166            } \
     167        } \
     168    } while(0)
     169
    131170int fseek(FILE *stream, long offset, int whence)
    132171{
    133     int ret, fd;
    134 
    135     if(!_zz_ready)
    136         LOADSYM(fseek);
    137     fd = fileno(stream);
    138     if(!_zz_ready || !_zz_iswatched(fd))
    139         return fseek_orig(stream, offset, whence);
    140 
    141     _zz_disabled = 1;
    142     ret = fseek_orig(stream, offset, whence);
    143     _zz_disabled = 0;
    144     debug("fseek([%i], %li, %i) = %i", fd, offset, whence, ret);
    145     if(ret != 0)
    146         return ret;
    147 
    148     /* FIXME: check what happens when fseek()ing a pipe */
    149     switch(whence)
    150     {
    151         case SEEK_END:
    152             offset = ftell(stream);
    153             /* fall through */
    154         case SEEK_SET:
    155             _zz_setpos(fd, offset);
    156             break;
    157         case SEEK_CUR:
    158             _zz_addpos(fd, offset);
    159             break;
    160     }
    161     return 0;
    162 }
     172    int ret; FSEEK(fseek, ftell); return ret;
     173}
     174
     175#ifdef HAVE_FSEEKO
     176int fseeko(FILE *stream, off_t offset, int whence)
     177{
     178    int ret; FSEEK(fseeko, ftello); return ret;
     179}
     180#endif
    163181
    164182void rewind(FILE *stream)
Note: See TracChangeset for help on using the changeset viewer.