Lutger wrote:
simendsjo wrote:

(...)

The CR and LF constants are a bit too much, probably because they don't really abstract over the literals which I can actually parse faster. The isCR and isLF are nice however. Taking it a step further:

bool canSplit = inPattern(c,"\r\n");
if (canSplit)
{
  ...

You have increased the nesting of ifs to 3 inside a for-loop.Personally I don't read deep nesting very well. To go for readability I would use a small function for the entire expression:
if( s[i..$].startsWithCRLF() ) // same as startsWithCRLF(s[i..$])
{
  i++;
  istart++;
}

or use std.algorithm: if ( s[i..$].startsWith("\r\n") )
(...)
Nice. I didn't increase the if nesting though.

Something like this then?

S[] mysplitlines(S)(S s)
{
    size_t istart;

    auto result = Appender!(S[])();

    foreach (i; 0 .. s.length)
    {
        immutable c = s[i];
        immutable isEOL = inPattern(c, "\r\n");
        if (isEOL)
        {
            auto beforeEOL = s[istart .. i];
            result.put(beforeEOL);

            auto rest = s[i .. $];
            immutable isCRLF = rest.startsWith("\r\n");

            istart = i + 1; // consume first EOL character
            if (isCRLF) // skip \n too
            {
                i++;
                istart++;
            }
        }
    }

    // The last line might not end with EOL
    immutable lineNotEmpty = (istart != s.length);
    if (lineNotEmpty)
    {
        auto lastLine = s[istart .. $];
        result.put(lastLine);
    }

    return result.data;
}

Reply via email to