* gcc-interface/decl.c (warn_on_field_placement): Issue the warning
[official-gcc.git] / libgo / go / net / port.go
blob8e1321afa44b2db37c286e76ae15fd1fd43b6cd4
1 // Copyright 2016 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 package net
7 // parsePort parses service as a decimal interger and returns the
8 // corresponding value as port. It is the caller's responsibility to
9 // parse service as a non-decimal integer when needsLookup is true.
11 // Some system resolvers will return a valid port number when given a number
12 // over 65536 (see https://github.com/golang/go/issues/11715). Alas, the parser
13 // can't bail early on numbers > 65536. Therefore reasonably large/small
14 // numbers are parsed in full and rejected if invalid.
15 func parsePort(service string) (port int, needsLookup bool) {
16 if service == "" {
17 // Lock in the legacy behavior that an empty string
18 // means port 0. See golang.org/issue/13610.
19 return 0, false
21 const (
22 max = uint32(1<<32 - 1)
23 cutoff = uint32(1 << 30)
25 neg := false
26 if service[0] == '+' {
27 service = service[1:]
28 } else if service[0] == '-' {
29 neg = true
30 service = service[1:]
32 var n uint32
33 for _, d := range service {
34 if '0' <= d && d <= '9' {
35 d -= '0'
36 } else {
37 return 0, true
39 if n >= cutoff {
40 n = max
41 break
43 n *= 10
44 nn := n + uint32(d)
45 if nn < n || nn > max {
46 n = max
47 break
49 n = nn
51 if !neg && n >= cutoff {
52 port = int(cutoff - 1)
53 } else if neg && n > cutoff {
54 port = int(cutoff)
55 } else {
56 port = int(n)
58 if neg {
59 port = -port
61 return port, false