A game about forced loneliness, made by TACStudios
1using System; 2 3namespace UnityEngine.InputSystem.Utilities 4{ 5 // this parser uses Span<T> so it's only available from later unity versions 6#if UNITY_2021_2_OR_NEWER 7 internal struct PredictiveParser 8 { 9 public void ExpectSingleChar(ReadOnlySpan<char> str, char c) 10 { 11 if (str[m_Position] != c) 12 throw new InvalidOperationException($"Expected a '{c}' character at position {m_Position} in : {str.ToString()}"); 13 14 ++m_Position; 15 } 16 17 public int ExpectInt(ReadOnlySpan<char> str) 18 { 19 int pos = m_Position; 20 21 int sign = 1; 22 if (str[pos] == '-') 23 { 24 sign = -1; 25 ++pos; 26 } 27 28 int value = 0; 29 for (;;) 30 { 31 var n = str[pos]; 32 if (n >= '0' && n <= '9') 33 { 34 value *= 10; 35 value += n - '0'; 36 ++pos; 37 } 38 else 39 break; 40 } 41 42 if (m_Position == pos) 43 throw new InvalidOperationException($"Expected an int at position {m_Position} in {str.ToString()}"); 44 45 m_Position = pos; 46 return value * sign; 47 } 48 49 public ReadOnlySpan<char> ExpectString(ReadOnlySpan<char> str) 50 { 51 var startPos = m_Position; 52 if (str[startPos] != '\"') 53 throw new InvalidOperationException($"Expected a '\"' character at position {m_Position} in {str.ToString()}"); 54 55 ++m_Position; 56 57 for (;;) 58 { 59 var c = str[m_Position]; 60 c |= ' '; 61 if (c >= 'a' && c <= 'z') 62 { 63 ++m_Position; 64 continue; 65 } 66 67 break; 68 } 69 70 // if the first non-alpha character is not a quote, throw 71 if (str[m_Position] != '\"') 72 throw new InvalidOperationException($"Expected a closing '\"' character at position {m_Position} in string: {str.ToString()}"); 73 74 if (m_Position - startPos == 1) 75 return ReadOnlySpan<char>.Empty; 76 77 var output = str.Slice(startPos + 1, m_Position - startPos - 1); 78 79 ++m_Position; 80 return output; 81 } 82 83 public bool AcceptSingleChar(ReadOnlySpan<char> str, char c) 84 { 85 if (str[m_Position] != c) 86 return false; 87 88 m_Position++; 89 return true; 90 } 91 92 public bool AcceptString(ReadOnlySpan<char> input, out ReadOnlySpan<char> output) 93 { 94 output = default; 95 var startPos = m_Position; 96 var endPos = startPos; 97 if (input[endPos] != '\"') 98 return false; 99 100 ++endPos; 101 102 for (;;) 103 { 104 var c = input[endPos]; 105 c |= ' '; 106 if (c >= 'a' && c <= 'z') 107 { 108 ++endPos; 109 continue; 110 } 111 112 break; 113 } 114 115 // if the first non-alpha character is not a quote, throw 116 if (input[endPos] != '\"') 117 return false; 118 119 // empty string? 120 if (m_Position - startPos == 1) 121 output = ReadOnlySpan<char>.Empty; 122 else 123 output = input.Slice(startPos + 1, endPos - startPos - 1); 124 125 m_Position = endPos + 1; 126 return true; 127 } 128 129 public void AcceptInt(ReadOnlySpan<char> str) 130 { 131 // skip negative sign 132 if (str[m_Position] == '-') 133 ++m_Position; 134 135 for (;;) 136 { 137 var n = str[m_Position]; 138 if (n >= '0' && n <= '9') 139 ++m_Position; 140 else 141 break; 142 } 143 } 144 145 private int m_Position; 146 } 147#endif 148}