First chunk in parsing LOC RRs

This commit is contained in:
Miek Gieben 2012-04-30 16:54:02 +02:00
parent 0940f549bf
commit b50e3f690e
3 changed files with 51 additions and 11 deletions

View File

@ -618,9 +618,9 @@ func (rr *RR_LOC) String() string {
} else {
s += fmt.Sprintf("%.0fm ", float64(s1))
}
s += locCM((rr.Size&0xf0)>>4, rr.Size&0x0f) + "m "
s += locCM((rr.HorizPre&0xf0)>>4, rr.HorizPre&0x0f) + "m "
s += locCM((rr.VertPre&0xf0)>>4, rr.VertPre&0x0f) + "m"
s += cmToString((rr.Size&0xf0)>>4, rr.Size&0x0f) + "m "
s += cmToString((rr.HorizPre&0xf0)>>4, rr.HorizPre&0x0f) + "m "
s += cmToString((rr.VertPre&0xf0)>>4, rr.VertPre&0x0f) + "m"
return s
}
@ -1109,7 +1109,7 @@ func saltString(s string) string {
return strings.ToUpper(s)
}
func locCM(mantissa, exponent uint8) string {
func cmToString(mantissa, exponent uint8) string {
switch exponent {
case 0, 1:
if exponent == 1 {

View File

@ -210,7 +210,7 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
// Discard, can happen when there is nothing on the
// line except the RR type
case _STRING: // First thing on the is the ttl
if ttl, ok := stringToTtl(l, f); !ok {
if ttl, ok := stringToTtl(l.token); !ok {
t <- Token{Error: &ParseError{f, "not a TTL", l}}
return
} else {
@ -264,7 +264,7 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
t <- Token{Error: e}
return
}
if ttl, ok := stringToTtl(l, f); !ok {
if ttl, ok := stringToTtl(l.token); !ok {
t <- Token{Error: &ParseError{f, "expecting $TTL value, not this...", l}}
return
} else {
@ -310,7 +310,7 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
h.Class = l.torc
st = _EXPECT_ANY_NOCLASS_BL
case _STRING: // TTL is this case
if ttl, ok := stringToTtl(l, f); !ok {
if ttl, ok := stringToTtl(l.token); !ok {
t <- Token{Error: &ParseError{f, "not a TTL", l}}
return
} else {
@ -349,7 +349,7 @@ func parseZone(r io.Reader, origin, f string, t chan Token, include int) {
case _EXPECT_ANY_NOCLASS:
switch l.value {
case _STRING: // TTL
if ttl, ok := stringToTtl(l, f); !ok {
if ttl, ok := stringToTtl(l.token); !ok {
t <- Token{Error: &ParseError{f, "not a TTL", l}}
return
} else {
@ -698,10 +698,10 @@ func typeToInt(token string) (uint16, bool) {
}
// Parse things like 2w, 2m, etc, Return the time in seconds.
func stringToTtl(l lex, f string) (uint32, bool) {
func stringToTtl(token string) (uint32, bool) {
s := uint32(0)
i := uint32(0)
for _, c := range l.token {
for _, c := range token {
switch c {
case 's', 'S':
s += i
@ -728,6 +728,46 @@ func stringToTtl(l lex, f string) (uint32, bool) {
return s + i, true
}
// Parse LOC records' <digits>[.<digits>][mM] into a
// mantissa exponent format. Token should contain the entire
// string (i.e. no spaces allowed)
func stringToCm(token string) (e, m uint8, ok bool) {
if token[len(token)-1] == 'M' || token[len(token)-1] == 'm' {
token = token[0 : len(token)-1]
}
s := strings.SplitN(token, ".", 2)
var meters, cmeters, val int
var err error
switch len(s) {
case 1:
if cmeters, err = strconv.Atoi(s[1]); err != nil {
return
}
fallthrough
case 0:
if meters, err = strconv.Atoi(s[0]); err != nil {
return
}
}
ok = true
if meters > 0 {
e = 2
val = meters
} else {
e = 0
val = cmeters
}
for val > 10 {
e++
val /= 10
}
if e > 9 {
ok = false
}
m = uint8(val)
return
}
func appendOrigin(name, origin string) string {
if origin == "." {
return name + origin

View File

@ -245,7 +245,7 @@ func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
// Serial should be a number
return nil, &ParseError{f, "bad SOA zone parameter", l}
}
if v, ok = stringToTtl(l, f); !ok {
if v, ok = stringToTtl(l.token); !ok {
return nil, &ParseError{f, "bad SOA zone parameter", l}
}