Hi

On Tue, Jul 05, 2011 at 08:12:44PM +0200, Stefan Sperling wrote:
> On Tue, Jul 05, 2011 at 01:52:06PM -0400, Todd C. Miller wrote:
> > Also, what is that
> > 'L' doing there before the "foobar"?  Is it some sort of wide char
> > thing I'm not aware of?
> >
> 
> L"" is C99 notation for wide character string literals.
> wchar_t is an int, so a pointer increment will consume 4 bytes, not 1.
> L"foobar" results in the byte string:
> "f\0\0\0o\0\0\0o\0\0\0b\0\0\0a\0\0\0r\0\0\0\0\0\0\0"
> 
> The standard says the multibyte-encoding used by L"" is
> implementation-defined. I am not entirely sure what rules our various
> gcc versions apply. L"" might not work in all locales on OpenBSD.
> So generally it's better to use something like mbstowcs() instead of L"".
> Conversion performed at runtime will always be correct for the active locale.

Something like this?

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 02:01:22 -0000
@@ -61,9 +61,14 @@ 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];
 
-if ((p = wcsdup(L"foobar")) == NULL) {
+if (mbstowcs(b, o, sizeof(b)) == (size_t)-1) {
+       fprintf(stderr, "Failed to convert string.\en");
+       exit(1);
+}
+if ((p = wcsdup(b)) == NULL) {
        fprintf(stderr, "Out of memory.\en");
        exit(1);
 }

Reply via email to