On 5/5/16 11:53 AM, pineapple wrote:
On Thursday, 5 May 2016 at 07:49:46 UTC, aki wrote:
Hello,
When I need to call C function, often need to
have char* pointer from string.
This might help:
import std.traits : isSomeString;
import std.string : toStringz;
extern (C) int strcmp(char* string1, char* string2);
int strcmpD0(S)(in S lhs, in S rhs) if(is(S == string) || is(S ==
const(char)[])) { // Best
return strcmp(
cast(char*) toStringz(lhs),
cast(char*) toStringz(rhs)
);
}
This is likely a correct solution, because strcmp does not modify any
data in the string itself.
Practically speaking, you can define strcmp as taking const(char)*. This
is what druntime does: http://dlang.org/phobos/core_stdc_string.html#.strcmp
int strcmpD1(S)(in S lhs, in S rhs) if(is(S == string) || is(S ==
const(char)[])) { // Works
return strcmp(
cast(char*) lhs.ptr,
cast(char*) rhs.ptr
);
}
Note, this only works if the strings are literals. Do not use this
mechanism in general.
/+
int strcmpD2(S)(in S lhs, in S rhs) if(is(S == string) || is(S ==
const(char)[])) { // Breaks
return strcmp(
toStringz(lhs),
toStringz(rhs)
);
}
+/
Given a possibility that you are calling a C function that may actually
modify the data, there isn't a really good way to do this.
Only thing I can think of is.. um... horrible:
char *toCharz(string s)
{
auto cstr = s.toStringz;
return cstr[0 .. s.length + 1].dup.ptr;
}
-Steve