p .Fn mbrlen is equivalent to the following call (except .Fa ps is evaluated only once):
p d -literal mbrtowc(NULL, s, n, (ps != NULL) ? ps : &internal); .Ed
p Here, .Fa internal is an internal state object.
p In state-dependent encodings, .Fa s may point the special sequence bytes to change the shift-state. Although such sequence bytes corresponds to no individual wide-character code, these affect the conversion state object pointed by .Fa ps , and the .Fn mbrlen treats the special sequence bytes as if these are a part of the subsequent multibyte character.
p Unlike .Xr mblen 3 , the .Fn mbrlen may accept the byte sequence being not complete character but possible to consist a part of a valid character. In this case, this function will accept the all such bytes and save them into the conversion state object pointed by .Fa ps . They will be used at the subsequent call of this function to restart the conversion suspended.
p The behaviour of the .Fn mbrlen is affected by LC_CTYPE category of the current locale.
p There are the special cases: l -tag -width 0123456789 t "s == NULL" The .Fn mbrlen sets the conversion state object pointed by .Fa ps to an initial state and always return 0. Unlike .Xr mblen 3 , the value returned does not indicate whether the current encoding of the locale is state-dependent.
p In this case, the .Fn mbrlen ignores .Fa n . t "n == 0" In this case, the first .Fa n bytes of the array pointed by .Fa s never form a complete character. Thus, the .Fn mbrlen always returns (size_t)-2. t "ps == NULL" The .Fn mbrlen uses its own internal state object to keep the conversion state, instead of .Fa ps mentioned in this manual page.
p
Calling any other functions in the
.Lb libc
never change the internal
state of the
.Fn mbrlen ,
except for calling
.Xr setlocale 3
with changing LC_CTYPE category of the current locale.
Such
.Xr setlocale 3
call causes the internal state of this function to be indeterminate.
This internal state is initialized at startup time of the program.
.El
----------------------------------------------------------------------
.Sh RETURN VALUES
The
.Fn mbrlen
returns:
l -tag -width 0123456789 t "0" .Fa s
points a null byte (\'\\0\').
t "positive" The value returned is
a number of bytes for the valid multibyte character pointed by
.Fa s .
There is no cases that this value is greater than
.Fa n
or the value of MB_CUR_MAX macro.
t "(size_t)-2" .Fa s
points the byte sequence which is possible to consist a part of valid
multibyte character but incomplete.
When
.Fa n
is at least MB_CUR_MAX,
this case can only occur if the array pointed
.Fa s
contains redundant shift sequence.
t "(size_t)-1" .Fa s
points a illegal byte sequence which does not form a valid multibyte
character.
In this case, the
.Fn mbrtowc
sets errno to indicate the error.
.El
----------------------------------------------------------------------
.Sh ERRORS
The
.Fn mbrlen
may causes an error in the following case:
l -tag -width Er t Bq Er EILSEQ .Fa s
points an invalid multibyte character.
t Bq Er EINVAL .Fa ps
points an invalid or uninitialized mbstate_t object.
.El
----------------------------------------------------------------------
.Sh SEE ALSO
.Xr mblen 3 ,
.Xr mbrtowc 3 ,
.Xr setlocale 3
----------------------------------------------------------------------
.Sh STANDARDS
The
.Fn mbrlen
function conforms to
.St -isoC-amd1 .
The restrict qualifier is added at
.St -isoC99 .