MBSNRTOWCS(3)

名前
mbsnrtowcs - マルチバイト文字列をワイド文字列に変換する

書式
#include <wchar.h>

size_t mbsnrtowcs(wchar_t *dest, const char **src,
                  size_t nms, size_t len, mbstate_t *ps);

    glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

mbsnrtowcs():
    glibc 2.10 以降:
        _POSIX_C_SOURCE >= 200809L
    glibc 2.10 より前:
        _GNU_SOURCE

説明
mbsnrtowcs() 関数は mbsrtowcs(3) 関数に似ているが、変換するバイト数が *src から始まる最大 nms バイトに制限されている点が異なっている。

dest が NULL でなければ mbsnrtowcs() 関数は *src からのマルチバイト文字列の最大 nms までを dest からのワイド文字列に変換する。 最大 len 文字のワイド文字が dest に書き込まれる。 同時にシフト状態 *ps を更新する。 変換は mbrtowc(dest, *src, n, ps) を、この呼び出しが成功する限り、繰り返し実行したのと実質的に同様である。 ここでの n は正の数であり、繰り返しごとに dest が 1 増加させられ、 *src が消費したバイト数だけ増加させられる。変換は以下の三つの いずれかの条件で停止する:

1.  不正なマルチバイト列に遭遇した。この場合には *src は不正な マルチバイト列を指すようにして、 (size_t) -1 を返し、errno に EILSEQ を設定する。

2.  nms 制限によって強制的に停止するか、len 文字の L'\0' 以外の ワイド文字を dest に格納した場合。この場合は *src は 次に変換されるマルチバイト列を指すようにして、dest に書き込まれた ワイド文字の数を返す。

3.  マルチバイト文字列が終端のヌルワイド文字 ('\0') まで含めて完全に変換された場合。 (この時、副作用として *ps が初期状態に戻される。) この場合は *src には NULL が設定され、 dest に書き込まれた文字数 (終端の ヌルワイド文字は含まれない) を返す。

According to POSIX.1, if the input buffer ends with an incomplete character, it is unspecified whether conversion stops at the end of the previous character (if any), or at the end of the input buffer. The glibc implementation adopts the former behavior.

dest が NULL の場合、len は無視され、上記と同様の変換が 行われるが、変換されたワイド文字はメモリーに書き込まれず、変換先の上限 が存在しない。

上記のどちらの場合でも、ps が NULL ならば、 代りに mbsnrtowcs() 関数のみが使用する静的で名前のない状態が使用される。

プログラマーは dest に最低でも len ワイド文字を書き込むこ とができる空間があることを保証しなければならない。

返り値
mbsnrtowcs() 関数はワイド文字列に変換完了したワイド文字の数を返す。 終端のナルワイド文字は含まない。不正なマルチバイト列に遭遇した場合には (size_t) -1 を返し、errno に EILSEQ を設定する。

属性
この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース | 属性 | 値
mbsnrtowcs() | Thread safety | MT-Unsafe race:mbsnrtowcs/!ps

準拠
POSIX.1-2008.

注意
mbsnrtowcs() の動作は現在のロケールの LC_CTYPE カテゴリーに依存している。

ps に NULL を渡した際の動作はマルチスレッドセーフでない。

関連項目
iconv(3), mbrtowc(3), mbsinit(3), mbsrtowcs(3)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。