| |
| Posted by Salih Dincer in reply to Gerardo Cahn | PermalinkReply |
|
Salih Dincer
Posted in reply to Gerardo Cahn
| On Thursday, 19 September 2024 at 14:30:08 UTC, Gerardo Cahn wrote:
> On Wednesday, 24 August 2022 at 08:12:33 UTC, Salih Dincer wrote:
> On Tuesday, 23 August 2022 at 23:17:21 UTC, Salih Dincer wrote:
...
Actually, both structures could be combined:
struct EscapedString
{
string[1] str;
this(string str) @nogc pure nothrow @safe
{
...(rest clipped)
Thanks to all. I am using the code listed here. I can't but feel like Salieri with Mozart: I know enough D to appreciate this thread, but not enough to create this on my own...
This must be a metaphor, from the past...
I would like to thank you for saying "hello" to the silence. Thanks to you, I have just developed the missing parts of the code. I am sure that if the silent majority criticized such codes, the field would be beautiful.
I hadn't thought about UTF codes before, they seem to work. What do you think?
import std.stdio;
void main()
{
enum str = r"\tHello\xfeD\r\nProgramming\0\nWorld!\b\f";
auto u = str.unescaped();
auto e = u.escaped();
assert(e == str);
u.unescaped.writeln;
}
auto escaped(string str)
{
import std.algorithm : map;
import std.conv : to, toChars;
import std.string : format;
return str.map!(chr => ()
{
auto code = chr.to!ulong;
if (code >= 0x7f)
{
return code.toChars!(16, char)
.format!"\\x%-(%c%)";
}
switch (code)
{
case '\0': return `\0`;
case '\b': return `\b`;
case '\f': return `\f`;
case '\t': return `\t`;
case '\n': return `\n`;
case '\r': return `\r`;
case '"': return `\"`;
case '\'': return `\'`;
case '\\': return `\\`;
//case ' ': return `\s`;
default: return chr.to!string;
}
}()).format!"%-(%s%)";
}
string unescaped(string str)
{
import std.format : fs = FormatSpec;
import std.format : uv = unformatValue;
fs!char f;
auto s = `["` ~ str ~ `"]`;
return uv!(string[])(s, f)[0];
}
SDB@79
|