Mercurial > projects > ddmd
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)