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

Posted: 2013年06月13日

前回はユーティリティのprn_printable関数に書きました。
今回は、len_octal関数です。

前回の関数とは、名称が異なるため
違う処理を行うかと思いきや

ほとんど似たような処理です。

util.c len_octal関数です。

プログラムプログラム:

size_t
len_octal(const char *s, int len)
{
    mbstate_t mbs;
    wchar_t wc;
    size_t clen, r;

    memset(&mbs, 0, sizeof(mbs));
    r = 0;
    while (len != 0 && (clen = mbrtowc(&wc, s, len, &mbs)) != 0) {
        if (clen == (size_t)-1) {
            r += 4;
            s++;
            len--;
            memset(&mbs, 0, sizeof(mbs));
            continue;
        }
        if (clen == (size_t)-2) {
            r += 4 * len;
            break;
        }
        if (iswprint(wc))
            r++;
        else
            r += 4 * clen;
        s += clen;
    }
    return (r);
}

解説解説:

今回もいつもと同じと言いたいところですが

今回の関数は他とは大きく違う点があります。

関数コメントがついています。

/*
 * The fts system makes it difficult to replace fts_name with a different-
 * sized string, so we just calculate the real length here and do the
 * conversion in prn_octal()
 *
 * XXX when using f_octal_escape (-b) rather than f_octal (-B), the
 * length computed by len_octal may be too big. I just can't be buggered
 * to fix this as an efficient fix would involve a lookup table. Same goes
 * for the rather inelegant code in prn_octal.
 *
 *                      DES 1998/04/23
 */

ファイルシステムから取得したファイル名と異なるサイズの文字列を置換しようとした場合
通常の文字サイズ取得では、不便なため用意したようです。
octal_escape(8進数エスケープ)を用いて表現をするようです。
「00」の4文字

そう言われても
いまいちピンとこない

次回のprn_octalに期待という事で
この関数について以降書いていきます。

基本的には、表現できない文字は、8進数に変換するため
「4 * 変換できない文字数」を返してしいます。

表現できる文字は、そのまま表示を行うため(prn_octalにて)1文字扱いです。
C言語入門(43) 実際にプログラムを読んで理解を深めよう ls編(17)

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

コメント