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

Posted: 2013年04月18日

前回まで、printlong関数を解説してきました。
今回は同じ表示処理のprintstream関数を解説していきます。

print.c printstream関数です。

プログラムプログラム:

void
printstream(const DISPLAY *dp)
{
    FTSENT *p;
    int chcnt;

    for (p = dp->list, chcnt = 0; p; p = p->fts_link) {
        if (p->fts_number == NO_PRINT)
            continue;
        /* XXX strlen does not take octal escapes into account. */
        if (strlen(p->fts_name) + chcnt +
            (p->fts_link ? 2 : 0) >= (unsigned)termwidth) {
            putchar('n');
            chcnt = 0;
        }
        chcnt += printaname(p, dp->s_inode, dp->s_block);
        if (p->fts_link) {
            printf(", ");
            chcnt += 2;
        }
    }
    if (chcnt)
        putchar('n');
}

解説解説:

この関数は、カンマ区切りでファイル名を列挙します。

いままでの表示関数と同様の処理が見られますが
上から解説を書いていきます。

NO_PRINTで、対象外のファイルを除外しています。
「.」や「..」などです。

文字列が表示幅よりも超えた場合
改行文字を追加しています。
chcntが一行の文字数を格納しています。

ファイル名を追加後
カンマで連結します。

最後の場合は、連結をしません

if(p->fts_link)

printlong関数と比べると表示内容も少ない分
処理がシンプルになっています。

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

コメント