Thread overview
string to char* in betterC
Mar 11, 2020
Abby
Mar 11, 2020
9il
Mar 11, 2020
9il
Mar 11, 2020
rikki cattermole
March 11, 2020
What is the proper way to get char* from string which is used in c functions? toStringz does returns:

/usr/include/dmd/phobos/std/array.d(965,49): Error: TypeInfo cannot be used with -betterC

and I think string.ptr is not safe because it's not zero termined. So what should I do? realloc each string with /0?

Thank you for your help
March 11, 2020
On Wednesday, 11 March 2020 at 16:07:06 UTC, Abby wrote:
> What is the proper way to get char* from string which is used in c functions? toStringz does returns:
>
> /usr/include/dmd/phobos/std/array.d(965,49): Error: TypeInfo cannot be used with -betterC
>
> and I think string.ptr is not safe because it's not zero termined. So what should I do? realloc each string with /0?
>
> Thank you for your help

1. Yes.
2. A compile-time known or constants always contain trailing zero.

static immutable "some text"; // contains \0 after the data.

March 12, 2020
On 12/03/2020 5:07 AM, Abby wrote:
> What is the proper way to get char* from string which is used in c functions? toStringz does returns:
> 
> /usr/include/dmd/phobos/std/array.d(965,49): Error: TypeInfo cannot be used with -betterC
> 
> and I think string.ptr is not safe because it's not zero termined. So what should I do? realloc each string with /0?
> 
> Thank you for your help

String literals are null terminated so you can pass them straight to C.

toStringz will of course not work as that relies on the GC.
March 11, 2020
On Wednesday, 11 March 2020 at 16:10:48 UTC, 9il wrote:
> On Wednesday, 11 March 2020 at 16:07:06 UTC, Abby wrote:
>> What is the proper way to get char* from string which is used in c functions? toStringz does returns:
>>
>> /usr/include/dmd/phobos/std/array.d(965,49): Error: TypeInfo cannot be used with -betterC
>>
>> and I think string.ptr is not safe because it's not zero termined. So what should I do? realloc each string with /0?
>>
>> Thank you for your help

3. You can use mir-algorithm for simplicity and speed

----
/+dub.sdl:
dependency "mir-algorithm" version="~>3.7.18"
+/
import mir.format;
import core.stdc.stdio;

void main() {
    printf("some_string %s", (stringBuf() << "other_string" << "\0" << getData).ptr);
}
----

stringBuf() uses stack if the inner string fits into it. So, It is a mutch master than malloc/free. However, in this case C function should return pointer ownership to the caller.