# HG changeset patch # User korDen # Date 1270038032 -14400 # Node ID 0ce5333b21b80558a330daf23b6bb6829fee2399 # Parent d706d958e4e82f321817cd974486500cd1aa5e9b StringExp.toChars() implemented diff -r d706d958e4e8 -r 0ce5333b21b8 dmd/StringExp.d --- 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)