On Monday, 24 May 2021 at 14:02:14 UTC, Mike Parker wrote:
The blog:
https://dlang.org/blog/2021/05/24/interfacing-d-with-c-strings-part-one/



Good!

toStringz()

Technically we can use 'reserve()' for reserve memory. Possible, memory already reserved.
    s.reserve( s.length + 1 );
Then we can set trailing zero.
    s[ $ ] = '\0';
And return pointer.
    return s.ptr;
In this case we prevent memory allocation. Operations will be faster.

In other case we cam:
    auto copy = new char[s.length + 1];
    copy[0 .. s.length] = s[];
    copy[s.length] = 0;

    return &assumeUnique(copy)[0];

Example:
    immutable(char)* toStringz( ref string s )
    {
        if ( s.capacity <= s.length )
            s.reserve( s.length + 1 );

        char* cptr = cast( char* ) s.ptr; // C ptr
        char* zptr = cptr + s.length;     // zero ptr
        *zptr = '\0';

        return cast( immutable(char)* ) cptr;
    }

Test code: https://run.dlang.io/is/xZwwtw

Reply via email to