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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.