September 20

On Thursday, 19 September 2024 at 14:30:08 UTC, Gerardo Cahn wrote:

>

I am using the code listed here.

It should be left to posterity that the code presented in this thread cannot properly escape

   "A\xfeZ"
BV's escape: cast(char) 0x41, cast(char) 0xFE, cast(char) 0x5A
steve's: cast(char) 0x41, cast(char) 0xFE, cast(char) 0x5A

nor ("and possibly unicode ones too,", cy March 31, 2016)

   "A\u00fcZ"
BV's escape: AüZ
steve's: AüZ
September 22

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

1 2
Next ›   Last »