Changeset 4240 for zzuf/trunk


Ignore:
Timestamp:
Jan 8, 2010, 1:48:33 AM (11 years ago)
Author:
Sam Hocevar
Message:

Implement feof(x) in zzcat, to break out of a loop after EOF was hit x times.

Location:
zzuf/trunk/test
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/test/check-utils

    r4233 r4240  
    5757        check "$ZZOPTS" "$ZZCAT \"fread(1,33000) fseek(1,SEEK_SET) fread(1,1) fseek(4093,SEEK_CUR) fread(1,1) fseek(1,SEEK_CUR) fread(1,1)\" $file" \
    5858              "eglibc (2.9-21) bug regression"
    59         check "$ZZOPTS" "$ZZCAT \"repeat(33000,getc_unlocked() ungetc() getline())\" $file" \
     59        check "$ZZOPTS" "$ZZCAT \"repeat(33000,getc_unlocked() ungetc() getline() feof(10))\" $file" \
    6060              "sed getc_unlocked() bug regression"
    6161        # Misc tests
     
    7272          "fgetc() ungetc() fread(1,33000)" \
    7373          "fgetc_unlocked() ungetc() fread(1,33000)" \
    74           "repeat(33000,getc())" \
    75           "repeat(33000,getc_unlocked())" \
    76           "repeat(33000,fgetc())" \
    77           "repeat(33000,fgetc_unlocked())" \
     74          "repeat(33000,getc(),feof(10))" \
     75          "repeat(33000,getc_unlocked(),feof(10))" \
     76          "repeat(33000,fgetc(),feof(10))" \
     77          "repeat(33000,fgetc_unlocked(),feof(10))" \
    7878          "repeat(8000,getc()) fread(1,33000)" \
    7979          "repeat(8000,getc_unlocked()) fread(1,33000)" \
     
    8989          "fread(1,33000) rewind() repeat(10000,fseek(3,SEEK_CUR) fread(1,3))" \
    9090          "fread(1,33000) rewind() repeat(10000,fseek(4,SEEK_CUR) fread(1,4))" \
    91           "repeat(33000,getc() ungetc() getline())" \
    92           "repeat(33000,fgetc() ungetc() getline())" \
    93           "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,fread(1,2))" \
    94           "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,getc())" \
    95           "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,fgetc())" \
    96           "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,getc_unlocked())" \
     91          "repeat(33000,getc() ungetc() getline() feof(10))" \
     92          "repeat(33000,fgetc() ungetc() getline() feof(10))" \
     93          "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,fread(1,2),feof(10))" \
     94          "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,getc(),feof(10))" \
     95          "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,fgetc(),feof(10))" \
     96          "fread(1,33000) fseek(1000,SEEK_CUR) repeat(10000,getc_unlocked(),feof(10))" \
    9797          ; do
    9898            check "$ZZOPTS" "$ZZCAT \"$n\" $file" "$n"
  • zzuf/trunk/test/zzcat.c

    r4121 r4240  
    11/*
    22 *  zzcat - various cat reimplementations for testing purposes
    3  *  Copyright (c) 2006-2009 Sam Hocevar <sam@hocevar.net>
     3 *  Copyright (c) 2006-2010 Sam Hocevar <sam@hocevar.net>
    44 *                All Rights Reserved
    55 *
     
    105105    } while(0)
    106106
     107#define FEOF() \
     108    do { \
     109        if (!f) \
     110        { \
     111            f = fopen(file, "r"); \
     112            if (!f) \
     113            { \
     114                fprintf(stderr, "E: zzcat: cannot open `%s'\n", file); \
     115                return EXIT_FAILURE; \
     116            } \
     117        } \
     118        if (feof(f)) \
     119            feofs++; \
     120        if (feofs >= l1) \
     121            finish = 1; \
     122        p = strchr(p, ')') + 1; \
     123    } while(0)
     124
    107125/*
    108126 * Command parser. We rewrite fmt by replacing the last character with
     
    153171    FILE *f = NULL;
    154172    size_t retlen = 0, retoff = 0;
    155     int nloops = 0, fd = -1;
     173    int nloops = 0, fd = -1, feofs = 0, finish = 0;
    156174
    157175    /* Allocate 32MB for our temporary buffer. Any larger value will crash. */
     
    188206            }
    189207            loops[nloops - 1].count--;
    190             if (loops[nloops - 1].count <= 0)
     208            if (loops[nloops - 1].count <= 0 || finish)
    191209            {
    192210                nloops--;
     
    197215                p = loops[nloops - 1].p;
    198216            }
     217
     218            finish = 0;
    199219        }
    200220
     
    220240            FOPEN(f = __freopen64(file, "r", f));
    221241#endif
     242
     243        /* FILE * EOF detection */
     244        else if (PARSECMD("feof ( %li )", &l1))
     245            FEOF();
    222246
    223247        /* FILE * closing functions */
     
    334358        if (lineptr)
    335359            free(lineptr);
     360
     361        if (finish && !nloops)
     362            break;
    336363    }
    337364
Note: See TracChangeset for help on using the changeset viewer.