uniblab icon

Improved word/string scanner

uniblab | PRO | 12/05/20 04:08:09 AM UTC | 0 ⭐ | 2028 👁️ | Never ⏰ | []
C# |

2.15 KB

|

None

|

0 👍

/

0 👎

public static System.Collections.Generic.IEnumerable<System.String> ReadWord( System.String input ) {
    input ??= System.String.Empty;
 
    var inlen = input.Length;
    System.Int32 start = 0;
    System.Int32 stop;
    System.Func<System.String, System.Int32, System.Int32, System.String> substr = null;
    do {
        while ( ( start < inlen ) && System.Char.IsWhiteSpace( input[ start ] ) ) {
            start++;
        }
        if ( start == inlen ) {
            yield break;
        } else if ( '(' == input[ start ] ) {
            stop = ReadString( input, start );
            substr = ( a, b, c ) => UnescapeString( a.Substring( b, c - b ) );
        } else {
            stop = ReadWord( input, start );
            substr = ( a, b, c ) => a.Substring( b, c - b );
        }
        if ( start == stop ) {
            yield break;
        } else {
            yield return substr( input, start, stop - start );
        }
        start = stop;
    } while ( start < inlen );
 
    yield break;
}
private static System.String UnescapeString( System.String input ) {
    var sb = new System.Text.StringBuilder( input.Length );
 
    System.Int32 i = -1;
    System.Char c;
    while ( ++i < input.Length ) {
        c = input[ i ];
        if ( '\\' == c ) {
            switch ( input[ ++i ] ) {
                case '0':
                    c = '\0';
                    break;
                case 'a':
                    c = '\a';
                    break;
                case 'b':
                    c = '\b';
                    break;
                case 'f':
                    c = '\f';
                    break;
                case 'r':
                    c = '\r';
                    break;
                case 'n':
                    c = '\n';
                    break;
                case 't':
                    c = '\t';
                    break;
                case 'v':
                    c = '\v';
                    break;
                default:
                    c = input[ i ];
                    break;
            }
        }
        sb = sb.Append( c );
    }
 
    return sb.ToString();
}
private static System.Int32 ReadWord( System.String input, System.Int32 pos ) {
    var inlen = input.Length;
    while ( ( pos < inlen ) && !System.Char.IsWhiteSpace( input[ pos ] ) ) {
        pos++;
    }
    return pos;
}
private static System.Int32 ReadString( System.String input, System.Int32 pos ) {
    var inlen = input.Length;
    while ( ( pos < inlen ) && ( ')' != input[ pos ] ) ) {
        if ( '\\' == input[ pos ] ) {
            pos++;
        }
        pos++;
    }
    pos++;
    if ( inlen < pos ) {
        throw new System.InvalidOperationException( "Unterminated string" );
    }
    return pos;
}
 

Comments