www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 7146] New: enhance strip* (implementation provided)

http://d.puremagic.com/issues/show_bug.cgi?id=7146

           Summary: enhance strip* (implementation provided)
           Product: D
           Version: D2
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: pompei2 gmail.com



In some languages (e.g. python), the string "strip" function family accepts an
optional parameter which specifies the set of characters one wants to strip. If
not given, this is "whitespace". I think this is very useful and the D strip
should support that too.

For example, I needed it when getting a char buffer filled by a C function and
converting it to a string. Here is the implementation of these including
unittests that you can just drop into the string.d file if you remove the
import line. I would very much like to see this included in phobos - no
copyright/whatever needed.




// Remove when integrating into std.string.
import std.range, std.string, std.traits, std.utf;

/++
    Strips leading characters.
  +/
S stripLeft(S)(S s, S charsToStrip) pure
    if(isSomeString!S)
{
    bool foundIt;
    size_t notInSet;
    foreach(i, dchar c; s)
    {
        // Because of the call to indexOf, this function can't be  safe
anymore.
        if(indexOf(charsToStrip, c) == -1)
        {
            foundIt = true;
            notInSet = i;
            break;
        }
    }

    if(foundIt)
        return s[notInSet .. $];

    return s[0 .. 0]; //Empty string with correct type.
}

unittest {
    debug(string) printf("string.stripLeft2.unittest\n");

    string hi = "Hello, world!";
    assert(hi.stripLeft("") == hi);
    assert(hi.stripLeft("H") == "ello, world!");
    assert(hi.stripLeft("Hel") == "o, world!");
    assert(hi.stripLeft("def") == hi);
    assert(hi.stripLeft(hi) == "");
}

/++
    Strips trailing characters.
  +/
S stripRight(S)(S s, S charsToStrip)
    if(isSomeString!S)
{
    alias typeof(s[0]) C;
    size_t codeLen;
    foreach(dchar c; retro(s))
    {
        // Because of the call to indexOf, this function can't be  safe
anymore.
        if(indexOf(charsToStrip, c) >= 0)
            codeLen += codeLength!C(c);
        else
            break;
    }

    return s[0 .. $ - codeLen];
}

unittest {
    debug(string) printf("string.stripRight2.unittest\n");

    string hi = "Hello, worldd!";
    assert(hi.stripRight("") == hi);
    assert(hi.stripRight("!") == "Hello, worldd");
    assert(hi.stripRight("!.d") == "Hello, worl");
    assert(hi.stripRight("hex") == hi);
    assert(hi.stripRight(hi) == "");
}

/++
    Strips both leading and trailing characters.
  +/
S strip(S)(S s, S charsToStrip)
    if(isSomeString!S)
{
    return stripRight(stripLeft(s, charsToStrip), charsToStrip);
}

unittest {
    debug(string) printf("string.strip2.unittest\n");

    string hi = " ohfoo";
    assert(hi.strip("") == hi);
    assert(hi.strip(" ") == "ohfoo");
    assert(hi.strip(" o") == "hf");
    assert(hi.strip("ext") == hi);
    assert(hi.strip(" ohf") == "");
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 21 2011