Johannes Pfau wrote:
struct CString(T)
      if (isSomeChar!T)
{
      T* str;
}

@property
auto cstring(S : T*, T)(S str)
      if (isSomeChar!T)
{
      return CString!T(str);
}

string test = "abc";
immutable(char)* p = test.ptr;

writefln("%s", p.cstring); // prints "abc"

Here the char pointer type is "annotated" as null terminated string
and writefln can use this information.

If CString implemented a toString method (probably the variant taking a
sink delegate), this would already work.

I reworked this example to form a forward range:

http://dpaste.dzfl.pl/7ab1eeec

The major advantage over "%zs" is that it could be used anywhere, not only with writef().

For example C binding writers may change:

extern(C) char* getstr();

to

extern(C) cstring getstr();

so the string may be immediately used with writef();

> I'm not sure about performance
> though: Isn't writing out bigger buffers a lot faster than writing
> single chars? You could print every char individually, but wouldn't a
> p[0 .. strlen(p)] usually be faster?

I think it internally prints single characters anyway. At least it must test each character if it's not zero valued. strlen() does that.

Reply via email to