Mercurial > projects > ddmd
changeset 48:0bd8afbaffd7
StringExp.length & StringExp.toUTF8
author | korDen |
---|---|
date | Sat, 21 Aug 2010 07:39:45 +0400 |
parents | 488f3f6bcceb |
children | 0aa7d1437ada |
files | dmd/StringExp.d |
diffstat | 1 files changed, 60 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/dmd/StringExp.d Sat Aug 21 07:39:27 2010 +0400 +++ b/dmd/StringExp.d Sat Aug 21 07:39:45 2010 +0400 @@ -19,6 +19,7 @@ import dmd.HdrGenState; import dmd.Utf; import dmd.Util; +import dmd.WANT; import dmd.backend.dt_t; import dmd.backend.Symbol; import dmd.backend.StringTab; @@ -172,14 +173,71 @@ assert(false); } + /********************************** + * Return length of string. + */ size_t length() { - assert(false); + size_t result = 0; + dchar c; + string p; + + switch (sz) + { + case 1: + for (size_t u = 0; u < len;) + { + p = utf_decodeChar(cast(string)string_[0..len], &u, &c); + if (p) + { + error("%s", p); + break; + } + else + result++; + } + break; + + case 2: + for (size_t u = 0; u < len;) + { + p = utf_decodeWchar(cast(wstring)string_[0..len], &u, &c); + if (p) + { error("%s", p); + break; + } + else + result++; + } + break; + + case 4: + result = len; + break; + + default: + assert(0); + } + return result; } + /**************************************** + * Convert string to char[]. + */ StringExp toUTF8(Scope sc) { - assert(false); + if (sz != 1) + { + // Convert to UTF-8 string + committed = 0; + Expression e = castTo(sc, Type.tchar.arrayOf()); + e = e.optimize(WANTvalue); + assert(e.op == TOKstring); + StringExp se = cast(StringExp)e; + assert(se.sz == 1); + return se; + } + return this; } Expression implicitCastTo(Scope sc, Type t)