C言語入門(53) 実際にプログラムを読んで理解を深めよう tail編(8)

Posted: 2013年08月15日

前回は、逆読みモード(reverse)の読み込み処理です。
今回は、逆読みモードのファイル読み込み処理について記載します。

reverse.c r_reg関数

プログラムプログラム:

/*
 * r_reg -- display a regular file in reverse order by line.
 */
static void
r_reg(FILE *fp, const char *fn, enum STYLE style, off_t off, struct stat *sbp)
{
    struct mapinfo map;
    off_t curoff, size, lineend;
    int i;

    if (!(size = sbp->st_size))
        return;

    map.start = NULL;
    map.mapoff = map.maxoff = size;
    map.fd = fileno(fp);

    /*
     * Last char is special, ignore whether newline or not. Note that
     * size == 0 is dealt with above, and size == 1 sets curoff to -1.
     */
    curoff = size - 2;
    lineend = size;
    while (curoff >= 0) {
        if (curoff < map.mapoff ||
            curoff >= map.mapoff + (off_t)map.maplen) {
            if (maparound(&map, curoff) != 0) {
                ierr(fn);
                return;
            }
        }
        for (i = curoff - map.mapoff; i >= 0; i--) {
            if (style == RBYTES && --off == 0)
                break;
            if (map.start[i] == 'n')
                break;
        }
        /* `i' is either the map offset of a 'n', or -1. */
        curoff = map.mapoff + i;
        if (i < 0)
            continue;

        /* Print the line and update offsets. */
        if (mapprint(&map, curoff + 1, lineend - curoff - 1) != 0) {
            ierr(fn);
            return;
        }
        lineend = curoff + 1;
        curoff--;

        if (style == RLINES)
            off--;

        if (off == 0 && style != REVERSE) {
            /* Avoid printing anything below. */
            curoff = 0;
            break;
        }
    }
    if (curoff < 0 && mapprint(&map, 0, lineend) != 0) {
        ierr(fn);
        return;
    }
    if (map.start != NULL && munmap(map.start, map.maplen))
        ierr(fn);
}

解説解説:

通常の処理ではバイト、行の処理で分かれていましたが
今回は、統一されています。

ファイルのバッファリングを行うことは
他の処理と同様ですが
その後に、バイトのオフセットか、行オフセットか処理を分岐させています。

対象の文字列を表示し
表示対象の文字をすべて表示した場合

バッファに残っている情報を表示します。

カテゴリー: プログラム, 入門 | タグ: , , | コメント無し »

コメント