Add txt and fixup ds, ta and dlv

This commit is contained in:
Miek Gieben 2011-07-29 12:18:20 +02:00
parent 9cfece64db
commit 33fbece4ca
4 changed files with 289 additions and 135 deletions

View File

@ -174,6 +174,7 @@ func TestZoneParsing(t *testing.T) {
t.Logf("error %v\n", err.String())
t.Fail()
}
t.Logf("%s\n", z.DebugString())
delta := time.Nanoseconds() - start
t.Logf("%d RRs parsed in %.2f s (%.2f RR/s)", z.Len()-1, float32(delta)/1e9, float32(z.Len()-1)/(float32(delta)/1e9))
t.Logf("%d RRs parsed in %.2f s (%.2f RR/s)", z.Len(), float32(delta)/1e9, float32(z.Len())/(float32(delta)/1e9))
}

110
types.rl
View File

@ -95,45 +95,84 @@
}
action setDS {
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_DS)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeDS
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[0], line: l}
}
rr.KeyTag = uint16(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[1], line: l}
}
rr.Algorithm = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[2], line: l}
}
rr.DigestType = uint8(i)
rr.Digest = rdf[3]
z.PushRR(rr)
}
action setDLV {
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_DLV)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeDLV
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[0], line: l}
}
rr.KeyTag = uint16(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[1], line: l}
}
rr.Algorithm = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[2], line: l}
}
rr.DigestType = uint8(i)
rr.Digest = rdf[3]
z.PushRR(rr)
}
action setTA {
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_TA)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeTA
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[0], line: l}
}
rr.KeyTag = uint16(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[1], line: l}
}
rr.Algorithm = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[2], line: l}
}
rr.DigestType = uint8(i)
rr.Digest = rdf[3]
z.PushRR(rr)
}
action setDNSKEY {
var (
i uint
e os.Error
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_DNSKEY)
@ -224,30 +263,45 @@
}
action setNSEC3 {
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 0)
rr := new(RR_NSEC3)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeNSEC3
rr.Hash = uint8(atoi(rdf[0]))
rr.Flags = uint8(atoi(rdf[1]))
rr.Iterations = uint16(atoi(rdf[2]))
rr.SaltLength = uint8(atoi(rdf[3]))
rr.Salt = rdf[4]
rr.HashLength = uint8(atoi(rdf[4]))
rr.NextDomain = rdf[5]
rr.TypeBitMap = make([]uint16, len(rdf)-6)
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad NSEC3", name: rdf[0], line: l}
}
rr.Hash = uint8(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad NSEC3", name: rdf[1], line: l}
}
rr.Flags = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad NSEC3", name: rdf[2], line: l}
}
rr.Iterations = uint16(i)
rr.SaltLength = uint8(len(rdf[3]))
rr.Salt = rdf[3]
rr.HashLength = uint8(len(rdf[4]))
rr.NextDomain = rdf[4]
rr.TypeBitMap = make([]uint16, len(rdf)-5)
// Fill the Type Bit Map
for i := 6; i < len(rdf); i++ {
for i := 5; i < len(rdf); i++ {
// Check if its there in the map TODO
rr.TypeBitMap[i-6] = str_rr[rdf[i]]
rr.TypeBitMap[i-5] = str_rr[rdf[i]]
}
z.PushRR(rr)
}
action setNSEC3PARAM {
var (
i int
e os.Error
i int
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_NSEC3PARAM)
@ -274,6 +328,12 @@
}
action setTXT {
rdf := fields(data[mark:p], 1)
rr := new(RR_TXT)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeTXT
rr.Txt = rdf[0]
z.PushRR(rr)
}
action setSRV {
@ -293,8 +353,8 @@
action setSSHFP {
var (
i int
e os.Error
i int
e os.Error
)
rdf := fields(data[mark:p], 3)
rr := new(RR_SSHFP)

56
zone.go
View File

@ -58,7 +58,10 @@ func (z Zone) Len() int {
i := 0
for _, im := range z {
for _, s := range im {
i += len(s.RRs) //+ len(s.RRsigs)
i += len(s.RRs) + len(s.RRsigs)
if s.Nxt != nil {
i++
}
}
}
return i
@ -69,11 +72,33 @@ func (z Zone) String() string {
for _, im := range z {
for _, s1 := range im {
s += s1.RRs.String()
s += s1.RRsigs.String()
if s1.Nxt != nil {
s += s1.Nxt.String()
}
}
}
return s
}
// Create a debug output of the zone
func (z Zone) DebugString() string {
s := ""
for name, im := range z {
s += "Data for: [" + name + "]\n"
for _, s1 := range im {
s += s1.RRs.String()
s += s1.RRsigs.String()
if s1.Nxt != nil {
s += s1.Nxt.String()
}
}
s += "\n"
}
return s
}
// Add a new RR to the zone. First we need to find out if the
// RR already lives inside it.
func (z Zone) PushRR(r RR) {
@ -83,12 +108,9 @@ func (z Zone) PushRR(r RR) {
}
switch r.Header().Rrtype {
case TypeRRSIG:
fallthrough
// If nsec/nsec3/rrsig comes first, tricky with allocation
// Need to always check all 4 item
// s.RRsigs.Push(r)
s.RRsigs.Push(r)
case TypeNSEC, TypeNSEC3:
fallthrough
s.Nxt = r
default:
s.RRs.Push(r)
}
@ -97,15 +119,27 @@ func (z Zone) PushRR(r RR) {
// Push a new ZRRset to the zone
func (z Zone) Push(s *ZRRset) {
i := intval(s.RRs[0].Header().Class, s.RRs[0].Header().Rrtype)
// Need to check the type covered as the RRsigs (if any)
if z[s.RRs[0].Header().Name] == nil {
// s can hold RRs, RRsigs or a Nxt
name := ""
i := 0
switch {
case len(s.RRs) != 0:
name = s.RRs[0].Header().Name
i = intval(s.RRs[0].Header().Class, s.RRs[0].Header().Rrtype)
case len(s.RRsigs) != 0:
name = s.RRsigs[0].Header().Name
i = intval(s.RRsigs[0].Header().Class, s.RRsigs[0].Header().Rrtype)
case s.Nxt != nil:
name = s.Nxt.Header().Name
i = intval(s.Nxt.Header().Class, s.Nxt.Header().Rrtype)
}
if z[name] == nil {
im := make(map[int]*ZRRset) // intmap
im[i] = s
z[s.RRs[0].Header().Name] = im
z[name] = im
return
}
im := z[s.RRs[0].Header().Name]
im := z[name]
im[i] = s
return
}

255
zparse.go
View File

@ -13,7 +13,6 @@ import (
"strconv"
)
// REALLY make haste with the window reading
const _IOBUF = MaxMsgSize
// A Parser represents a DNS parser for a
@ -170,7 +169,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr50:
// line 282 "types.rl"
// line 342 "types.rl"
{
}
// line 121 "zparse.rl"
@ -197,15 +196,28 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr70:
// line 109 "types.rl"
// line 122 "types.rl"
{
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_DLV)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeDLV
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[0], line: l}
}
rr.KeyTag = uint16(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[1], line: l}
}
rr.Algorithm = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[2], line: l}
}
rr.DigestType = uint8(i)
rr.Digest = rdf[3]
z.PushRR(rr)
}
@ -215,7 +227,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr79:
// line 288 "types.rl"
// line 348 "types.rl"
{
}
// line 121 "zparse.rl"
@ -224,7 +236,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr87:
// line 133 "types.rl"
// line 172 "types.rl"
{
var (
i uint
@ -258,13 +270,26 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
tr92:
// line 97 "types.rl"
{
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_DS)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeDS
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[0], line: l}
}
rr.KeyTag = uint16(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[1], line: l}
}
rr.Algorithm = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[2], line: l}
}
rr.DigestType = uint8(i)
rr.Digest = rdf[3]
z.PushRR(rr)
}
@ -294,7 +319,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr108:
// line 291 "types.rl"
// line 351 "types.rl"
{
}
// line 121 "zparse.rl"
@ -321,7 +346,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr121:
// line 211 "types.rl"
// line 250 "types.rl"
{
rdf := fields(data[mark:p], 0)
rr := new(RR_NSEC)
@ -342,24 +367,39 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr127:
// line 226 "types.rl"
// line 265 "types.rl"
{
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 0)
rr := new(RR_NSEC3)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeNSEC3
rr.Hash = uint8(atoi(rdf[0]))
rr.Flags = uint8(atoi(rdf[1]))
rr.Iterations = uint16(atoi(rdf[2]))
rr.SaltLength = uint8(atoi(rdf[3]))
rr.Salt = rdf[4]
rr.HashLength = uint8(atoi(rdf[4]))
rr.NextDomain = rdf[5]
rr.TypeBitMap = make([]uint16, len(rdf)-6)
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad NSEC3", name: rdf[0], line: l}
}
rr.Hash = uint8(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad NSEC3", name: rdf[1], line: l}
}
rr.Flags = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad NSEC3", name: rdf[2], line: l}
}
rr.Iterations = uint16(i)
rr.SaltLength = uint8(len(rdf[3]))
rr.Salt = rdf[3]
rr.HashLength = uint8(len(rdf[4]))
rr.NextDomain = rdf[4]
rr.TypeBitMap = make([]uint16, len(rdf)-5)
// Fill the Type Bit Map
for i := 6; i < len(rdf); i++ {
for i := 5; i < len(rdf); i++ {
// Check if its there in the map TODO
rr.TypeBitMap[i-6] = str_rr[rdf[i]]
rr.TypeBitMap[i-5] = str_rr[rdf[i]]
}
z.PushRR(rr)
}
@ -369,7 +409,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr136:
// line 247 "types.rl"
// line 301 "types.rl"
{
var (
i int
@ -401,7 +441,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr143:
// line 285 "types.rl"
// line 345 "types.rl"
{
}
// line 121 "zparse.rl"
@ -410,7 +450,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr152:
// line 159 "types.rl"
// line 198 "types.rl"
{
var (
i uint
@ -511,7 +551,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr167:
// line 279 "types.rl"
// line 339 "types.rl"
{
}
// line 121 "zparse.rl"
@ -520,7 +560,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr175:
// line 294 "types.rl"
// line 354 "types.rl"
{
var (
i int
@ -546,15 +586,28 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr182:
// line 121 "types.rl"
// line 147 "types.rl"
{
var (
i uint
e os.Error
)
rdf := fields(data[mark:p], 4)
rr := new(RR_TA)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeTA
rr.KeyTag = uint16(atoi(rdf[0]))
rr.Algorithm = uint8(atoi(rdf[1]))
rr.DigestType = uint8(atoi(rdf[2]))
if i, e = strconv.Atoui(rdf[0]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[0], line: l}
}
rr.KeyTag = uint16(i)
if i, e = strconv.Atoui(rdf[1]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[1], line: l}
}
rr.Algorithm = uint8(i)
if i, e = strconv.Atoui(rdf[2]); e != nil {
return z, &ParseError{Error: "bad DS", name: rdf[2], line: l}
}
rr.DigestType = uint8(i)
rr.Digest = rdf[3]
z.PushRR(rr)
}
@ -564,8 +617,14 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
goto st141
tr188:
// line 276 "types.rl"
// line 330 "types.rl"
{
rdf := fields(data[mark:p], 1)
rr := new(RR_TXT)
rr.Hdr = hdr
rr.Hdr.Rrtype = TypeTXT
rr.Txt = rdf[0]
z.PushRR(rr)
}
// line 121 "zparse.rl"
{
@ -585,7 +644,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 141:
// line 537 "zparse.go"
// line 597 "zparse.go"
switch data[p] {
case 9:
goto st1
@ -635,7 +694,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 1:
// line 574 "zparse.go"
// line 634 "zparse.go"
switch data[p] {
case 9:
goto st1
@ -706,7 +765,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 2:
// line 614 "zparse.go"
// line 674 "zparse.go"
switch data[p] {
case 9:
goto tr14
@ -731,7 +790,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 3:
// line 630 "zparse.go"
// line 690 "zparse.go"
switch data[p] {
case 9:
goto st3
@ -795,7 +854,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 4:
// line 667 "zparse.go"
// line 727 "zparse.go"
switch data[p] {
case 9:
goto st5
@ -836,7 +895,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 6:
// line 695 "zparse.go"
// line 755 "zparse.go"
if data[p] == 10 {
goto tr33
}
@ -854,7 +913,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 7:
// line 707 "zparse.go"
// line 767 "zparse.go"
switch data[p] {
case 9:
goto tr31
@ -935,7 +994,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 12:
// line 764 "zparse.go"
// line 824 "zparse.go"
if data[p] == 10 {
goto tr40
}
@ -953,7 +1012,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 13:
// line 776 "zparse.go"
// line 836 "zparse.go"
switch data[p] {
case 9:
goto tr38
@ -976,7 +1035,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 14:
// line 792 "zparse.go"
// line 852 "zparse.go"
switch data[p] {
case 69:
goto st15
@ -1063,7 +1122,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 19:
// line 852 "zparse.go"
// line 912 "zparse.go"
if data[p] == 10 {
goto tr50
}
@ -1081,7 +1140,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 20:
// line 864 "zparse.go"
// line 924 "zparse.go"
switch data[p] {
case 9:
goto tr48
@ -1125,7 +1184,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 22:
// line 894 "zparse.go"
// line 954 "zparse.go"
switch data[p] {
case 9:
goto st22
@ -1272,7 +1331,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 29:
// line 990 "zparse.go"
// line 1050 "zparse.go"
if data[p] == 10 {
goto tr61
}
@ -1290,7 +1349,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 30:
// line 1002 "zparse.go"
// line 1062 "zparse.go"
switch data[p] {
case 9:
goto tr59
@ -1312,7 +1371,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 31:
// line 1018 "zparse.go"
// line 1078 "zparse.go"
switch data[p] {
case 76:
goto st32
@ -1385,7 +1444,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 35:
// line 1068 "zparse.go"
// line 1128 "zparse.go"
if data[p] == 10 {
goto tr70
}
@ -1403,7 +1462,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 36:
// line 1080 "zparse.go"
// line 1140 "zparse.go"
switch data[p] {
case 9:
goto tr68
@ -1502,7 +1561,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 42:
// line 1149 "zparse.go"
// line 1209 "zparse.go"
if data[p] == 10 {
goto tr79
}
@ -1520,7 +1579,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 43:
// line 1161 "zparse.go"
// line 1221 "zparse.go"
switch data[p] {
case 9:
goto tr77
@ -1615,7 +1674,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 49:
// line 1228 "zparse.go"
// line 1288 "zparse.go"
if data[p] == 10 {
goto tr87
}
@ -1633,7 +1692,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 50:
// line 1240 "zparse.go"
// line 1300 "zparse.go"
switch data[p] {
case 9:
goto tr85
@ -1686,7 +1745,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 53:
// line 1277 "zparse.go"
// line 1337 "zparse.go"
if data[p] == 10 {
goto tr92
}
@ -1704,7 +1763,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 54:
// line 1289 "zparse.go"
// line 1349 "zparse.go"
switch data[p] {
case 9:
goto tr90
@ -1726,7 +1785,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 55:
// line 1305 "zparse.go"
// line 1365 "zparse.go"
switch data[p] {
case 88:
goto st56
@ -1777,7 +1836,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 58:
// line 1341 "zparse.go"
// line 1401 "zparse.go"
if data[p] == 10 {
goto tr98
}
@ -1795,7 +1854,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 59:
// line 1353 "zparse.go"
// line 1413 "zparse.go"
switch data[p] {
case 9:
goto tr96
@ -1817,7 +1876,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 60:
// line 1369 "zparse.go"
// line 1429 "zparse.go"
switch data[p] {
case 65:
goto st61
@ -1914,7 +1973,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 66:
// line 1437 "zparse.go"
// line 1497 "zparse.go"
if data[p] == 10 {
goto tr108
}
@ -1932,7 +1991,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 67:
// line 1449 "zparse.go"
// line 1509 "zparse.go"
switch data[p] {
case 9:
goto tr106
@ -1989,7 +2048,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 70:
// line 1488 "zparse.go"
// line 1548 "zparse.go"
if data[p] == 10 {
goto tr114
}
@ -2007,7 +2066,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 71:
// line 1500 "zparse.go"
// line 1560 "zparse.go"
switch data[p] {
case 9:
goto tr112
@ -2076,7 +2135,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 75:
// line 1548 "zparse.go"
// line 1608 "zparse.go"
if data[p] == 10 {
goto tr121
}
@ -2094,7 +2153,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 76:
// line 1560 "zparse.go"
// line 1620 "zparse.go"
switch data[p] {
case 9:
goto tr119
@ -2151,7 +2210,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 79:
// line 1599 "zparse.go"
// line 1659 "zparse.go"
if data[p] == 10 {
goto tr127
}
@ -2169,7 +2228,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 80:
// line 1611 "zparse.go"
// line 1671 "zparse.go"
switch data[p] {
case 9:
goto tr125
@ -2278,7 +2337,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 87:
// line 1688 "zparse.go"
// line 1748 "zparse.go"
if data[p] == 10 {
goto tr136
}
@ -2296,7 +2355,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 88:
// line 1700 "zparse.go"
// line 1760 "zparse.go"
switch data[p] {
case 9:
goto tr134
@ -2318,7 +2377,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 89:
// line 1716 "zparse.go"
// line 1776 "zparse.go"
switch data[p] {
case 84:
goto st90
@ -2383,7 +2442,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 93:
// line 1762 "zparse.go"
// line 1822 "zparse.go"
if data[p] == 10 {
goto tr143
}
@ -2401,7 +2460,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 94:
// line 1774 "zparse.go"
// line 1834 "zparse.go"
switch data[p] {
case 9:
goto tr141
@ -2423,7 +2482,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 95:
// line 1790 "zparse.go"
// line 1850 "zparse.go"
switch data[p] {
case 82:
goto st96
@ -2516,7 +2575,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 101:
// line 1856 "zparse.go"
// line 1916 "zparse.go"
if data[p] == 10 {
goto tr152
}
@ -2534,7 +2593,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 102:
// line 1868 "zparse.go"
// line 1928 "zparse.go"
switch data[p] {
case 9:
goto tr150
@ -2556,7 +2615,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 103:
// line 1884 "zparse.go"
// line 1944 "zparse.go"
switch data[p] {
case 79:
goto st104
@ -2629,7 +2688,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 107:
// line 1934 "zparse.go"
// line 1994 "zparse.go"
if data[p] == 10 {
goto tr161
}
@ -2647,7 +2706,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 108:
// line 1946 "zparse.go"
// line 2006 "zparse.go"
switch data[p] {
case 9:
goto tr159
@ -2714,7 +2773,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 112:
// line 1993 "zparse.go"
// line 2053 "zparse.go"
if data[p] == 10 {
goto tr167
}
@ -2732,7 +2791,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 113:
// line 2005 "zparse.go"
// line 2065 "zparse.go"
switch data[p] {
case 9:
goto tr165
@ -2827,7 +2886,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 119:
// line 2072 "zparse.go"
// line 2132 "zparse.go"
if data[p] == 10 {
goto tr175
}
@ -2845,7 +2904,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 120:
// line 2084 "zparse.go"
// line 2144 "zparse.go"
switch data[p] {
case 9:
goto tr173
@ -2867,7 +2926,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 121:
// line 2100 "zparse.go"
// line 2160 "zparse.go"
switch data[p] {
case 65:
goto st122
@ -2922,7 +2981,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 124:
// line 2138 "zparse.go"
// line 2198 "zparse.go"
if data[p] == 10 {
goto tr182
}
@ -2940,7 +2999,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 125:
// line 2150 "zparse.go"
// line 2210 "zparse.go"
switch data[p] {
case 9:
goto tr180
@ -3007,7 +3066,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 129:
// line 2197 "zparse.go"
// line 2257 "zparse.go"
if data[p] == 10 {
goto tr188
}
@ -3025,7 +3084,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 130:
// line 2209 "zparse.go"
// line 2269 "zparse.go"
switch data[p] {
case 9:
goto tr186
@ -3048,7 +3107,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 131:
// line 2225 "zparse.go"
// line 2285 "zparse.go"
switch data[p] {
case 83:
goto st21
@ -3069,7 +3128,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 132:
// line 2240 "zparse.go"
// line 2300 "zparse.go"
switch data[p] {
case 78:
goto st21
@ -3093,7 +3152,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 133:
// line 2257 "zparse.go"
// line 2317 "zparse.go"
switch data[p] {
case 69:
goto st15
@ -3136,7 +3195,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 135:
// line 2286 "zparse.go"
// line 2346 "zparse.go"
switch data[p] {
case 9:
goto st135
@ -3196,7 +3255,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 136:
// line 2320 "zparse.go"
// line 2380 "zparse.go"
switch data[p] {
case 9:
goto tr193
@ -3223,7 +3282,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 137:
// line 2338 "zparse.go"
// line 2398 "zparse.go"
switch data[p] {
case 83:
goto st134
@ -3247,7 +3306,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 138:
// line 2355 "zparse.go"
// line 2415 "zparse.go"
switch data[p] {
case 78:
goto st134
@ -3268,7 +3327,7 @@ func (zp *Parser) Zone() (z Zone, err os.Error) {
}
fallthrough
case 139:
// line 2370 "zparse.go"
// line 2430 "zparse.go"
switch data[p] {
case 9:
goto tr195