uniblab

Improved word/string scanner

Dec 4th, 2020
648
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. public static System.Collections.Generic.IEnumerable<System.String> ReadWord( System.String input ) {
  2.     input ??= System.String.Empty;
  3.  
  4.     var inlen = input.Length;
  5.     System.Int32 start = 0;
  6.     System.Int32 stop;
  7.     System.Func<System.String, System.Int32, System.Int32, System.String> substr = null;
  8.     do {
  9.         while ( ( start < inlen ) && System.Char.IsWhiteSpace( input[ start ] ) ) {
  10.             start++;
  11.         }
  12.         if ( start == inlen ) {
  13.             yield break;
  14.         } else if ( '(' == input[ start ] ) {
  15.             stop = ReadString( input, start );
  16.             substr = ( a, b, c ) => UnescapeString( a.Substring( b, c - b ) );
  17.         } else {
  18.             stop = ReadWord( input, start );
  19.             substr = ( a, b, c ) => a.Substring( b, c - b );
  20.         }
  21.         if ( start == stop ) {
  22.             yield break;
  23.         } else {
  24.             yield return substr( input, start, stop - start );
  25.         }
  26.         start = stop;
  27.     } while ( start < inlen );
  28.  
  29.     yield break;
  30. }
  31. private static System.String UnescapeString( System.String input ) {
  32.     var sb = new System.Text.StringBuilder( input.Length );
  33.  
  34.     System.Int32 i = -1;
  35.     System.Char c;
  36.     while ( ++i < input.Length ) {
  37.         c = input[ i ];
  38.         if ( '\\' == c ) {
  39.             switch ( input[ ++i ] ) {
  40.                 case '0':
  41.                     c = '\0';
  42.                     break;
  43.                 case 'a':
  44.                     c = '\a';
  45.                     break;
  46.                 case 'b':
  47.                     c = '\b';
  48.                     break;
  49.                 case 'f':
  50.                     c = '\f';
  51.                     break;
  52.                 case 'r':
  53.                     c = '\r';
  54.                     break;
  55.                 case 'n':
  56.                     c = '\n';
  57.                     break;
  58.                 case 't':
  59.                     c = '\t';
  60.                     break;
  61.                 case 'v':
  62.                     c = '\v';
  63.                     break;
  64.                 default:
  65.                     c = input[ i ];
  66.                     break;
  67.             }
  68.         }
  69.         sb = sb.Append( c );
  70.     }
  71.  
  72.     return sb.ToString();
  73. }
  74. private static System.Int32 ReadWord( System.String input, System.Int32 pos ) {
  75.     var inlen = input.Length;
  76.     while ( ( pos < inlen ) && !System.Char.IsWhiteSpace( input[ pos ] ) ) {
  77.         pos++;
  78.     }
  79.     return pos;
  80. }
  81. private static System.Int32 ReadString( System.String input, System.Int32 pos ) {
  82.     var inlen = input.Length;
  83.     while ( ( pos < inlen ) && ( ')' != input[ pos ] ) ) {
  84.         if ( '\\' == input[ pos ] ) {
  85.             pos++;
  86.         }
  87.         pos++;
  88.     }
  89.     pos++;
  90.     if ( inlen < pos ) {
  91.         throw new System.InvalidOperationException( "Unterminated string" );
  92.     }
  93.     return pos;
  94. }
  95.  
RAW Paste Data