[Issue 6878] New: Mutable result for toStringz()
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Nov 1 17:49:26 PDT 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6878
Summary: Mutable result for toStringz()
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: Phobos
AssignedTo: nobody at puremagic.com
ReportedBy: bearophile_hugs at eml.cc
--- Comment #0 from bearophile_hugs at eml.cc 2011-11-01 17:48:57 PDT ---
In some situations you have to call C functions that accept a char* (not
const). For simplify such usage cases I'd like std.string.toStringz to be
closer to this:
import core.stdc.string;
char* toStringz(immutable(char[]) s) pure nothrow
in
{
// The assert below contradicts the unittests!
//assert(memchr(s.ptr, 0, s.length) == null,
//text(s.length, ": `", s, "'"));
}
out (result)
{
if (result)
{
auto slen = s.length;
while (slen > 0 && s[slen-1] == 0) --slen;
assert(strlen(result) == slen);
assert(memcmp(result, s.ptr, slen) == 0); // overkill?
}
}
body
{
/+ Unfortunately, this isn't reliable.
We could make this work if string literals are put
in read-only memory and we test if s[] is pointing into
that.
/* Peek past end of s[], if it's 0, no conversion necessary.
* Note that the compiler will put a 0 past the end of static
* strings, and the storage allocator will put a 0 past the end
* of newly allocated char[]'s.
*/
char* p = &s[0] + s.length;
if (*p == 0)
return s;
+/
// Need to make a copy
auto copy = new char[s.length + 1];
copy[0 .. s.length] = s[];
copy[s.length] = '\0';
return copy.ptr;
}
void main() {
string t = "hello";
char* s1 = toStringz(t);
const(char*) s2 = toStringz(t);
immutable(char*) s3 = toStringz(t);
immutable(char)* s4 = toStringz(t);
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list