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

Posted: 2013年05月30日

今回からユーティリティ関数の解説です。
今まで解説してきた箇所で呼ばれているため
簡単に解説したかもしれませんがここでは、しっかりと書いていきます。

util.c prn_normal関数です。

プログラムプログラム:

int
prn_normal(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)-2) {
            n += printf("%s", s);
            break;
        }
        if (clen == (size_t)-1) {
            memset(&mbs, 0, sizeof(mbs));
            putchar((unsigned char)*s);
            s++;
            n++;
            continue;
        }
        for (i = 0; i < (int)clen; i++)
            putchar((unsigned char)s[i]);
        s += clen;
        if (iswprint(wc))
            n += wcwidth(wc);
    }
    return (n);
}

解説解説:

結局この関数の意図が汲み取れなかったです
分かる方フォローしてくれたら幸い

この関数で行いたいことは

  • 引数の文字列を表示
  • 表示した文字数(Unicodeバイト数)を返却

処理の流れ
mbrtowcでUnicodeに変換し、バイト数を取得します。
返却値-1の場合、
処理ができない文字のためそのまま表示します。
返却値-2の場合、
第三引数に指定したサイズよりも長い文字サイズの場合に発生します。
 printfにてすべての文字を表示し処理を終了します。

通常の場合、
対象の文字を表示し
表示対象の文字(コントロール文字以外 改行文字等)の場合
返却用のバイト数としてカウントします。

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

コメント