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

Posted: 2013年06月06日

前回はユーティリティのprn_normal関数に書きました。
今回は、似たような関数prn_printable関数です。

printable: 表示可能?
前回のprn_normalも表示チェックをしていましたが
何が違うんでしょうか

util.c len_octal関数です。

プログラムプログラム:

int
prn_printable(const char *s)
{
    mbstate_t mbs;
    wchar_t wc;
    int i, n;
    size_t clen;

    memset(&mbs, 0, sizeof(mbs));
    n = 0;
    while ((clen = mbrtowc(&wc, s, MB_LEN_MAX, &mbs)) != 0) {
        if (clen == (size_t)-1) {
            putchar('?');
            s++;
            n++;
            memset(&mbs, 0, sizeof(mbs));
            continue;
        }
        if (clen == (size_t)-2) {
            putchar('?');
            n++;
            break;
        }
        if (!iswprint(wc)) {
            putchar('?');
            s += clen;
            n++;
            continue;
        }
        for (i = 0; i < (int)clen; i++)
            putchar((unsigned char)s[i]);
        s += clen;
        n += wcwidth(wc);
    }
    return (n);
}

解説解説:

前回のprn_normalとの違いは、
表示できない、変換エラーの場合は「?」を表示する

無理して表示しないという事なんでしょうか?

mbrtowcの戻り値については、
前回の投稿を見てもらえればと・・・

言わずに書きます。

mbrtowcでUnicodeに変換し、バイト数を取得します。
返却値-1の場合、
処理ができない文字のため「?」表示します。
返却値-2の場合、
第三引数に指定したサイズよりも長い文字サイズの場合に発生します。
 「?」を表示し、変換バッファーを0クリアし次の文字を処理します。

変換できた場合でも表示文字以外の場合は「?」を表示します。

ほかは、対象の文字を表示します。

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

コメント