www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Converting from C const(dchar*) to dstring

reply "Danyal Zia" <catofdanyal yahoo.com> writes:
Hi, I like to print the strings from a C function that returns 
const(dchar*), but I can't make the conversion to dstring. I can 
convert vice versa by:

dstring text = "Hello";
const(dchar)* str = toUTFz!(const(dchar)*)(text);
// passing it to C function prints Hello

However, I don't have the idea how can I go the other way. I 
tried several methods such as using to!dstring, toUTF32 etc which 
compiles successfully however printing them gives address of them 
instead of text.

Thanks,

Danyal Zia
Jun 24 2014
parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Tue, 24 Jun 2014 13:37:41 -0400, Danyal Zia <catofdanyal yahoo.com>  
wrote:

 Hi, I like to print the strings from a C function that returns  
 const(dchar*), but I can't make the conversion to dstring. I can convert  
 vice versa by:

 dstring text = "Hello";
 const(dchar)* str = toUTFz!(const(dchar)*)(text);
 // passing it to C function prints Hello

 However, I don't have the idea how can I go the other way. I tried  
 several methods such as using to!dstring, toUTF32 etc which compiles  
 successfully however printing them gives address of them instead of text.
const(dchar *)x = ...; // assuming 0 terminated dstring text = x[0..x.strlen].idup; -Steve
Jun 24 2014
next sibling parent reply "Danyal Zia" <catofdanyal yahoo.com> writes:
On Tuesday, 24 June 2014 at 17:59:41 UTC, Steven Schveighoffer 
wrote:
 const(dchar *)x = ...;

 // assuming 0 terminated
 dstring text = x[0..x.strlen].idup;

 -Steve
const(dchar)* x = "Hello\0"; dstring text = x[0..x.strlen].idup; writeln(text); Error: no property 'strlen' for type 'const(dchar)*'
Jun 24 2014
next sibling parent reply "Chris Cain" <zshazz gmail.com> writes:
On Tuesday, 24 June 2014 at 18:17:07 UTC, Danyal Zia wrote:
 On Tuesday, 24 June 2014 at 17:59:41 UTC, Steven Schveighoffer 
 wrote:
 const(dchar *)x = ...;

 // assuming 0 terminated
 dstring text = x[0..x.strlen].idup;

 -Steve
const(dchar)* x = "Hello\0"; dstring text = x[0..x.strlen].idup; writeln(text); Error: no property 'strlen' for type 'const(dchar)*'
You can do what he said, but you'll have to write your own strlen function: something like: size_t strlen(in dchar* s) pure system nothrow { size_t pos = 0; dchar term = '\0'; while(s[pos] != term) ++pos; return pos; } const(dchar)* ds = "hello\0"; dstring text = ds[0..strlen(ds)].idup; writeln(text); works
Jun 24 2014
parent "Danyal Zia" <catofdanyal yahoo.com> writes:
On Tuesday, 24 June 2014 at 18:34:31 UTC, Chris Cain wrote:
 You can do what he said, but you'll have to write your own 
 strlen function:

 something like:

     size_t strlen(in dchar* s) pure  system nothrow
     {
         size_t pos = 0;
         dchar term = '\0';
         while(s[pos] != term)
             ++pos;
         return pos;
     }
     const(dchar)* ds = "hello\0";
     dstring text = ds[0..strlen(ds)].idup;
     writeln(text);

 works
It works indeed, thanks a lot! Any chance of making it into std phobos?
Jun 24 2014
prev sibling parent Justin Whear <justin economicmodeling.com> writes:
On Tue, 24 Jun 2014 18:17:06 +0000, Danyal Zia wrote:

 On Tuesday, 24 June 2014 at 17:59:41 UTC, Steven Schveighoffer wrote:
 const(dchar *)x = ...;

 // assuming 0 terminated dstring text = x[0..x.strlen].idup;

 -Steve
const(dchar)* x = "Hello\0"; dstring text = x[0..x.strlen].idup; writeln(text); Error: no property 'strlen' for type 'const(dchar)*'
A dchar* strlen implementation: http://dpaste.dzfl.pl/a4053387d8a4
Jun 24 2014
prev sibling parent reply "Chris Cain" <zshazz gmail.com> writes:
On Tuesday, 24 June 2014 at 17:59:41 UTC, Steven Schveighoffer 
wrote:
 // assuming 0 terminated
 dstring text = x[0..x.strlen].idup;
strlen is only defined for char, not dchar: https://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/string.d#L44
Jun 24 2014
parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Tue, 24 Jun 2014 14:28:58 -0400, Chris Cain <zshazz gmail.com> wrote:

 On Tuesday, 24 June 2014 at 17:59:41 UTC, Steven Schveighoffer wrote:
 // assuming 0 terminated
 dstring text = x[0..x.strlen].idup;
strlen is only defined for char, not dchar: https://github.com/D-Programming-Language/druntime/blob/master/src/core/stdc/string.d#L44
Right, I forgot about that. -Steve
Jun 24 2014