changeset 9:0ce5333b21b8

StringExp.toChars() implemented
author korDen
date Wed, 31 Mar 2010 16:20:32 +0400
parents d706d958e4e8
children 661073dd5661
files dmd/StringExp.d
diffstat 1 files changed, 61 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/StringExp.d	Mon Oct 26 16:28:19 2009 +0300
+++ b/dmd/StringExp.d	Wed Mar 31 16:20:32 2010 +0400
@@ -30,6 +30,7 @@
 import core.memory;
 
 import core.stdc.string;
+import core.stdc.ctype;
 
 class StringExp : Expression
 {
@@ -60,9 +61,16 @@
 		assert(false);
 	}
 
-	string toChars()
-	{
-		assert(false);
+	string toChars()
+	{
+		scope OutBuffer buf = new OutBuffer();
+		HdrGenState hgs;
+		char *p;
+
+		memset(&hgs, 0, hgs.sizeof);
+		toCBuffer(buf, &hgs);
+		buf.writeByte(0);
+		return buf.extractString();
 	}
 
 	Expression semantic(Scope sc)
@@ -505,12 +513,60 @@
 
 	uint charAt(size_t i)
 	{
-		assert(false);
+		uint value;
+
+		switch (sz)
+		{
+			case 1:
+				value = (cast(ubyte *)string_)[i];
+				break;
+
+			case 2:
+				value = (cast(ushort *)string_)[i];
+				break;
+
+			case 4:
+				value = (cast(uint *)string_)[i];
+				break;
+
+			default:
+				assert(0);
+				break;
+		}
+		return value;
 	}
 
 	void toCBuffer(OutBuffer buf, HdrGenState* hgs)
 	{
-		assert(false);
+		buf.writeByte('"');
+		for (size_t i = 0; i < len; i++)
+		{
+			uint c = charAt(i);
+
+			switch (c)
+			{
+				case '"':
+				case '\\':
+				if (!hgs.console)
+					buf.writeByte('\\');
+				default:
+				if (c <= 0xFF)
+				{  
+					if (c <= 0x7F && (isprint(c) || hgs.console))
+						buf.writeByte(c);
+					else
+						buf.printf("\\x%02x", c);
+				}
+				else if (c <= 0xFFFF)
+					buf.printf("\\x%02x\\x%02x", c & 0xFF, c >> 8);
+				else
+					buf.printf("\\x%02x\\x%02x\\x%02x\\x%02x", c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF, c >> 24);
+				break;
+			}
+		}
+		buf.writeByte('"');
+		if (postfix)
+			buf.writeByte(postfix);
 	}
 
 	void toMangleBuffer(OutBuffer buf)