Changeset 1594


Ignore:
Timestamp:
01/07/07 10:34:42 (6 years ago)
Author:
sam
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.