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)