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}