// 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 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 }