More Go like

Make a Parser type and define methods on that.
* Zone()    parse and return entire zone
* RR()      parse and return 1 RR
* PrivateKey parse a private key file
This commit is contained in:
Miek Gieben 2011-07-22 23:51:30 +02:00
parent 2a8d7f9694
commit a1a0034733
6 changed files with 49 additions and 58 deletions

View File

@ -130,7 +130,8 @@ func (k *RR_DNSKEY) Read(q io.Reader) os.Error {
} }
func (k *RR_DNSKEY) ReadPrivateKey(q io.Reader) (PrivateKey, os.Error) { func (k *RR_DNSKEY) ReadPrivateKey(q io.Reader) (PrivateKey, os.Error) {
kv, _ := Kparse(q) p := NewParser(q)
kv, _ := p.PrivateKey()
if _, ok := kv["private-key-format"]; !ok { if _, ok := kv["private-key-format"]; !ok {
return nil, ErrPrivKey return nil, ErrPrivKey
} }

View File

@ -6,13 +6,11 @@ package dns
import ( import (
"os" "os"
"io"
"bufio"
"strings" "strings"
) )
// line 16 "kparse.go" // line 14 "kparse.go"
var k_start int = 111 var k_start int = 111
var k_first_final int = 111 var k_first_final int = 111
var k_error int = 0 var k_error int = 0
@ -20,43 +18,41 @@ var k_error int = 0
var k_en_main int = 111 var k_en_main int = 111
// line 15 "kparse.rl" // line 13 "kparse.rl"
// Parse a private key file as defined in XXX. // Parse a private key file as defined in XXX.
// A map[string]string is returned with the values. All the keys // A map[string]string is returned with the values. All the keys
// are in lowercase. The algorithm is returned as m[algorithm] = "RSASHA1" // are in lowercase. The algorithm is returned as m[algorithm] = "RSASHA1"
func Kparse(q io.Reader) (m map[string]string, err os.Error) { func (kp *Parser) PrivateKey() (m map[string]string, err os.Error) {
r := bufio.NewReader(q)
m = make(map[string]string) m = make(map[string]string)
k := "" var k string
data, err := r.ReadString('\n') lines := strings.SplitAfter(string(kp.buf), "\n", -1)
for err == nil { for _, data := range lines {
cs, p, pe := 0, 0, len(data) cs, p, pe := 0, 0, len(data)
mark := 0 mark := 0
// line 41 "kparse.go" // line 37 "kparse.go"
cs = k_start cs = k_start
// line 44 "kparse.go" // line 40 "kparse.go"
{ {
if p == pe { goto _test_eof } if p == pe { goto _test_eof }
switch cs { switch cs {
case -666: // i am a hack D: case -666: // i am a hack D:
tr13: tr13:
// line 33 "kparse.rl" // line 29 "kparse.rl"
{ m[k] = data[mark:p] } { m[k] = data[mark:p] }
goto st111 goto st111
tr28: tr28:
// line 34 "kparse.rl" // line 30 "kparse.rl"
{ m[k] = strings.ToUpper(data[mark:p-1]) } { m[k] = strings.ToUpper(data[mark:p-1]) }
goto st111 goto st111
tr40: tr40:
// line 33 "kparse.rl" // line 29 "kparse.rl"
{ m[k] = data[mark:p] } { m[k] = data[mark:p] }
// line 34 "kparse.rl" // line 30 "kparse.rl"
{ m[k] = strings.ToUpper(data[mark:p-1]) } { m[k] = strings.ToUpper(data[mark:p-1]) }
goto st111 goto st111
st111: st111:
@ -64,7 +60,7 @@ st111:
if p == pe { goto _test_eof111 } if p == pe { goto _test_eof111 }
fallthrough fallthrough
case 111: case 111:
// line 68 "kparse.go" // line 64 "kparse.go"
switch data[p] { switch data[p] {
case 65: goto tr110 case 65: goto tr110
case 67: goto tr111 case 67: goto tr111
@ -85,7 +81,7 @@ st0:
cs = 0; cs = 0;
goto _out; goto _out;
tr110: tr110:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st1 goto st1
st1: st1:
@ -93,7 +89,7 @@ st1:
if p == pe { goto _test_eof1 } if p == pe { goto _test_eof1 }
fallthrough fallthrough
case 1: case 1:
// line 97 "kparse.go" // line 93 "kparse.go"
switch data[p] { switch data[p] {
case 67: goto st2 case 67: goto st2
case 76: goto st37 case 76: goto st37
@ -169,7 +165,7 @@ case 8:
if data[p] == 58 { goto tr9 } if data[p] == 58 { goto tr9 }
goto st0 goto st0
tr9: tr9:
// line 32 "kparse.rl" // line 28 "kparse.rl"
{ k = strings.ToLower(data[mark:p]) } { k = strings.ToLower(data[mark:p]) }
goto st9 goto st9
st9: st9:
@ -177,7 +173,7 @@ st9:
if p == pe { goto _test_eof9 } if p == pe { goto _test_eof9 }
fallthrough fallthrough
case 9: case 9:
// line 181 "kparse.go" // line 177 "kparse.go"
if data[p] == 32 { goto st10 } if data[p] == 32 { goto st10 }
goto st0 goto st0
st10: st10:
@ -208,7 +204,7 @@ case 10:
} }
goto st0 goto st0
tr11: tr11:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st11 goto st11
st11: st11:
@ -216,7 +212,7 @@ st11:
if p == pe { goto _test_eof11 } if p == pe { goto _test_eof11 }
fallthrough fallthrough
case 11: case 11:
// line 220 "kparse.go" // line 216 "kparse.go"
switch data[p] { switch data[p] {
case 10: goto tr13 case 10: goto tr13
case 32: goto st11 case 32: goto st11
@ -237,7 +233,7 @@ case 11:
} }
goto st0 goto st0
tr12: tr12:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st12 goto st12
st12: st12:
@ -245,7 +241,7 @@ st12:
if p == pe { goto _test_eof12 } if p == pe { goto _test_eof12 }
fallthrough fallthrough
case 12: case 12:
// line 249 "kparse.go" // line 245 "kparse.go"
switch data[p] { switch data[p] {
case 9: goto st13 case 9: goto st13
case 10: goto tr13 case 10: goto tr13
@ -292,7 +288,7 @@ case 14:
} }
goto st0 goto st0
tr19: tr19:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st15 goto st15
st15: st15:
@ -300,7 +296,7 @@ st15:
if p == pe { goto _test_eof15 } if p == pe { goto _test_eof15 }
fallthrough fallthrough
case 15: case 15:
// line 304 "kparse.go" // line 300 "kparse.go"
switch data[p] { switch data[p] {
case 83: goto st16 case 83: goto st16
case 115: goto st16 case 115: goto st16
@ -434,7 +430,7 @@ case 26:
} }
goto st0 goto st0
tr31: tr31:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st27 goto st27
st27: st27:
@ -442,7 +438,7 @@ st27:
if p == pe { goto _test_eof27 } if p == pe { goto _test_eof27 }
fallthrough fallthrough
case 27: case 27:
// line 446 "kparse.go" // line 442 "kparse.go"
switch data[p] { switch data[p] {
case 10: goto tr13 case 10: goto tr13
case 32: goto st11 case 32: goto st11
@ -761,7 +757,7 @@ case 43:
} }
goto st0 goto st0
tr111: tr111:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st44 goto st44
st44: st44:
@ -769,7 +765,7 @@ st44:
if p == pe { goto _test_eof44 } if p == pe { goto _test_eof44 }
fallthrough fallthrough
case 44: case 44:
// line 773 "kparse.go" // line 769 "kparse.go"
switch data[p] { switch data[p] {
case 79: goto st45 case 79: goto st45
case 82: goto st54 case 82: goto st54
@ -918,7 +914,7 @@ case 58:
} }
goto st0 goto st0
tr112: tr112:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st59 goto st59
st59: st59:
@ -926,7 +922,7 @@ st59:
if p == pe { goto _test_eof59 } if p == pe { goto _test_eof59 }
fallthrough fallthrough
case 59: case 59:
// line 930 "kparse.go" // line 926 "kparse.go"
switch data[p] { switch data[p] {
case 88: goto st60 case 88: goto st60
case 120: goto st60 case 120: goto st60
@ -1000,7 +996,7 @@ case 66:
if 49 <= data[p] && data[p] <= 50 { goto st8 } if 49 <= data[p] && data[p] <= 50 { goto st8 }
goto st0 goto st0
tr113: tr113:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st67 goto st67
st67: st67:
@ -1008,7 +1004,7 @@ st67:
if p == pe { goto _test_eof67 } if p == pe { goto _test_eof67 }
fallthrough fallthrough
case 67: case 67:
// line 1012 "kparse.go" // line 1008 "kparse.go"
switch data[p] { switch data[p] {
case 79: goto st68 case 79: goto st68
case 111: goto st68 case 111: goto st68
@ -1072,7 +1068,7 @@ case 73:
if data[p] == 49 { goto st8 } if data[p] == 49 { goto st8 }
goto st0 goto st0
tr114: tr114:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st74 goto st74
st74: st74:
@ -1080,7 +1076,7 @@ st74:
if p == pe { goto _test_eof74 } if p == pe { goto _test_eof74 }
fallthrough fallthrough
case 74: case 74:
// line 1084 "kparse.go" // line 1080 "kparse.go"
switch data[p] { switch data[p] {
case 79: goto st75 case 79: goto st75
case 111: goto st75 case 111: goto st75
@ -1137,7 +1133,7 @@ case 79:
} }
goto st0 goto st0
tr115: tr115:
// line 31 "kparse.rl" // line 27 "kparse.rl"
{ mark = p } { mark = p }
goto st80 goto st80
st80: st80:
@ -1145,7 +1141,7 @@ st80:
if p == pe { goto _test_eof80 } if p == pe { goto _test_eof80 }
fallthrough fallthrough
case 80: case 80:
// line 1149 "kparse.go" // line 1145 "kparse.go"
switch data[p] { switch data[p] {
case 82: goto st81 case 82: goto st81
case 85: goto st103 case 85: goto st103
@ -1568,9 +1564,8 @@ case 110:
_out: {} _out: {}
} }
// line 66 "kparse.rl" // line 62 "kparse.rl"
data, err = r.ReadString('\n')
} }
/* /*

View File

@ -4,8 +4,6 @@ package dns
import ( import (
"os" "os"
"io"
"bufio"
"strings" "strings"
) )
@ -17,13 +15,11 @@ import (
// Parse a private key file as defined in XXX. // Parse a private key file as defined in XXX.
// A map[string]string is returned with the values. All the keys // A map[string]string is returned with the values. All the keys
// are in lowercase. The algorithm is returned as m[algorithm] = "RSASHA1" // are in lowercase. The algorithm is returned as m[algorithm] = "RSASHA1"
func Kparse(q io.Reader) (m map[string]string, err os.Error) { func (kp *Parser) PrivateKey() (m map[string]string, err os.Error) {
r := bufio.NewReader(q)
m = make(map[string]string) m = make(map[string]string)
k := "" var k string
data, err := r.ReadString('\n') lines := strings.SplitAfter(string(kp.buf), "\n", -1)
for err == nil { for _, data := range lines {
cs, p, pe := 0, 0, len(data) cs, p, pe := 0, 0, len(data)
mark := 0 mark := 0
@ -64,7 +60,6 @@ func Kparse(q io.Reader) (m map[string]string, err os.Error) {
write init; write init;
write exec; write exec;
}%% }%%
data, err = r.ReadString('\n')
} }
/* /*

View File

@ -113,7 +113,7 @@ func TestParse(t *testing.T) {
} }
for test, result := range tests { for test, result := range tests {
p := NewParser(strings.NewReader(test)) p := NewParser(strings.NewReader(test))
z, err := p.Do() z, err := p.Zone()
if err != nil || z == nil{ if err != nil || z == nil{
t.Logf("Error of nil r %v %s\n", err, test) t.Logf("Error of nil r %v %s\n", err, test)
t.Fail() t.Fail()
@ -161,7 +161,7 @@ func BenchmarkZoneParsing(b *testing.B) {
} }
p := NewParser(bufio.NewReader(file)) p := NewParser(bufio.NewReader(file))
// Don't care about errors (there shouldn't be any) // Don't care about errors (there shouldn't be any)
p.Do() p.Zone()
} }
func TestZoneParsing(t *testing.T) { func TestZoneParsing(t *testing.T) {
@ -174,7 +174,7 @@ func TestZoneParsing(t *testing.T) {
// Don't care about errors (there shouldn't be any) // Don't care about errors (there shouldn't be any)
start := time.Nanoseconds() start := time.Nanoseconds()
z, err := p.Do() z, err := p.Zone()
if err != nil { if err != nil {
t.Logf("error %v\n", err.String()) t.Logf("error %v\n", err.String())
t.Fail() t.Fail()

View File

@ -80,7 +80,7 @@ var z_en_main int = 134
// Token parses a zone file, but only returns the last RR read. // Token parses a zone file, but only returns the last RR read.
func (zp *Parser) RR() RR { func (zp *Parser) RR() RR {
z, err := zp.Do() z, err := zp.Zone()
if err != nil { if err != nil {
return nil return nil
} }
@ -90,7 +90,7 @@ func (zp *Parser) RR() RR {
// All the NewReader stuff is expensive... // All the NewReader stuff is expensive...
// only works for short io.Readers as we put the whole thing // only works for short io.Readers as we put the whole thing
// in a string -- needs to be extended for large files (sliding window). // in a string -- needs to be extended for large files (sliding window).
func (zp *Parser) Do() (z *Zone, err os.Error) { func (zp *Parser) Zone() (z *Zone, err os.Error) {
z = new(Zone) z = new(Zone)
data := string(zp.buf) data := string(zp.buf)
cs, p, pe := 0, 0, len(data) cs, p, pe := 0, 0, len(data)

View File

@ -71,7 +71,7 @@ func atoi(s string) uint {
// Token parses a zone file, but only returns the last RR read. // Token parses a zone file, but only returns the last RR read.
func (zp *Parser) RR() RR { func (zp *Parser) RR() RR {
z, err := zp.Do() z, err := zp.Zone()
if err != nil { if err != nil {
return nil return nil
} }
@ -81,7 +81,7 @@ func (zp *Parser) RR() RR {
// All the NewReader stuff is expensive... // All the NewReader stuff is expensive...
// only works for short io.Readers as we put the whole thing // only works for short io.Readers as we put the whole thing
// in a string -- needs to be extended for large files (sliding window). // in a string -- needs to be extended for large files (sliding window).
func (zp *Parser) Do() (z *Zone, err os.Error) { func (zp *Parser) Zone() (z *Zone, err os.Error) {
z = new(Zone) z = new(Zone)
data := string(zp.buf) data := string(zp.buf)
cs, p, pe := 0, 0, len(data) cs, p, pe := 0, 0, len(data)