diff --git a/keygen.go b/keygen.go index 04cefc73..5ff118fd 100644 --- a/keygen.go +++ b/keygen.go @@ -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) { - kv, _ := Kparse(q) + p := NewParser(q) + kv, _ := p.PrivateKey() if _, ok := kv["private-key-format"]; !ok { return nil, ErrPrivKey } diff --git a/kparse.go b/kparse.go index d19304aa..5e26bba1 100644 --- a/kparse.go +++ b/kparse.go @@ -6,13 +6,11 @@ package dns import ( "os" - "io" - "bufio" "strings" ) -// line 16 "kparse.go" +// line 14 "kparse.go" var k_start int = 111 var k_first_final int = 111 var k_error int = 0 @@ -20,43 +18,41 @@ var k_error int = 0 var k_en_main int = 111 -// line 15 "kparse.rl" +// line 13 "kparse.rl" // Parse a private key file as defined in XXX. // A map[string]string is returned with the values. All the keys // are in lowercase. The algorithm is returned as m[algorithm] = "RSASHA1" -func Kparse(q io.Reader) (m map[string]string, err os.Error) { - r := bufio.NewReader(q) - +func (kp *Parser) PrivateKey() (m map[string]string, err os.Error) { m = make(map[string]string) - k := "" - data, err := r.ReadString('\n') - for err == nil { + var k string + lines := strings.SplitAfter(string(kp.buf), "\n", -1) + for _, data := range lines { cs, p, pe := 0, 0, len(data) mark := 0 -// line 41 "kparse.go" +// line 37 "kparse.go" cs = k_start -// line 44 "kparse.go" +// line 40 "kparse.go" { if p == pe { goto _test_eof } switch cs { case -666: // i am a hack D: tr13: -// line 33 "kparse.rl" +// line 29 "kparse.rl" { m[k] = data[mark:p] } goto st111 tr28: -// line 34 "kparse.rl" +// line 30 "kparse.rl" { m[k] = strings.ToUpper(data[mark:p-1]) } goto st111 tr40: -// line 33 "kparse.rl" +// line 29 "kparse.rl" { m[k] = data[mark:p] } -// line 34 "kparse.rl" +// line 30 "kparse.rl" { m[k] = strings.ToUpper(data[mark:p-1]) } goto st111 st111: @@ -64,7 +60,7 @@ st111: if p == pe { goto _test_eof111 } fallthrough case 111: -// line 68 "kparse.go" +// line 64 "kparse.go" switch data[p] { case 65: goto tr110 case 67: goto tr111 @@ -85,7 +81,7 @@ st0: cs = 0; goto _out; tr110: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st1 st1: @@ -93,7 +89,7 @@ st1: if p == pe { goto _test_eof1 } fallthrough case 1: -// line 97 "kparse.go" +// line 93 "kparse.go" switch data[p] { case 67: goto st2 case 76: goto st37 @@ -169,7 +165,7 @@ case 8: if data[p] == 58 { goto tr9 } goto st0 tr9: -// line 32 "kparse.rl" +// line 28 "kparse.rl" { k = strings.ToLower(data[mark:p]) } goto st9 st9: @@ -177,7 +173,7 @@ st9: if p == pe { goto _test_eof9 } fallthrough case 9: -// line 181 "kparse.go" +// line 177 "kparse.go" if data[p] == 32 { goto st10 } goto st0 st10: @@ -208,7 +204,7 @@ case 10: } goto st0 tr11: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st11 st11: @@ -216,7 +212,7 @@ st11: if p == pe { goto _test_eof11 } fallthrough case 11: -// line 220 "kparse.go" +// line 216 "kparse.go" switch data[p] { case 10: goto tr13 case 32: goto st11 @@ -237,7 +233,7 @@ case 11: } goto st0 tr12: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st12 st12: @@ -245,7 +241,7 @@ st12: if p == pe { goto _test_eof12 } fallthrough case 12: -// line 249 "kparse.go" +// line 245 "kparse.go" switch data[p] { case 9: goto st13 case 10: goto tr13 @@ -292,7 +288,7 @@ case 14: } goto st0 tr19: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st15 st15: @@ -300,7 +296,7 @@ st15: if p == pe { goto _test_eof15 } fallthrough case 15: -// line 304 "kparse.go" +// line 300 "kparse.go" switch data[p] { case 83: goto st16 case 115: goto st16 @@ -434,7 +430,7 @@ case 26: } goto st0 tr31: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st27 st27: @@ -442,7 +438,7 @@ st27: if p == pe { goto _test_eof27 } fallthrough case 27: -// line 446 "kparse.go" +// line 442 "kparse.go" switch data[p] { case 10: goto tr13 case 32: goto st11 @@ -761,7 +757,7 @@ case 43: } goto st0 tr111: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st44 st44: @@ -769,7 +765,7 @@ st44: if p == pe { goto _test_eof44 } fallthrough case 44: -// line 773 "kparse.go" +// line 769 "kparse.go" switch data[p] { case 79: goto st45 case 82: goto st54 @@ -918,7 +914,7 @@ case 58: } goto st0 tr112: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st59 st59: @@ -926,7 +922,7 @@ st59: if p == pe { goto _test_eof59 } fallthrough case 59: -// line 930 "kparse.go" +// line 926 "kparse.go" switch data[p] { case 88: goto st60 case 120: goto st60 @@ -1000,7 +996,7 @@ case 66: if 49 <= data[p] && data[p] <= 50 { goto st8 } goto st0 tr113: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st67 st67: @@ -1008,7 +1004,7 @@ st67: if p == pe { goto _test_eof67 } fallthrough case 67: -// line 1012 "kparse.go" +// line 1008 "kparse.go" switch data[p] { case 79: goto st68 case 111: goto st68 @@ -1072,7 +1068,7 @@ case 73: if data[p] == 49 { goto st8 } goto st0 tr114: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st74 st74: @@ -1080,7 +1076,7 @@ st74: if p == pe { goto _test_eof74 } fallthrough case 74: -// line 1084 "kparse.go" +// line 1080 "kparse.go" switch data[p] { case 79: goto st75 case 111: goto st75 @@ -1137,7 +1133,7 @@ case 79: } goto st0 tr115: -// line 31 "kparse.rl" +// line 27 "kparse.rl" { mark = p } goto st80 st80: @@ -1145,7 +1141,7 @@ st80: if p == pe { goto _test_eof80 } fallthrough case 80: -// line 1149 "kparse.go" +// line 1145 "kparse.go" switch data[p] { case 82: goto st81 case 85: goto st103 @@ -1568,9 +1564,8 @@ case 110: _out: {} } -// line 66 "kparse.rl" +// line 62 "kparse.rl" - data, err = r.ReadString('\n') } /* diff --git a/kparse.rl b/kparse.rl index 99b1520b..0230f4e7 100644 --- a/kparse.rl +++ b/kparse.rl @@ -4,8 +4,6 @@ package dns import ( "os" - "io" - "bufio" "strings" ) @@ -17,13 +15,11 @@ import ( // Parse a private key file as defined in XXX. // A map[string]string is returned with the values. All the keys // are in lowercase. The algorithm is returned as m[algorithm] = "RSASHA1" -func Kparse(q io.Reader) (m map[string]string, err os.Error) { - r := bufio.NewReader(q) - +func (kp *Parser) PrivateKey() (m map[string]string, err os.Error) { m = make(map[string]string) - k := "" - data, err := r.ReadString('\n') - for err == nil { + var k string + lines := strings.SplitAfter(string(kp.buf), "\n", -1) + for _, data := range lines { cs, p, pe := 0, 0, len(data) mark := 0 @@ -64,7 +60,6 @@ func Kparse(q io.Reader) (m map[string]string, err os.Error) { write init; write exec; }%% - data, err = r.ReadString('\n') } /* diff --git a/parse_test.go b/parse_test.go index f798f7c0..027056c1 100644 --- a/parse_test.go +++ b/parse_test.go @@ -113,7 +113,7 @@ func TestParse(t *testing.T) { } for test, result := range tests { p := NewParser(strings.NewReader(test)) - z, err := p.Do() + z, err := p.Zone() if err != nil || z == nil{ t.Logf("Error of nil r %v %s\n", err, test) t.Fail() @@ -161,7 +161,7 @@ func BenchmarkZoneParsing(b *testing.B) { } p := NewParser(bufio.NewReader(file)) // Don't care about errors (there shouldn't be any) - p.Do() + p.Zone() } func TestZoneParsing(t *testing.T) { @@ -174,7 +174,7 @@ func TestZoneParsing(t *testing.T) { // Don't care about errors (there shouldn't be any) start := time.Nanoseconds() - z, err := p.Do() + z, err := p.Zone() if err != nil { t.Logf("error %v\n", err.String()) t.Fail() diff --git a/zparse.go b/zparse.go index aad7d58d..88fd6e37 100644 --- a/zparse.go +++ b/zparse.go @@ -80,7 +80,7 @@ var z_en_main int = 134 // Token parses a zone file, but only returns the last RR read. func (zp *Parser) RR() RR { - z, err := zp.Do() + z, err := zp.Zone() if err != nil { return nil } @@ -90,7 +90,7 @@ func (zp *Parser) RR() RR { // All the NewReader stuff is expensive... // only works for short io.Readers as we put the whole thing // 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) data := string(zp.buf) cs, p, pe := 0, 0, len(data) diff --git a/zparse.rl b/zparse.rl index ca59feb8..cd03b208 100644 --- a/zparse.rl +++ b/zparse.rl @@ -71,7 +71,7 @@ func atoi(s string) uint { // Token parses a zone file, but only returns the last RR read. func (zp *Parser) RR() RR { - z, err := zp.Do() + z, err := zp.Zone() if err != nil { return nil } @@ -81,7 +81,7 @@ func (zp *Parser) RR() RR { // All the NewReader stuff is expensive... // only works for short io.Readers as we put the whole thing // 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) data := string(zp.buf) cs, p, pe := 0, 0, len(data)