A add bunch of rr for parsing
This commit is contained in:
parent
b676307226
commit
6c4045c3a0
2
Makefile
2
Makefile
|
@ -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 $@ $<
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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]
|
||||
}
|
||||
}%%
|
62
zparse.rl
62
zparse.rl
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue