行数を数える #4

行数をカウントする部分をファイルストリームを引数とする関数にする。

#include <stdio.h>

typedef enum { FALSE = 0 } bool_t;

unsigned long count_eol(FILE *fp);

unsigned long count_eol(FILE *fp)
{
    unsigned long nlines = 0L;
    bool_t succeeded_eol = FALSE, succeeded_cr = FALSE;
    int c = getc(fp);
    if (c != EOF) {
        do {
            if (c == '\r') {
                ++nlines;
                succeeded_eol = succeeded_cr = ! FALSE;
            } else {
                succeeded_eol = c == '\n';
                if (succeeded_eol && ! succeeded_cr) ++nlines;
                succeeded_cr = FALSE;
            }
        } while ((c = getc(fp)) != EOF);
        if (! succeeded_eol) ++nlines;
    }
    return nlines;
}

int main(void)
{
    printf("%lu\n", count_eol(stdin));
    return 0;
}