#!/usr/bin/perl -w
use strict;
my ($line,$type,@fields);
while(defined($line=<>)) {
	chomp $line;
	next unless($line);
	$type=substr($line,0,1);
	@fields=split /:/,substr($line,1);
	$fields[0] =~ s/\.?$//s;
	$fields[2] =~ s/\.?$//s if(2<@fields);
	if("#" eq $type) {
		print "; ".substr($line,1)."\n";
	} elsif("&" eq $type) {
		print "$fields[0].\t".($fields[3] or 259200)."\tIN\tNS\t$fields[2].\n";
	} elsif("'" eq $type) {
		$fields[1] =~ s/\\([0-7]{3})/pack("C",oct($1))/ges;
		$fields[1] =~ s/([^ !#-\[\]-~])/sprintf "\\%03o",unpack("C",$1)/ges;
		print "$fields[0].\t".($fields[2] or 86400)."\tIN\tTXT\t\"$fields[1]\"\n";
	} elsif("+" eq $type) {
		print "$fields[0].\t".($fields[2] or 86400)."\tIN\tA\t$fields[1]\n";
	} elsif("." eq $type and 2<@fields) {
		print "$fields[0].\t".($fields[3] or 259200)."\tIN\tNS\t$fields[2].\n";
	} elsif("=" eq $type) {
		print "$fields[0].\t".($fields[2] or 86400)."\tIN\tA\t$fields[1]\n";
	} elsif("@" eq $type and 3<@fields) {
		print "$fields[0].\t".($fields[4] or 86400)."\tIN\tMX\t$fields[3]\t$fields[2].\n";
	} elsif("C" eq $type) {
		print "$fields[0].\t".($fields[2] or 86400)."\tIN\tCNAME\t$fields[1].\n";
	} elsif("Z" eq $type and 3<@fields) {
		push @fields,16384 if(4==@fields); # ref
		push @fields,2048 if(5==@fields); # ret
		push @fields,1048576 if(6==@fields); # exp
		push @fields,2560 if(7==@fields); # min
		push @fields,259200 if(8==@fields); # ttl
		print "$fields[0].\t$fields[8]\tIN\tSOA\t$fields[1].\t$fields[2].\t".join("\t",@fields[3..7])."\n";
	} else {
		die "invalid line: $line\n";
	}
}
0;
