On Fri, Jul 08, 2011 at 04:51:47PM +0100, Nicholas Marriott wrote:
> Except it isn't sizeof(b) or '\0'.
Ooops, right. It's counting in units of ints.
> This actually passes the right length to mbstowcs as well:
This looks good to me.
> Index: wcsdup.3
> ===================================================================
> RCS file: /cvs/src/lib/libc/string/wcsdup.3,v
> retrieving revision 1.2
> diff -u -p -r1.2 wcsdup.3
> --- wcsdup.3 5 Jul 2011 19:01:31 -0000 1.2
> +++ wcsdup.3 8 Jul 2011 15:50:50 -0000
> @@ -61,9 +61,17 @@ The following will point
> to an allocated area of memory containing the nul-terminated string
> .Qq foobar :
> .Bd -literal -offset indent
> -wchar_t *p;
> +const char *o = "foobar";
> +wchar_t *p, b[32];
> +size_t blen;
>
> -if ((p = wcsdup(L"foobar")) == NULL) {
> +blen = sizeof(b) / sizeof(b[0]);
> +if (mbstowcs(b, o, blen) == (size_t)-1) {
> + fprintf(stderr, "Failed to convert string.\en");
> + exit(1);
> +}
> +b[blen - 1] = 0;
> +if ((p = wcsdup(b)) == NULL) {
> fprintf(stderr, "Out of memory.\en");
> exit(1);
> }