Commit e72156b3 authored by Russ Cox's avatar Russ Cox

remove unused labels

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/4274052
parent 35cee9f5
......@@ -12,6 +12,8 @@
package net
import "os"
// IP address lengths (bytes).
const (
IPv4len = 4
......@@ -39,11 +41,7 @@ type IPMask []byte
// IPv4 address a.b.c.d.
func IPv4(a, b, c, d byte) IP {
p := make(IP, IPv6len)
for i := 0; i < 10; i++ {
p[i] = 0
}
p[10] = 0xff
p[11] = 0xff
copy(p, v4InV6Prefix)
p[12] = a
p[13] = b
p[14] = c
......@@ -51,6 +49,8 @@ func IPv4(a, b, c, d byte) IP {
return p
}
var v4InV6Prefix = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}
// IPv4Mask returns the IP mask (in 16-byte form) of the
// IPv4 mask a.b.c.d.
func IPv4Mask(a, b, c, d byte) IPMask {
......@@ -140,9 +140,24 @@ func (ip IP) DefaultMask() IPMask {
return nil // not reached
}
func allFF(b []byte) bool {
for _, c := range b {
if c != 0xff {
return false
}
}
return true
}
// Mask returns the result of masking the IP address ip with mask.
func (ip IP) Mask(mask IPMask) IP {
n := len(ip)
if len(mask) == 16 && len(ip) == 4 && allFF(mask[:12]) {
mask = mask[12:]
}
if len(mask) == 4 && len(ip) == 16 && bytesEqual(ip[:12], v4InV6Prefix) {
ip = ip[12:]
}
if n != len(mask) {
return nil
}
......@@ -245,6 +260,34 @@ func (ip IP) String() string {
return s
}
// Equal returns true if ip and x are the same IP address.
// An IPv4 address and that same address in IPv6 form are
// considered to be equal.
func (ip IP) Equal(x IP) bool {
if len(ip) == len(x) {
return bytesEqual(ip, x)
}
if len(ip) == 4 && len(x) == 16 {
return bytesEqual(x[0:12], v4InV6Prefix) && bytesEqual(ip, x[12:])
}
if len(ip) == 16 && len(x) == 4 {
return bytesEqual(ip[0:12], v4InV6Prefix) && bytesEqual(ip[12:], x)
}
return false
}
func bytesEqual(x, y []byte) bool {
if len(x) != len(y) {
return false
}
for i, b := range x {
if y[i] != b {
return false
}
}
return true
}
// If mask is a sequence of 1 bits followed by 0 bits,
// return the number of 1 bits.
func simpleMaskLength(mask IPMask) int {
......@@ -351,7 +394,6 @@ func parseIPv6(s string) IP {
// Loop, parsing hex numbers followed by colon.
j := 0
L:
for j < IPv6len {
// Hex number.
n, i1, ok := xtoi(s, i)
......@@ -432,15 +474,66 @@ L:
return p
}
// A SyntaxError represents a malformed text string and the type of string that was expected.
type SyntaxError struct {
Type string
Text string
}
func (e *SyntaxError) String() string {
return "invalid " + e.Type + ": " + e.Text
}
func parseIP(s string) IP {
if p := parseIPv4(s); p != nil {
return p
}
if p := parseIPv6(s); p != nil {
return p
}
return nil
}
// ParseIP parses s as an IP address, returning the result.
// The string s can be in dotted decimal ("74.125.19.99")
// or IPv6 ("2001:4860:0:2001::68") form.
// If s is not a valid textual representation of an IP address,
// ParseIP returns nil.
func ParseIP(s string) IP {
p := parseIPv4(s)
if p != nil {
if p := parseIPv4(s); p != nil {
return p
}
return parseIPv6(s)
}
// ParseCIDR parses s as a CIDR notation IP address and mask,
// like "192.168.100.1/24" or "2001:DB8::/48".
func ParseCIDR(s string) (ip IP, mask IPMask, err os.Error) {
i := byteIndex(s, '/')
if i < 0 {
return nil, nil, &SyntaxError{"CIDR address", s}
}
ipstr, maskstr := s[:i], s[i+1:]
ip = ParseIP(ipstr)
nn, i, ok := dtoi(maskstr, 0)
if ip == nil || !ok || i != len(maskstr) || nn < 0 || nn > 8*len(ip) {
return nil, nil, &SyntaxError{"CIDR address", s}
}
n := uint(nn)
if len(ip) == 4 {
v4mask := ^uint32(0xffffffff >> n)
mask = IPMask(IPv4(byte(v4mask>>24), byte(v4mask>>16), byte(v4mask>>8), byte(v4mask)))
return ip, mask, nil
}
mask = make(IPMask, 16)
for i := 0; i < 16; i++ {
if n >= 8 {
mask[i] = 0xff
n -= 8
continue
}
mask[i] = ^byte(0xff >> n)
n = 0
}
return ip, mask, nil
}
......@@ -267,7 +267,6 @@ func (t *Template) nextItem() []byte {
}
leadingSpace := i > start
// What's left is nothing, newline, delimited string, or plain text
Switch:
switch {
case i == len(t.buf):
// EOF; nothing to do
......
......@@ -815,7 +815,6 @@ Input:
// Parsers are required to recognize lt, gt, amp, apos, and quot
// even if they have not been declared. That's all we allow.
var i int
CharLoop:
for i = 0; i < len(p.tmp); i++ {
var ok bool
p.tmp[i], ok = p.getc()
......
......@@ -7,16 +7,21 @@
package main
func main() {
var i int;
var j int;
if true {}
{ return }
i = 0;
if true {} else i++;
type s struct {};
i = 0;
type s2 int;
var k = func (a int) int { return a+1 }(3);
_, _ = j, k;
ro: ;
var i int
var j int
if true {
}
{
return
}
i = 0
if true {
} else {
i++
}
type s struct{}
i = 0
type s2 int
var k = func(a int) int { return a + 1 }(3)
_, _ = j, k
}
// $G $D/$F.go && $L $F.$A && ./$A.out
// $G $D/$F.go && $L $F.$A
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
......@@ -7,12 +7,16 @@
package main
func f() {
exit: ;
exit:
;
goto exit
}
func main() {
exit: ; // this should be legal (labels not properly scoped?)
exit:
; // this should be legal (labels not properly scoped?)
goto exit
}
/*
......
......@@ -7,7 +7,8 @@
package main
func main() {
var exit int;
var exit int
exit:
_ = exit;
_ = exit
goto exit
}
......@@ -7,18 +7,19 @@
package main
func f1() {
exit:
print("hi\n");
exit:
print("hi\n")
goto exit
}
func f2() {
const c = 1234;
const c = 1234
}
func f3() {
i := c; // ERROR "undef"
i := c // ERROR "undef"
}
func main() {
f3();
f3()
}
......@@ -8,16 +8,21 @@ package main
func main() {
L1:
L2: for i := 0; i < 10; i++ {
print(i);
break L2;
L2:
for i := 0; i < 10; i++ {
print(i)
break L2
}
L3: ;
L4: for i := 0; i < 10; i++ {
print(i);
break L4;
L3:
;
L4:
for i := 0; i < 10; i++ {
print(i)
break L4
}
goto L1
goto L3
}
/*
......
......@@ -7,8 +7,17 @@
package main
func main() {
if true {} else L1: ;
if true {} else L2: main() ;
if true {
} else {
L1:
}
if true {
} else {
L2:
main()
}
goto L1
goto L2
}
/*
......
......@@ -9,19 +9,25 @@ package main
func main() {
L:
for i := 0; i < 1; i++ {
L1:
L1:
for {
break L;
break L
}
panic("BUG: not reached - break");
panic("BUG: not reached - break")
}
L2:
for i := 0; i < 1; i++ {
L3:
L3:
for {
continue L2;
continue L2
}
panic("BUG: not reached - continue");
panic("BUG: not reached - continue")
}
if false {
goto L1
}
if false {
goto L3
}
}
......@@ -10,16 +10,18 @@ func main() {
L:
for {
for {
break L2; // ERROR "L2"
continue L2; // ERROR "L2"
break L2 // ERROR "L2"
continue L2 // ERROR "L2"
}
}
L1:
x := 1;
_ = x;
x := 1
_ = x
for {
break L1; // ERROR "L1"
continue L1; // ERROR "L1"
break L1 // ERROR "L1"
continue L1 // ERROR "L1"
}
goto L
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment