Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
HebrewNumber.cs
Go to the documentation of this file.
1using System.Text;
2
4
5internal static class HebrewNumber
6{
7 private enum HebrewToken : short
8 {
9 Invalid = -1,
13 Digit10,
14 Digit1,
16 Digit7,
17 Digit9,
20 }
21
22 private struct HebrewValue
23 {
25
26 internal short value;
27
29 {
30 this.token = token;
31 this.value = value;
32 }
33 }
34
35 internal enum HS : sbyte
36 {
37 _err = -1,
38 Start = 0,
39 S400 = 1,
40 S400_400 = 2,
41 S400_X00 = 3,
42 S400_X0 = 4,
43 X00_DQ = 5,
44 S400_X00_X0 = 6,
45 X0_DQ = 7,
46 X = 8,
47 X0 = 9,
48 X00 = 10,
49 S400_DQ = 11,
50 S400_400_DQ = 12,
51 S400_400_100 = 13,
52 S9 = 14,
53 X00_S9 = 15,
54 S9_DQ = 16,
55 END = 100
56 }
57
58 private static readonly HebrewValue[] s_hebrewValues = new HebrewValue[27]
59 {
60 new HebrewValue(HebrewToken.Digit1, 1),
61 new HebrewValue(HebrewToken.Digit1, 2),
62 new HebrewValue(HebrewToken.Digit1, 3),
63 new HebrewValue(HebrewToken.Digit1, 4),
64 new HebrewValue(HebrewToken.Digit1, 5),
65 new HebrewValue(HebrewToken.Digit6_7, 6),
66 new HebrewValue(HebrewToken.Digit6_7, 7),
67 new HebrewValue(HebrewToken.Digit1, 8),
68 new HebrewValue(HebrewToken.Digit9, 9),
69 new HebrewValue(HebrewToken.Digit10, 10),
70 new HebrewValue(HebrewToken.Invalid, -1),
71 new HebrewValue(HebrewToken.Digit10, 20),
72 new HebrewValue(HebrewToken.Digit10, 30),
73 new HebrewValue(HebrewToken.Invalid, -1),
74 new HebrewValue(HebrewToken.Digit10, 40),
75 new HebrewValue(HebrewToken.Invalid, -1),
76 new HebrewValue(HebrewToken.Digit10, 50),
77 new HebrewValue(HebrewToken.Digit10, 60),
78 new HebrewValue(HebrewToken.Digit10, 70),
79 new HebrewValue(HebrewToken.Invalid, -1),
80 new HebrewValue(HebrewToken.Digit10, 80),
81 new HebrewValue(HebrewToken.Invalid, -1),
82 new HebrewValue(HebrewToken.Digit10, 90),
83 new HebrewValue(HebrewToken.Digit100, 100),
84 new HebrewValue(HebrewToken.Digit200_300, 200),
85 new HebrewValue(HebrewToken.Digit200_300, 300),
86 new HebrewValue(HebrewToken.Digit400, 400)
87 };
88
89 private static readonly char s_maxHebrewNumberCh = (char)(1488 + s_hebrewValues.Length - 1);
90
91 private static readonly HS[] s_numberPasingState = new HS[170]
92 {
93 HS.S400,
94 HS.X00,
95 HS.X00,
96 HS.X0,
97 HS.X,
98 HS.X,
99 HS.X,
100 HS.S9,
101 HS._err,
102 HS._err,
103 HS.S400_400,
104 HS.S400_X00,
105 HS.S400_X00,
106 HS.S400_X0,
107 HS._err,
108 HS._err,
109 HS._err,
110 HS.X00_S9,
111 HS.END,
112 HS.S400_DQ,
113 HS._err,
114 HS._err,
115 HS.S400_400_100,
116 HS.S400_X0,
117 HS._err,
118 HS._err,
119 HS._err,
120 HS.X00_S9,
121 HS._err,
122 HS.S400_400_DQ,
123 HS._err,
124 HS._err,
125 HS._err,
126 HS.S400_X00_X0,
127 HS._err,
128 HS._err,
129 HS._err,
130 HS.X00_S9,
131 HS._err,
132 HS.X00_DQ,
133 HS._err,
134 HS._err,
135 HS._err,
136 HS._err,
137 HS._err,
138 HS._err,
139 HS._err,
140 HS._err,
141 HS._err,
142 HS.X0_DQ,
143 HS._err,
144 HS._err,
145 HS._err,
146 HS.END,
147 HS.END,
148 HS.END,
149 HS.END,
150 HS.END,
151 HS._err,
152 HS._err,
153 HS._err,
154 HS._err,
155 HS._err,
156 HS._err,
157 HS._err,
158 HS._err,
159 HS._err,
160 HS._err,
161 HS._err,
162 HS.X0_DQ,
163 HS._err,
164 HS._err,
165 HS._err,
166 HS._err,
167 HS.END,
168 HS.END,
169 HS.END,
170 HS.END,
171 HS._err,
172 HS._err,
173 HS._err,
174 HS._err,
175 HS._err,
176 HS._err,
177 HS._err,
178 HS._err,
179 HS._err,
180 HS._err,
181 HS.END,
182 HS._err,
183 HS._err,
184 HS._err,
185 HS._err,
186 HS._err,
187 HS._err,
188 HS._err,
189 HS._err,
190 HS._err,
191 HS.END,
192 HS.X0_DQ,
193 HS._err,
194 HS._err,
195 HS._err,
196 HS.S400_X0,
197 HS._err,
198 HS._err,
199 HS._err,
200 HS.X00_S9,
201 HS.END,
202 HS.X00_DQ,
203 HS.END,
204 HS.END,
205 HS.END,
206 HS.END,
207 HS.END,
208 HS.END,
209 HS.END,
210 HS.END,
211 HS._err,
212 HS._err,
213 HS._err,
214 HS._err,
215 HS.END,
216 HS.END,
217 HS.END,
218 HS.END,
219 HS.END,
220 HS.END,
221 HS._err,
222 HS._err,
223 HS._err,
224 HS._err,
225 HS._err,
226 HS.S400_X00_X0,
227 HS._err,
228 HS._err,
229 HS._err,
230 HS.X00_S9,
231 HS._err,
232 HS.X00_DQ,
233 HS._err,
234 HS._err,
235 HS._err,
236 HS._err,
237 HS._err,
238 HS._err,
239 HS._err,
240 HS._err,
241 HS.END,
242 HS.S9_DQ,
243 HS._err,
244 HS._err,
245 HS._err,
246 HS._err,
247 HS._err,
248 HS._err,
249 HS._err,
250 HS._err,
251 HS._err,
252 HS.S9_DQ,
253 HS._err,
254 HS._err,
255 HS._err,
256 HS._err,
257 HS._err,
258 HS.END,
259 HS.END,
260 HS._err,
261 HS._err,
262 HS._err
263 };
264
265 internal static void Append(StringBuilder outputBuffer, int Number)
266 {
267 int length = outputBuffer.Length;
268 char c = '\0';
269 if (Number > 5000)
270 {
271 Number -= 5000;
272 }
273 int num = Number / 100;
274 if (num > 0)
275 {
276 Number -= num * 100;
277 for (int i = 0; i < num / 4; i++)
278 {
279 outputBuffer.Append('ת');
280 }
281 int num2 = num % 4;
282 if (num2 > 0)
283 {
284 outputBuffer.Append((char)(1510 + num2));
285 }
286 }
287 int num3 = Number / 10;
288 Number %= 10;
289 switch (num3)
290 {
291 case 0:
292 c = '\0';
293 break;
294 case 1:
295 c = 'י';
296 break;
297 case 2:
298 c = 'כ';
299 break;
300 case 3:
301 c = 'ל';
302 break;
303 case 4:
304 c = 'מ';
305 break;
306 case 5:
307 c = 'נ';
308 break;
309 case 6:
310 c = 'ס';
311 break;
312 case 7:
313 c = 'ע';
314 break;
315 case 8:
316 c = 'פ';
317 break;
318 case 9:
319 c = 'צ';
320 break;
321 }
322 char c2 = (char)((Number > 0) ? ((uint)(1488 + Number - 1)) : 0u);
323 if (c2 == 'ה' && c == 'י')
324 {
325 c2 = 'ו';
326 c = 'ט';
327 }
328 if (c2 == 'ו' && c == 'י')
329 {
330 c2 = 'ז';
331 c = 'ט';
332 }
333 if (c != 0)
334 {
335 outputBuffer.Append(c);
336 }
337 if (c2 != 0)
338 {
339 outputBuffer.Append(c2);
340 }
341 if (outputBuffer.Length - length > 1)
342 {
343 outputBuffer.Insert(outputBuffer.Length - 1, '"');
344 }
345 else
346 {
347 outputBuffer.Append('\'');
348 }
349 }
350
352 {
353 HebrewToken hebrewToken;
354 switch (ch)
355 {
356 case '\'':
357 hebrewToken = HebrewToken.SingleQuote;
358 break;
359 case '"':
360 hebrewToken = HebrewToken.DoubleQuote;
361 break;
362 default:
363 {
364 int num = ch - 1488;
365 if (num >= 0 && num < s_hebrewValues.Length)
366 {
367 hebrewToken = s_hebrewValues[num].token;
368 if (hebrewToken == HebrewToken.Invalid)
369 {
370 return HebrewNumberParsingState.NotHebrewDigit;
371 }
372 context.result += s_hebrewValues[num].value;
373 break;
374 }
375 return HebrewNumberParsingState.NotHebrewDigit;
376 }
377 }
378 context.state = s_numberPasingState[(int)context.state * 10 + (int)hebrewToken];
379 if (context.state == HS._err)
380 {
381 return HebrewNumberParsingState.InvalidHebrewNumber;
382 }
383 if (context.state == HS.END)
384 {
385 return HebrewNumberParsingState.FoundEndOfHebrewNumber;
386 }
387 return HebrewNumberParsingState.ContinueParsing;
388 }
389
390 internal static bool IsDigit(char ch)
391 {
392 if (ch >= 'א' && ch <= s_maxHebrewNumberCh)
393 {
394 return s_hebrewValues[ch - 1488].value >= 0;
395 }
396 if (ch != '\'')
397 {
398 return ch == '"';
399 }
400 return true;
401 }
402}
static readonly HebrewValue[] s_hebrewValues
static readonly char s_maxHebrewNumberCh
static HebrewNumberParsingState ParseByChar(char ch, ref HebrewNumberParsingContext context)
static void Append(StringBuilder outputBuffer, int Number)
static readonly HS[] s_numberPasingState
unsafe StringBuilder Insert(int index, string? value, int count)
StringBuilder Append(char value, int repeatCount)
HebrewValue(HebrewToken token, short value)