123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
|
/*******************************************************************************
copyright: Copyright (c) 2006 Keinfarbton. All rights reserved
license: BSD style: $(LICENSE)
version: Initial release: October 2006
author: Keinfarbton & Kris
*******************************************************************************/
module tango.stdc.stringz;
/*********************************
* Convert array of chars to a C-style 0 terminated string.
* Providing a tmp will use that instead of the heap, where
* appropriate.
*
* Warning, don't read from the memory pointed to in the tmp variable after calling this function.
*/
inout(char)* toStringz (inout(char)[] s, char[] tmp=null)
{
auto len = s.length;
if (s.ptr)
{
if (len is 0)
{
s = cast(inout(char)[])("\0".dup);
}
else if (s[len-1] != 0)
{
if (tmp.length <= len)
tmp = new char[len+1];
tmp [0..len] = s;
tmp [len] = 0;
s = cast(inout(char)[])tmp;
}
}
return s.ptr;
}
/*********************************
* Convert a series of char[] to C-style 0 terminated strings, using
* tmp as a workspace and dst as a place to put the resulting char*'s.
* This is handy for efficiently converting multiple strings at once.
*
* Returns a populated slice of dst
*
* Warning, don't read from the memory pointed to in the tmp variable after calling this function.
*
* Since: 0.99.7
*/
inout(char)*[] toStringz (char[] tmp, inout(char)*[] dst, inout(char)[][] strings...)
{
assert (dst.length >= strings.length);
auto len = strings.length;
foreach (s; strings)
len += s.length;
if (tmp.length < len)
tmp.length = len;
foreach (i, s; strings)
{
dst[i] = toStringz (s, tmp);
tmp = tmp [s.length + 1 .. len];
}
return dst [0 .. strings.length];
}
/*********************************
* Convert a C-style 0 terminated string to an array of char
*/
inout(char)[] fromStringz (inout(char)* s)
{
return s ? s[0 .. strlenz(s)] : null;
}
/*********************************
* Convert array of wchars s[] to a C-style 0 terminated string.
*/
inout(wchar)* toString16z (inout(wchar)[] s)
{
if (s.ptr)
if (! (s.length && s[$-1] is 0))
s = cast(inout(wchar)[])(s ~ "\0"w);
return s.ptr;
}
/*********************************
* Convert a C-style 0 terminated string to an array of wchar
*/
inout(wchar)[] fromString16z (inout(wchar)* s)
{
return s ? s[0 .. strlenz(s)] : null;
}
/*********************************
* Convert array of dchars s[] to a C-style 0 terminated string.
*/
inout(dchar)* toString32z (inout(dchar)[] s)
{
if (s.ptr)
if (! (s.length && s[$-1] is 0))
s = cast(inout(dchar)[])(s ~ "\0"d);
return s.ptr;
}
/*********************************
* Convert a C-style 0 terminated string to an array of dchar
*/
inout(dchar)[] fromString32z (inout(dchar)* s)
{
return s ? s[0 .. strlenz(s)] : null;
}
/*********************************
* portable strlen
*/
size_t strlenz(T) (const(T)* s)
{
size_t i;
if (s)
while (*s++)
++i;
return i;
}
debug (UnitTest)
{
import tango.stdc.stdio;
unittest
{
debug(string) printf("stdc.stringz.unittest\n");
const(char)* p = toStringz("foo");
assert(strlenz(p) == 3);
const(char)[] foo = "abbzxyzzy";
p = toStringz(foo[3..5]);
assert(strlenz(p) == 2);
const(char)[] test = "\0";
p = toStringz(test);
assert(*p == 0);
assert(p == test.ptr);
}
}
|