Changeset 1566 for zzuf


Ignore:
Timestamp:
Jan 5, 2007, 3:36:39 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Implemented BSD fgetln(). Untested yet.
Location:
zzuf/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/configure.ac

    r1543 r1566  
    2828
    2929AC_CHECK_HEADERS(inttypes.h stdint.h getopt.h)
    30 AC_CHECK_FUNCS(open64 lseek64 fopen64 getline getdelim __getdelim)
     30AC_CHECK_FUNCS(open64 lseek64 fopen64 getline getdelim __getdelim fgetln)
    3131AC_CHECK_TYPES(sighandler_t, [], [],
    3232  [#define _GNU_SOURCE
  • zzuf/trunk/src/libzzuf.c

    r1563 r1566  
    291291    files[i].fuzz.cur = -1;
    292292    files[i].fuzz.data = malloc(CHUNKBYTES);
     293#ifdef HAVE_FGETLN
     294    files[i].fuzz.tmp = NULL;
     295#endif
    293296
    294297    fds[fd] = i;
     
    302305    files[fds[fd]].managed = 0;
    303306    free(files[fds[fd]].fuzz.data);
     307#ifdef HAVE_FGETLN
     308    if(files[fds[fd]].fuzz.tmp)
     309        free(files[fds[fd]].fuzz.tmp);
     310#endif
    304311
    305312    fds[fd] = -1;
  • zzuf/trunk/src/libzzuf.h

    r1560 r1566  
    3030    int cur;
    3131    uint8_t *data;
     32#ifdef HAVE_FGETLN
     33    char *tmp;
     34#endif
    3235};
    3336
  • zzuf/trunk/src/load-stream.c

    r1553 r1566  
    6363#endif
    6464
     65/* Additional BSDisms */
     66#ifdef HAVE_FGETLN
     67static char *  (*fgetln_orig) (FILE *stream, size_t *len);
     68#endif
     69
    6570void _zz_load_stream(void)
    6671{
     
    8489#ifdef HAVE___GETDELIM
    8590    LOADSYM(__getdelim);
     91#endif
     92#ifdef HAVE_FGETLN
     93    LOADSYM(fgetln);
    8694#endif
    8795}
     
    384392#endif
    385393
     394#ifdef HAVE_FGETLN
     395char *fgetln(FILE *stream, size_t *len)
     396{
     397    struct fuzz *fuzz;
     398    char *ret;
     399    size_t i, size;
     400    int fd;
     401
     402    if(!_zz_ready)
     403        LOADSYM(fgetln);
     404    fd = fileno(stream);
     405    if(!_zz_ready || !_zz_iswatched(fd))
     406        return fgetln_orig(stream, len);
     407
     408    fuzz = _zz_getfuzz(fd);
     409
     410    for(i = size = 0; fuzz.tmp[i] != '\n'; i++)
     411    {
     412        int ch;
     413
     414        if(i >= size)
     415            fuzz.tmp = realloc(fuzz.tmp, (size += 80));
     416
     417        _zz_disabled = 1;
     418        ch = fgetc_orig(stream);
     419        _zz_disabled = 0;
     420
     421        if(ch == EOF)
     422            break;
     423
     424        fuzz.tmp[i] = (char)(unsigned char)ch;
     425        _zz_fuzz(fd, (uint8_t *)fuzz.tmp + i, 1); /* rather inefficient */
     426        _zz_addpos(fd, 1);
     427    }
     428
     429    *len = size;
     430
     431    debug("fgetln([%i], &%li) = %p", fd, (long int)*len, ret);
     432    return ret;
     433}
     434#endif
     435
Note: See TracChangeset for help on using the changeset viewer.