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

Posted: 2013年03月21日

前回は、printaname関数を解説してきました。
今回はprintaname関数が表示処理に用いているcolortype関数を解説していきます。

print.c colortype関数です。

プログラムプログラム:

static int
colortype(mode_t mode)
{
    switch (mode & S_IFMT) {
    case S_IFDIR:
        if (mode & S_IWOTH)
            if (mode & S_ISTXT)
                printcolor(C_WSDIR);
            else
                printcolor(C_WDIR);
        else
            printcolor(C_DIR);
        return (1);
    case S_IFLNK:
        printcolor(C_LNK);
        return (1);
    case S_IFSOCK:
        printcolor(C_SOCK);
        return (1);
    case S_IFIFO:
        printcolor(C_FIFO);
        return (1);
    case S_IFBLK:
        printcolor(C_BLK);
        return (1);
    case S_IFCHR:
        printcolor(C_CHR);
        return (1);
    default:;
    }
    if (mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
        if (mode & S_ISUID)
            printcolor(C_SUID);
        else if (mode & S_ISGID)
            printcolor(C_SGID);
        else
            printcolor(C_EXEC);
        return (1);
    }
    return (0);
}

解説解説:

モードに従いprintcolorの引数を変化させ呼び出しています。
設定した場合 1, 設定できなかった場合 0を戻すようです。

では、printcolorはどのような処理を行なっているのでしょうか

プログラムプログラム:

static void
printcolor(Colors c)
{
    char *ansiseq;

    if (colors.bold)
        tputs(enter_bold, 1, putch);

    if (colors.num[0] != -1) {
        ansiseq = tgoto(ansi_fgcol, 0, colors.num[0]);
        if (ansiseq)
            tputs(ansiseq, 1, putch);
    }
    if (colors.num[1] != -1) {
        ansiseq = tgoto(ansi_bgcol, 0, colors.num[1]);
        if (ansiseq)
            tputs(ansiseq, 1, putch);
    }
}

解説解説:

引数は、色配列のindexを表しており、その色設定で処理を行なっています。
この関数で登場するtgoto,tputsは端末(コンソール)操作関数です。
tgotoでterncap(端末操作DB)からansi_fgcolに割り当たった文字を取得します。
取得ができた場合は、tputsにて色設定を行なっています。

tputsにputch関数ポインターを渡し、出力する文字(ansiseq)を端末に出力します。
putchは、putchar関数を呼び出す関数になっています。
短い関数のためコードの掲載は、省略します。

色設定は簡易的に書きますが

x1b[40mで背景色黒
x1bは(ESC文字)
40m-47mまでが背景色
30m-37mまでが前景色

その他の設定も可能です。

color配列は、main関数にてparsecolorを呼び出し設定を行なっています。

#ifdef COLORLS
    if (f_color) {
        /*
         * We can't put tabs and color sequences together:
         * column number will be incremented incorrectly
         * for "stty oxtabs" mode.
         */
        f_notabs = 1;
        (void)signal(SIGINT, colorquit);
        (void)signal(SIGQUIT, colorquit);
        parsecolors(getenv("LSCOLORS"));
    }
#endif

今までが色設定処理でしたが
次は、色設定終了処理です。

プログラムプログラム:

static void
endcolor(int sig)
{
    tputs(ansi_coloff, 1, sig ? writech : putch);
    tputs(attrs_off, 1, sig ? writech : putch);
}

解説解説:

この処理では、色設定を解除します。
引数によりwritech、putchを切り替えます。
writechでは、STDOUT(標準出力)に出力します。
putchは、端末に出力します。
lsの呼び出され方によって処理が変わり、指定された標準出力に出力がされる動作になります。

以上が色設定処理です。
次回は、前回と同様に出力処理関数printlongについて記述いたします。

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

コメント