Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
IPAddressParser.cs
Go to the documentation of this file.
5using System.Text;
6
7namespace System.Net;
8
9internal static class IPAddressParser
10{
11 internal static IPAddress Parse(ReadOnlySpan<char> ipSpan, bool tryParse)
12 {
13 long address;
14 if (ipSpan.Contains(':'))
15 {
16 Span<ushort> span = stackalloc ushort[8];
17 span.Clear();
18 if (Ipv6StringToAddress(ipSpan, span, 8, out var scope))
19 {
20 return new IPAddress(span, scope);
21 }
22 }
23 else if (Ipv4StringToAddress(ipSpan, out address))
24 {
25 return new IPAddress(address);
26 }
27 if (tryParse)
28 {
29 return null;
30 }
32 }
33
34 internal unsafe static string IPv4AddressToString(uint address)
35 {
36 char* ptr = stackalloc char[15];
37 int length = IPv4AddressToStringHelper(address, ptr);
38 return new string(ptr, 0, length);
39 }
40
41 internal unsafe static void IPv4AddressToString(uint address, StringBuilder destination)
42 {
43 char* ptr = stackalloc char[15];
44 int valueCount = IPv4AddressToStringHelper(address, ptr);
45 destination.Append(ptr, valueCount);
46 }
47
48 internal unsafe static bool IPv4AddressToString(uint address, Span<char> formatted, out int charsWritten)
49 {
50 if (formatted.Length < 15)
51 {
52 charsWritten = 0;
53 return false;
54 }
55 fixed (char* addressString = &MemoryMarshal.GetReference(formatted))
56 {
57 charsWritten = IPv4AddressToStringHelper(address, addressString);
58 }
59 return true;
60 }
61
62 private unsafe static int IPv4AddressToStringHelper(uint address, char* addressString)
63 {
64 int offset = 0;
65 address = (uint)IPAddress.NetworkToHostOrder((int)address);
66 FormatIPv4AddressNumber((int)((address >> 24) & 0xFF), addressString, ref offset);
67 addressString[offset++] = '.';
68 FormatIPv4AddressNumber((int)((address >> 16) & 0xFF), addressString, ref offset);
69 addressString[offset++] = '.';
70 FormatIPv4AddressNumber((int)((address >> 8) & 0xFF), addressString, ref offset);
71 addressString[offset++] = '.';
72 FormatIPv4AddressNumber((int)(address & 0xFF), addressString, ref offset);
73 return offset;
74 }
75
76 internal static string IPv6AddressToString(ushort[] address, uint scopeId)
77 {
78 StringBuilder sb = IPv6AddressToStringHelper(address, scopeId);
80 }
81
82 internal static bool IPv6AddressToString(ushort[] address, uint scopeId, Span<char> destination, out int charsWritten)
83 {
84 StringBuilder stringBuilder = IPv6AddressToStringHelper(address, scopeId);
85 if (destination.Length < stringBuilder.Length)
86 {
88 charsWritten = 0;
89 return false;
90 }
91 stringBuilder.CopyTo(0, destination, stringBuilder.Length);
92 charsWritten = stringBuilder.Length;
94 return true;
95 }
96
97 internal static StringBuilder IPv6AddressToStringHelper(ushort[] address, uint scopeId)
98 {
101 {
102 AppendSections(address, 0, 6, stringBuilder);
103 if (stringBuilder[stringBuilder.Length - 1] != ':')
104 {
105 stringBuilder.Append(':');
106 }
107 IPv4AddressToString(ExtractIPv4Address(address), stringBuilder);
108 }
109 else
110 {
111 AppendSections(address, 0, 8, stringBuilder);
112 }
113 if (scopeId != 0)
114 {
115 stringBuilder.Append('%').Append(scopeId);
116 }
117 return stringBuilder;
118 }
119
120 private unsafe static void FormatIPv4AddressNumber(int number, char* addressString, ref int offset)
121 {
122 offset += ((number > 99) ? 3 : ((number <= 9) ? 1 : 2));
123 int num = offset;
124 do
125 {
126 number = Math.DivRem(number, 10, out var result);
127 addressString[--num] = (char)(48 + result);
128 }
129 while (number != 0);
130 }
131
132 public unsafe static bool Ipv4StringToAddress(ReadOnlySpan<char> ipSpan, out long address)
133 {
134 int end = ipSpan.Length;
135 long num;
136 fixed (char* name = &MemoryMarshal.GetReference(ipSpan))
137 {
138 num = System.IPv4AddressHelper.ParseNonCanonical(name, 0, ref end, notImplicitFile: true);
139 }
140 if (num != -1 && end == ipSpan.Length)
141 {
142 address = (uint)IPAddress.HostToNetworkOrder((int)num);
143 return true;
144 }
145 address = 0L;
146 return false;
147 }
148
149 public unsafe static bool Ipv6StringToAddress(ReadOnlySpan<char> ipSpan, Span<ushort> numbers, int numbersLength, out uint scope)
150 {
151 int end = ipSpan.Length;
152 bool flag = false;
153 fixed (char* name = &MemoryMarshal.GetReference(ipSpan))
154 {
155 flag = System.IPv6AddressHelper.IsValidStrict(name, 0, ref end);
156 }
157 if (flag || end != ipSpan.Length)
158 {
159 string scopeId = null;
160 System.IPv6AddressHelper.Parse(ipSpan, numbers, 0, ref scopeId);
161 if (scopeId != null && scopeId.Length > 1)
162 {
163 if (uint.TryParse(scopeId.AsSpan(1), NumberStyles.None, CultureInfo.InvariantCulture, out scope))
164 {
165 return true;
166 }
167 uint num = InterfaceInfoPal.InterfaceNameToIndex(scopeId);
168 if (num != 0)
169 {
170 scope = num;
171 return true;
172 }
173 }
174 scope = 0u;
175 return true;
176 }
177 scope = 0u;
178 return false;
179 }
180
181 private static void AppendSections(ushort[] address, int fromInclusive, int toExclusive, StringBuilder buffer)
182 {
183 ReadOnlySpan<ushort> numbers = new ReadOnlySpan<ushort>(address, fromInclusive, toExclusive - fromInclusive);
184 (int longestSequenceStart, int longestSequenceLength) tuple = System.IPv6AddressHelper.FindCompressionRange(numbers);
185 int item = tuple.longestSequenceStart;
186 int item2 = tuple.longestSequenceLength;
187 bool flag = false;
188 for (int i = fromInclusive; i < item; i++)
189 {
190 if (flag)
191 {
192 buffer.Append(':');
193 }
194 flag = true;
195 AppendHex(address[i], buffer);
196 }
197 if (item >= 0)
198 {
199 buffer.Append("::");
200 flag = false;
201 fromInclusive = item2;
202 }
203 for (int j = fromInclusive; j < toExclusive; j++)
204 {
205 if (flag)
206 {
207 buffer.Append(':');
208 }
209 flag = true;
210 AppendHex(address[j], buffer);
211 }
212 }
213
214 private static void AppendHex(ushort value, StringBuilder buffer)
215 {
216 if ((value & 0xF000u) != 0)
217 {
219 }
220 if ((value & 0xFF00u) != 0)
221 {
223 }
224 if ((value & 0xFFF0u) != 0)
225 {
227 }
229 }
230
231 private static uint ExtractIPv4Address(ushort[] address)
232 {
233 uint host = (uint)((address[6] << 16) | address[7]);
234 return (uint)IPAddress.HostToNetworkOrder((int)host);
235 }
236}
static CultureInfo InvariantCulture
static char ToCharLower(int value)
static unsafe long ParseNonCanonical(char *name, int start, ref int end, bool notImplicitFile)
static unsafe bool IsValidStrict(char *name, int start, ref int end)
static void Parse(ReadOnlySpan< char > address, Span< ushort > numbers, int start, ref string scopeId)
static bool ShouldHaveIpv4Embedded(ReadOnlySpan< ushort > numbers)
static int int longestSequenceLength FindCompressionRange(ReadOnlySpan< ushort > numbers)
static int DivRem(int a, int b, out int result)
Definition Math.cs:329
static void AppendSections(ushort[] address, int fromInclusive, int toExclusive, StringBuilder buffer)
static void AppendHex(ushort value, StringBuilder buffer)
static unsafe int IPv4AddressToStringHelper(uint address, char *addressString)
static unsafe bool Ipv4StringToAddress(ReadOnlySpan< char > ipSpan, out long address)
static IPAddress Parse(ReadOnlySpan< char > ipSpan, bool tryParse)
static unsafe bool IPv4AddressToString(uint address, Span< char > formatted, out int charsWritten)
static unsafe string IPv4AddressToString(uint address)
static StringBuilder IPv6AddressToStringHelper(ushort[] address, uint scopeId)
static uint ExtractIPv4Address(ushort[] address)
static unsafe bool Ipv6StringToAddress(ReadOnlySpan< char > ipSpan, Span< ushort > numbers, int numbersLength, out uint scope)
static unsafe void IPv4AddressToString(uint address, StringBuilder destination)
static bool IPv6AddressToString(ushort[] address, uint scopeId, Span< char > destination, out int charsWritten)
static string IPv6AddressToString(ushort[] address, uint scopeId)
static unsafe void FormatIPv4AddressNumber(int number, char *addressString, ref int offset)
static long HostToNetworkOrder(long host)
Definition IPAddress.cs:408
static long NetworkToHostOrder(long network)
Definition IPAddress.cs:435
static uint InterfaceNameToIndex(string interfaceName)
static string dns_bad_ip_address
Definition SR.cs:28
Definition SR.cs:7
static string GetStringAndRelease(StringBuilder sb)
static void Release(StringBuilder sb)
static StringBuilder Acquire(int capacity=16)
void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
StringBuilder Append(char value, int repeatCount)
unsafe void Clear()
Definition Span.cs:198
int Length
Definition Span.cs:70