p .Fn mbrlen is equivalent to the following call (except .Fa ps is evaluated only once): d -literal -offset indent 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 to 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 to 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 , .Fn mbrlen may accept the byte sequence when it is not a complete character but possibly contains part of a valid character. In this case, this function will accept all such bytes and save them into the conversion state object pointed to by .Fa ps . They will be used on subsequent calls of this function to restart the conversion suspended.
p The behaviour of .Fn mbrlen is affected by the .Dv LC_CTYPE category of the current locale.
p These are the special cases: l -tag -width 0123456789 t "s == NULL" .Fn mbrlen sets the conversion state object pointed to by .Fa ps to an initial state and always returns 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, .Fn mbrlen ignores .Fa n . t "n == 0" In this case, the first .Fa n bytes of the array pointed to by .Fa s never form a complete character. Thus, .Fn mbrlen always returns (size_t)-2. t "ps == NULL" .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
.Lb libc
never changes the internal
state of
.Fn mbrlen ,
except for calling
.Xr setlocale 3
with a changing
.Dv LC_CTYPE
category of the current locale.
Such
.Xr setlocale 3
calls cause 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 to a nul byte
q Sq \e0 .
t "positive" The value returned is
a number of bytes for the valid multibyte character pointed to by
.Fa s .
There are no cases that this value is greater than
.Fa n
or the value of the
.Dv MB_CUR_MAX
macro.
t "(size_t)-2" .Fa s
points to the byte sequence which possibly contains part of a valid
multibyte character, but which is incomplete.
When
.Fa n
is at least
.Dv MB_CUR_MAX ,
this case can only occur if the array pointed to by
.Fa s
contains a redundant shift sequence.
t "(size_t)-1" .Fa s
points to an illegal byte sequence which does not form a valid multibyte
character.
In this case,
.Fn mbrtowc
sets
.Va errno
to indicate the error.
.El
----------------------------------------------------------------------
.Sh ERRORS
.Fn mbrlen
may cause an error in the following case:
l -tag -width Er t Bq Er EILSEQ .Fa s
points to an invalid multibyte character.
t Bq Er EINVAL .Fa ps
points to 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 -isoC-99 .