manual: Move mbstouwcs to an example C file

This commit is contained in:
Florian Weimer 2018-04-05 12:50:58 +02:00
parent 08e92e2443
commit 0f33925269
3 changed files with 34 additions and 22 deletions

View file

@ -1,3 +1,8 @@
2018-04-05 Florian Weimer <fweimer@redhat.com>
* manual/examples/mbstouwcs.c: New file.
* manual/charset.texi (Converting a Character): Include it.
2018-04-05 Samuel Thibault <samuel.thibault@ens-lyon.org>
* include/dirent.h (dirfd): Add hidden proto.

View file

@ -686,28 +686,7 @@ converting all lowercase characters into uppercase could look like this
checking, and sometimes leaks memory):
@smallexample
wchar_t *
mbstouwcs (const char *s)
@{
size_t len = strlen (s);
wchar_t *result = malloc ((len + 1) * sizeof (wchar_t));
wchar_t *wcp = result;
wchar_t tmp[1];
mbstate_t state;
size_t nbytes;
memset (&state, '\0', sizeof (state));
while ((nbytes = mbrtowc (tmp, s, len, &state)) > 0)
@{
if (nbytes >= (size_t) -2)
/* Invalid input string. */
return NULL;
*wcp++ = towupper (tmp[0]);
len -= nbytes;
s += nbytes;
@}
return result;
@}
@include mbstouwcs.c.texi
@end smallexample
The use of @code{mbrtowc} should be clear. A single wide character is

View file

@ -0,0 +1,28 @@
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
/* Do not include the above headers in the example.
*/
wchar_t *
mbstouwcs (const char *s)
{
size_t len = strlen (s);
wchar_t *result = malloc ((len + 1) * sizeof (wchar_t));
wchar_t *wcp = result;
wchar_t tmp[1];
mbstate_t state;
size_t nbytes;
memset (&state, '\0', sizeof (state));
while ((nbytes = mbrtowc (tmp, s, len, &state)) > 0)
{
if (nbytes >= (size_t) -2)
/* Invalid input string. */
return NULL;
*wcp++ = towupper (tmp[0]);
len -= nbytes;
s += nbytes;
}
return result;
}