#define _GNU_SOURCE #include <wchar.h> size_t wcsnrtombs(char *dest, const wchar_t **src, size_t nwc, size_t len, mbstate_t *ps);
dest が NULL ポインタでなければ、 wcsnrtombs() 関数は ワイド文字文字列の最大 nwc 個までのワイド文字を dest から 始まるマルチバイト文字列に変換する。dest には最大 len バイ トまで書き込まれる。シフト状態 *ps は更新される。実際の効果とし ては、この変換は以下の動作と同じになる: wcrtomb(dest, *src, ps) を呼び、成功が返ったら dest を書き込んだバイト数だけ増やし、*src を 1 増やす。 そして、wcrtomb が成功を返す限りこれを繰り返す。 変換が止まる理由は 3 つ考えられる:
1. (現在のロケールに基づいて)マルチバイト列で表現できないワイド文字に 出会った場合。この場合は、*src は不正なワイド文字を指した状態になり、 (size_t)(-1) が返され、errno に EILSEQ が設定される。
2. L'\0' に出会わないで nwc 個のワイド文字を変換した場合か、長 さの制限によって変換が止められた場合。この場合には、*src は次に 変換されるべきワイド文字を指した状態になり、dest に書き込まれた バイト数が返される。
3. ワイド文字列が終端の L'\0' (これには *ps を初期状態に戻すと いう副作用がある)も含めて全て変換された場合。この場合には *src に NULL が設定され、dest に書き込まれたバイト数が返される (終端の '\0' は数えない)。
dest が NULL ならば len は無視されて前述のように変換が行わ れるが、変換されたバイトデータはメモリに書き出されない点と、出力先の長 さの制限がない点が異なる。
上記のいずれの場合も、ps が NULL ポインタならば、wcsnrtombs 関数 だけが知っている静的な匿名の状態がシフト状態の代わりに用いられる。
プログラマは少なくとも len バイトの領域を dest に確保しな ければならない。
ps に NULL を渡した際の動作はマルチスレッドセーフでない。