mirror of
https://github.com/tinygo-org/net.git
synced 2026-08-03 03:37:44 +00:00
109 lines
2.3 KiB
Go
109 lines
2.3 KiB
Go
// The following is copied from Go 1.16 official implementation.
|
|
|
|
// Copyright 2009 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package net
|
|
|
|
// Bigger than we need, not too big to worry about overflow
|
|
const big = 0xFFFFFF
|
|
|
|
// Decimal to integer.
|
|
// Returns number, characters consumed, success.
|
|
func dtoi(s string) (n int, i int, ok bool) {
|
|
n = 0
|
|
for i = 0; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
|
|
n = n*10 + int(s[i]-'0')
|
|
if n >= big {
|
|
return big, i, false
|
|
}
|
|
}
|
|
if i == 0 {
|
|
return 0, 0, false
|
|
}
|
|
return n, i, true
|
|
}
|
|
|
|
// Hexadecimal to integer.
|
|
// Returns number, characters consumed, success.
|
|
func xtoi(s string) (n int, i int, ok bool) {
|
|
n = 0
|
|
for i = 0; i < len(s); i++ {
|
|
if '0' <= s[i] && s[i] <= '9' {
|
|
n *= 16
|
|
n += int(s[i] - '0')
|
|
} else if 'a' <= s[i] && s[i] <= 'f' {
|
|
n *= 16
|
|
n += int(s[i]-'a') + 10
|
|
} else if 'A' <= s[i] && s[i] <= 'F' {
|
|
n *= 16
|
|
n += int(s[i]-'A') + 10
|
|
} else {
|
|
break
|
|
}
|
|
if n >= big {
|
|
return 0, i, false
|
|
}
|
|
}
|
|
if i == 0 {
|
|
return 0, i, false
|
|
}
|
|
return n, i, true
|
|
}
|
|
|
|
// xtoi2 converts the next two hex digits of s into a byte.
|
|
// If s is longer than 2 bytes then the third byte must be e.
|
|
// If the first two bytes of s are not hex digits or the third byte
|
|
// does not match e, false is returned.
|
|
func xtoi2(s string, e byte) (byte, bool) {
|
|
if len(s) > 2 && s[2] != e {
|
|
return 0, false
|
|
}
|
|
n, ei, ok := xtoi(s[:2])
|
|
return byte(n), ok && ei == 2
|
|
}
|
|
|
|
// Convert unsigned integer to decimal string.
|
|
func uitoa(val uint) string {
|
|
if val == 0 { // avoid string allocation
|
|
return "0"
|
|
}
|
|
var buf [20]byte // big enough for 64bit value base 10
|
|
i := len(buf) - 1
|
|
for val >= 10 {
|
|
q := val / 10
|
|
buf[i] = byte('0' + val - q*10)
|
|
i--
|
|
val = q
|
|
}
|
|
// val < 10
|
|
buf[i] = byte('0' + val)
|
|
return string(buf[i:])
|
|
}
|
|
|
|
// Convert i to a hexadecimal string. Leading zeros are not printed.
|
|
func appendHex(dst []byte, i uint32) []byte {
|
|
if i == 0 {
|
|
return append(dst, '0')
|
|
}
|
|
for j := 7; j >= 0; j-- {
|
|
v := i >> uint(j*4)
|
|
if v > 0 {
|
|
dst = append(dst, hexDigit[v&0xf])
|
|
}
|
|
}
|
|
return dst
|
|
}
|
|
|
|
// Index of rightmost occurrence of b in s.
|
|
func last(s string, b byte) int {
|
|
i := len(s)
|
|
for i--; i >= 0; i-- {
|
|
if s[i] == b {
|
|
break
|
|
}
|
|
}
|
|
return i
|
|
}
|