行数を数える #3

改行とは'\r'と'\n'の連接であるかさもなければ'\r'か'\n'であるとする。
この定義で行数を数えるように変更する。
行数を数えるときは'\r'に続いて'\n'が現れたときに一個の改行となると考えるよりも、
'\r'が現れた段階で行数をカウントアップし、
'\n'でカウントアップする条件は直前の文字が'\r'でないこととした方がスムースになる。

#include <stdio.h>

typedef enum { FALSE = 0 } bool_t;

int main(void)
{
    unsigned long nlines = 0L;
    bool_t succeeded_eol = FALSE, succeeded_cr = FALSE;
    int c = getchar();
    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 = getchar()) != EOF);
        if (! succeeded_eol) ++nlines;
    }
    printf("%lu\n", nlines);
    return 0;
}