A add bunch of rr for parsing

This commit is contained in:
Miek Gieben 2011-07-14 23:12:43 +02:00
parent b676307226
commit 6c4045c3a0
5 changed files with 1000 additions and 304 deletions

View File

@ -31,5 +31,5 @@ examples:
gomake -C _examples
# yes, hardcoded path, yes ugly, yes deal with it
zparse.go: zparse.rl
zparse.go: zparse.rl types.rl
/home/miekg/svn/ragel/ragel/ragel -Z -G2 -o $@ $<

View File

@ -8,28 +8,6 @@ import (
"crypto/rsa"
)
func TestConversion(t *testing.T) {
/*
println(StringToSeconds("6w8d50"))
println(StringToSeconds("50"))
println(StringToSeconds("1m1m"))
println(StringToSeconds("1w"))
println(StringToSeconds("1d"))
println(StringToSeconds("2d"))
println(StringToSeconds("1d1d"))
*/
/*
println(SecondsToString(604800)) // 1w
println(SecondsToString(604799)) // 1w-1
println(SecondsToString(86400)) // 1d
println(SecondsToString(86401)) // 1d+1
println(SecondsToString(86399)) // 1d-1
println(SecondsToString(86)) // 1m26
println(SecondsToString(60)) // 1m
println(SecondsToString(59)) // 59
*/
}
func TestPrivateKeyRead1(t *testing.T) {
a := `Private-key-format: v1.3
Algorithm: 5 (RSASHA1)
@ -161,6 +139,8 @@ func TestDotInName(t *testing.T) {
// New style (Ragel) parsing
func TestParse(t *testing.T) {
rr, _ := zparse("miek.nl. 3600 IN A 127.0.0.1")
rr, _ := zparse("miek.nl. 3600 IN A 127.0.0.1")
fmt.Printf("Seen a:\n%v\n", rr)
rr, _ = zparse("miek.nl. 3600 IN MX 10 elektron.atoom.net.")
fmt.Printf("Seen a:\n%v\n", rr)
}

31
types.rl Normal file
View File

@ -0,0 +1,31 @@
%%{
machine z;
action rdata_a {
r.(*RR_A).Hdr = *hdr
r.(*RR_A).A = net.ParseIP(data[mark:p])
}
action rdata_ns {
r.(*RR_NS).Hdr = *hdr
r.(*RR_NS).Ns = txt[0]
}
action rdata_cname {
r.(*RR_CNAME).Hdr = *hdr
r.(*RR_CNAME).Cname = txt[0]
}
action rdata_soa {
r.(*RR_SOA).Hdr = *hdr
r.(*RR_SOA).Ns = txt[0]
r.(*RR_SOA).Mbox = txt[1]
r.(*RR_SOA).Serial = uint32(num[0])
r.(*RR_SOA).Refresh = uint32(num[1])
r.(*RR_SOA).Retry = uint32(num[2])
r.(*RR_SOA).Expire = uint32(num[3])
r.(*RR_SOA).Minttl = uint32(num[4])
}
action rdata_mx {
r.(*RR_MX).Hdr = *hdr;
r.(*RR_MX).Pref = uint16(num[0])
r.(*RR_MX).Mx = txt[0]
}
}%%

1183
zparse.go

File diff suppressed because it is too large Load Diff

View File

@ -16,47 +16,57 @@ import (
}%%
func zparse(data string) (r RR, err os.Error) {
cs, p, pe := 0, 0, len(data)
cs, p, pe, eof := 0, 0, len(data), len(data)
j := 0; j = j // Needed for compile.
k := 0; k = k // "
mark := 0
eof := len(data)
hdr := new(RR_Header)
txt := make([]string, 10)
num := make([]int, 10)
%%{
# action rdata_out { fmt.Printf("rdata {%s}\n", data[mark:p]) }
# action qtype_out { fmt.Printf("qtype {%s}\n", data[mark:p]) }
action mark { mark = p }
action qname { hdr.Name = data[mark:p] }
action number { n, _ := strconv.Atoi(data[mark:p]); num[j] = n; j++ }
action text { txt[k] = data[mark:p]; k++ }
action textblank { txt[k] = data[mark:p]; k++ }
action qclass { hdr.Class = Str_class[data[mark:p]] }
action defTtl { /* fmt.Printf("defttl {%s}\n", data[mark:p]) */ }
action setTtl { ttl, _ := strconv.Atoi(data[mark:p]); hdr.Ttl = uint32(ttl) }
action mark { mark = p }
action qname { hdr.Name = data[mark:p] }
action qclass { hdr.Class = Str_class[data[mark:p]] }
action defTtl { /* fmt.Printf("defttl {%s}\n", data[mark:p]) */ }
action setTtl { ttl, _ := strconv.Atoi(data[mark:p]); hdr.Ttl = uint32(ttl) }
action rdata_a {
r = new(RR_A)
r.(*RR_A).Hdr = *hdr
r.(*RR_A).Hdr.Rrtype = TypeA
r.(*RR_A).A = net.ParseIP(data[mark:p])
action qtype {
i := Str_rr[data[mark:p]]
mk, known := rr_mk[int(i)]
if ! known {
// ...
}
r = mk()
hdr.Rrtype = i
}
qclass = ('IN'i|'CS'i|'CH'i|'HS'i|'ANY'i|'NONE'i) %qclass;
ttl = digit+ >mark;
blank = [ \t]+ %mark;
qname = [a-zA-Z0-9.\\]+ %qname;
# RDATA definitions
rdata_a = any+ $1 %0 %rdata_a;
rdata_dnskey = [a-z0-9.\\]+;
qclass = ('IN'i|'CS'i|'CH'i|'HS'i|'ANY'i|'NONE'i) %qclass;
ttl = digit+ >mark;
blank = [ \t]+ %mark;
qname = [a-zA-Z0-9.\\]+ %qname;
textblank = [a-zA-Z0-9.\\ ]+ $1 %0 %textblank;
text = [a-zA-Z0-9.\\]+ $1 %0 %text;
number = [0-9]+ $1 %0 %number;
lhs = qname? blank %defTtl (
(ttl %setTtl blank (qclass blank)?)
| (qclass blank (ttl %setTtl blank)?)
)?;
# RDATA definitions
include "types.rl";
# RR definitions
rhs = (
('A'i blank rdata_a)
| ('DNSKEY'i blank rdata_dnskey)
('A'i %qtype blank text) %rdata_a
| ('NS'i %qtype blank text) %rdata_ns
| ('CNAME'i %qtype blank text) %rdata_cname
| ('SOA'i %qtype blank text blank text blank number blank number blank number blank number blank number) %rdata_soa
| ('MX'i %qtype blank number blank text) %rdata_mx
);
rr = lhs rhs;