Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ParseNumbers.cs
Go to the documentation of this file.
2
3namespace System;
4
5internal static class ParseNumbers
6{
7 public static long StringToLong(ReadOnlySpan<char> s, int radix, int flags)
8 {
9 int currPos = 0;
10 return StringToLong(s, radix, flags, ref currPos);
11 }
12
13 public static long StringToLong(ReadOnlySpan<char> s, int radix, int flags, ref int currPos)
14 {
15 int i = currPos;
16 int num = ((-1 == radix) ? 10 : radix);
17 if (num != 2 && num != 10 && num != 8 && num != 16)
18 {
19 throw new ArgumentException(SR.Arg_InvalidBase, "radix");
20 }
21 int length = s.Length;
22 if (i < 0 || i >= length)
23 {
25 }
26 if ((flags & 0x1000) == 0 && (flags & 0x2000) == 0)
27 {
28 EatWhiteSpace(s, ref i);
29 if (i == length)
30 {
32 }
33 }
34 int num2 = 1;
35 if (s[i] == '-')
36 {
37 if (num != 10)
38 {
40 }
41 if (((uint)flags & 0x200u) != 0)
42 {
44 }
45 num2 = -1;
46 i++;
47 }
48 else if (s[i] == '+')
49 {
50 i++;
51 }
52 if ((radix == -1 || radix == 16) && i + 1 < length && s[i] == '0' && (s[i + 1] == 'x' || s[i + 1] == 'X'))
53 {
54 num = 16;
55 i += 2;
56 }
57 int num3 = i;
58 long num4 = GrabLongs(num, s, ref i, (flags & 0x200) != 0);
59 if (i == num3)
60 {
62 }
63 if (((uint)flags & 0x1000u) != 0 && i < length)
64 {
66 }
67 currPos = i;
68 if (num4 == long.MinValue && num2 == 1 && num == 10 && (flags & 0x200) == 0)
69 {
71 }
72 if (num == 10)
73 {
74 num4 *= num2;
75 }
76 return num4;
77 }
78
79 public static int StringToInt(ReadOnlySpan<char> s, int radix, int flags)
80 {
81 int currPos = 0;
82 return StringToInt(s, radix, flags, ref currPos);
83 }
84
85 public static int StringToInt(ReadOnlySpan<char> s, int radix, int flags, ref int currPos)
86 {
87 int i = currPos;
88 int num = ((-1 == radix) ? 10 : radix);
89 if (num != 2 && num != 10 && num != 8 && num != 16)
90 {
91 throw new ArgumentException(SR.Arg_InvalidBase, "radix");
92 }
93 int length = s.Length;
94 if (i < 0 || i >= length)
95 {
97 }
98 if ((flags & 0x1000) == 0 && (flags & 0x2000) == 0)
99 {
100 EatWhiteSpace(s, ref i);
101 if (i == length)
102 {
104 }
105 }
106 int num2 = 1;
107 if (s[i] == '-')
108 {
109 if (num != 10)
110 {
112 }
113 if (((uint)flags & 0x200u) != 0)
114 {
116 }
117 num2 = -1;
118 i++;
119 }
120 else if (s[i] == '+')
121 {
122 i++;
123 }
124 if ((radix == -1 || radix == 16) && i + 1 < length && s[i] == '0' && (s[i + 1] == 'x' || s[i + 1] == 'X'))
125 {
126 num = 16;
127 i += 2;
128 }
129 int num3 = i;
130 int num4 = GrabInts(num, s, ref i, (flags & 0x200) != 0);
131 if (i == num3)
132 {
134 }
135 if (((uint)flags & 0x1000u) != 0 && i < length)
136 {
138 }
139 currPos = i;
140 if (((uint)flags & 0x400u) != 0)
141 {
142 if ((uint)num4 > 255u)
143 {
145 }
146 }
147 else if (((uint)flags & 0x800u) != 0)
148 {
149 if ((uint)num4 > 65535u)
150 {
152 }
153 }
154 else if (num4 == int.MinValue && num2 == 1 && num == 10 && (flags & 0x200) == 0)
155 {
157 }
158 if (num == 10)
159 {
160 num4 *= num2;
161 }
162 return num4;
163 }
164
165 public unsafe static string IntToString(int n, int radix, int width, char paddingChar, int flags)
166 {
167 Span<char> span = stackalloc char[66];
168 if (radix < 2 || radix > 36)
169 {
170 throw new ArgumentException(SR.Arg_InvalidBase, "radix");
171 }
172 bool flag = false;
173 uint num;
174 if (n < 0)
175 {
176 flag = true;
177 num = (uint)((10 == radix) ? (-n) : n);
178 }
179 else
180 {
181 num = (uint)n;
182 }
183 if (((uint)flags & 0x40u) != 0)
184 {
185 num &= 0xFFu;
186 }
187 else if (((uint)flags & 0x80u) != 0)
188 {
189 num &= 0xFFFFu;
190 }
191 int num2;
192 if (num == 0)
193 {
194 span[0] = '0';
195 num2 = 1;
196 }
197 else
198 {
199 num2 = 0;
200 for (int i = 0; i < span.Length; i++)
201 {
202 uint num3 = num / (uint)radix;
203 uint num4 = num - (uint)((int)num3 * radix);
204 num = num3;
205 span[i] = ((num4 < 10) ? ((char)(num4 + 48)) : ((char)(num4 + 97 - 10)));
206 if (num == 0)
207 {
208 num2 = i + 1;
209 break;
210 }
211 }
212 }
213 if (radix != 10 && ((uint)flags & 0x20u) != 0)
214 {
215 if (16 == radix)
216 {
217 span[num2++] = 'x';
218 span[num2++] = '0';
219 }
220 else if (8 == radix)
221 {
222 span[num2++] = '0';
223 }
224 }
225 if (10 == radix)
226 {
227 if (flag)
228 {
229 span[num2++] = '-';
230 }
231 else if (((uint)flags & 0x10u) != 0)
232 {
233 span[num2++] = '+';
234 }
235 else if (((uint)flags & 8u) != 0)
236 {
237 span[num2++] = ' ';
238 }
239 }
240 string text = string.FastAllocateString(Math.Max(width, num2));
241 fixed (char* ptr = text)
242 {
243 char* ptr2 = ptr;
244 int num5 = text.Length - num2;
245 if (((uint)flags & (true ? 1u : 0u)) != 0)
246 {
247 for (int j = 0; j < num5; j++)
248 {
249 *(ptr2++) = paddingChar;
250 }
251 for (int k = 0; k < num2; k++)
252 {
253 *(ptr2++) = span[num2 - k - 1];
254 }
255 }
256 else
257 {
258 for (int l = 0; l < num2; l++)
259 {
260 *(ptr2++) = span[num2 - l - 1];
261 }
262 for (int m = 0; m < num5; m++)
263 {
264 *(ptr2++) = paddingChar;
265 }
266 }
267 }
268 return text;
269 }
270
271 public unsafe static string LongToString(long n, int radix, int width, char paddingChar, int flags)
272 {
273 Span<char> span = stackalloc char[67];
274 if (radix < 2 || radix > 36)
275 {
276 throw new ArgumentException(SR.Arg_InvalidBase, "radix");
277 }
278 bool flag = false;
279 ulong num;
280 if (n < 0)
281 {
282 flag = true;
283 num = (ulong)((10 == radix) ? (-n) : n);
284 }
285 else
286 {
287 num = (ulong)n;
288 }
289 if (((uint)flags & 0x40u) != 0)
290 {
291 num &= 0xFF;
292 }
293 else if (((uint)flags & 0x80u) != 0)
294 {
295 num &= 0xFFFF;
296 }
297 else if (((uint)flags & 0x100u) != 0)
298 {
299 num &= 0xFFFFFFFFu;
300 }
301 int num2;
302 if (num == 0L)
303 {
304 span[0] = '0';
305 num2 = 1;
306 }
307 else
308 {
309 num2 = 0;
310 for (int i = 0; i < span.Length; i++)
311 {
312 ulong num3 = num / (ulong)radix;
313 int num4 = (int)((long)num - (long)num3 * (long)radix);
314 num = num3;
315 span[i] = ((num4 < 10) ? ((char)(num4 + 48)) : ((char)(num4 + 97 - 10)));
316 if (num == 0L)
317 {
318 num2 = i + 1;
319 break;
320 }
321 }
322 }
323 if (radix != 10 && ((uint)flags & 0x20u) != 0)
324 {
325 if (16 == radix)
326 {
327 span[num2++] = 'x';
328 span[num2++] = '0';
329 }
330 else if (8 == radix)
331 {
332 span[num2++] = '0';
333 }
334 else if (((uint)flags & 0x4000u) != 0)
335 {
336 span[num2++] = '#';
337 span[num2++] = (char)(radix % 10 + 48);
338 span[num2++] = (char)(radix / 10 + 48);
339 }
340 }
341 if (10 == radix)
342 {
343 if (flag)
344 {
345 span[num2++] = '-';
346 }
347 else if (((uint)flags & 0x10u) != 0)
348 {
349 span[num2++] = '+';
350 }
351 else if (((uint)flags & 8u) != 0)
352 {
353 span[num2++] = ' ';
354 }
355 }
356 string text = string.FastAllocateString(Math.Max(width, num2));
357 fixed (char* ptr = text)
358 {
359 char* ptr2 = ptr;
360 int num5 = text.Length - num2;
361 if (((uint)flags & (true ? 1u : 0u)) != 0)
362 {
363 for (int j = 0; j < num5; j++)
364 {
365 *(ptr2++) = paddingChar;
366 }
367 for (int k = 0; k < num2; k++)
368 {
369 *(ptr2++) = span[num2 - k - 1];
370 }
371 }
372 else
373 {
374 for (int l = 0; l < num2; l++)
375 {
376 *(ptr2++) = span[num2 - l - 1];
377 }
378 for (int m = 0; m < num5; m++)
379 {
380 *(ptr2++) = paddingChar;
381 }
382 }
383 }
384 return text;
385 }
386
387 private static void EatWhiteSpace(ReadOnlySpan<char> s, ref int i)
388 {
389 int j;
390 for (j = i; j < s.Length && char.IsWhiteSpace(s[j]); j++)
391 {
392 }
393 i = j;
394 }
395
396 private static long GrabLongs(int radix, ReadOnlySpan<char> s, ref int i, bool isUnsigned)
397 {
398 ulong num = 0uL;
399 if (radix == 10 && !isUnsigned)
400 {
401 ulong num2 = 922337203685477580uL;
402 int result;
403 while (i < s.Length && IsDigit(s[i], radix, out result))
404 {
405 if (num > num2 || (long)num < 0L)
406 {
408 }
409 num = (ulong)((long)num * (long)radix + result);
410 i++;
411 }
412 if ((long)num < 0L && num != 9223372036854775808uL)
413 {
415 }
416 }
417 else
418 {
419 ulong num2 = radix switch
420 {
421 8 => 2305843009213693951uL,
422 16 => 1152921504606846975uL,
423 10 => 1844674407370955161uL,
424 _ => 9223372036854775807uL,
425 };
426 int result2;
427 while (i < s.Length && IsDigit(s[i], radix, out result2))
428 {
429 if (num > num2)
430 {
432 }
433 ulong num3 = (ulong)((long)num * (long)radix + result2);
434 if (num3 < num)
435 {
437 }
438 num = num3;
439 i++;
440 }
441 }
442 return (long)num;
443 }
444
445 private static int GrabInts(int radix, ReadOnlySpan<char> s, ref int i, bool isUnsigned)
446 {
447 uint num = 0u;
448 if (radix == 10 && !isUnsigned)
449 {
450 uint num2 = 214748364u;
451 int result;
452 while (i < s.Length && IsDigit(s[i], radix, out result))
453 {
454 if (num > num2 || (int)num < 0)
455 {
457 }
458 num = (uint)((int)num * radix + result);
459 i++;
460 }
461 if ((int)num < 0 && num != 2147483648u)
462 {
464 }
465 }
466 else
467 {
468 uint num2 = radix switch
469 {
470 8 => 536870911u,
471 16 => 268435455u,
472 10 => 429496729u,
473 _ => 2147483647u,
474 };
475 int result2;
476 while (i < s.Length && IsDigit(s[i], radix, out result2))
477 {
478 if (num > num2)
479 {
481 }
482 uint num3 = (uint)((int)num * radix + result2);
483 if (num3 < num)
484 {
486 }
487 num = num3;
488 i++;
489 }
490 }
491 return (int)num;
492 }
493
494 [MethodImpl(MethodImplOptions.AggressiveInlining)]
495 private static bool IsDigit(char c, int radix, out int result)
496 {
497 int num;
498 switch (c)
499 {
500 case '0':
501 case '1':
502 case '2':
503 case '3':
504 case '4':
505 case '5':
506 case '6':
507 case '7':
508 case '8':
509 case '9':
510 num = (result = c - 48);
511 break;
512 case 'A':
513 case 'B':
514 case 'C':
515 case 'D':
516 case 'E':
517 case 'F':
518 case 'G':
519 case 'H':
520 case 'I':
521 case 'J':
522 case 'K':
523 case 'L':
524 case 'M':
525 case 'N':
526 case 'O':
527 case 'P':
528 case 'Q':
529 case 'R':
530 case 'S':
531 case 'T':
532 case 'U':
533 case 'V':
534 case 'W':
535 case 'X':
536 case 'Y':
537 case 'Z':
538 num = (result = c - 65 + 10);
539 break;
540 case 'a':
541 case 'b':
542 case 'c':
543 case 'd':
544 case 'e':
545 case 'f':
546 case 'g':
547 case 'h':
548 case 'i':
549 case 'j':
550 case 'k':
551 case 'l':
552 case 'm':
553 case 'n':
554 case 'o':
555 case 'p':
556 case 'q':
557 case 'r':
558 case 's':
559 case 't':
560 case 'u':
561 case 'v':
562 case 'w':
563 case 'x':
564 case 'y':
565 case 'z':
566 num = (result = c - 97 + 10);
567 break;
568 default:
569 result = -1;
570 return false;
571 }
572 return num < radix;
573 }
574}
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static void ThrowOverflowException(TypeCode type)
Definition Number.cs:5924
static int StringToInt(ReadOnlySpan< char > s, int radix, int flags, ref int currPos)
static long GrabLongs(int radix, ReadOnlySpan< char > s, ref int i, bool isUnsigned)
static unsafe string LongToString(long n, int radix, int width, char paddingChar, int flags)
static long StringToLong(ReadOnlySpan< char > s, int radix, int flags)
static int GrabInts(int radix, ReadOnlySpan< char > s, ref int i, bool isUnsigned)
static bool IsDigit(char c, int radix, out int result)
static void EatWhiteSpace(ReadOnlySpan< char > s, ref int i)
static unsafe string IntToString(int n, int radix, int width, char paddingChar, int flags)
static int StringToInt(ReadOnlySpan< char > s, int radix, int flags)
static long StringToLong(ReadOnlySpan< char > s, int radix, int flags, ref int currPos)
static string ArgumentOutOfRange_Index
Definition SR.cs:30
static string Format_ExtraJunkAtEnd
Definition SR.cs:1344
static string Arg_InvalidBase
Definition SR.cs:196
static string Overflow_NegativeUnsigned
Definition SR.cs:1778
static string Format_EmptyInputString
Definition SR.cs:1342
static string Arg_CannotHaveNegativeValue
Definition SR.cs:92
static string Format_NoParsibleDigits
Definition SR.cs:1358
Definition SR.cs:7
TypeCode
Definition TypeCode.cs:4
int Length
Definition Span.cs:70