DNS-Bananafonana

 view release on metacpan or  search on metacpan

Bananafonana.pm  view on Meta::CPAN

{
    my $num = shift;
    # Remove markup characters
    $num =~ s/[-_\.]//g;
    my $answer = new Math::BigInt "0";
    my $n;
    my $d;
    while (length($d = substr($num,0,2)) > 0) {
    if (length($d) == 1) {
	    croak __PACKAGE__ . "::from_bananafonana -- invalid bananafonana string $d";
    }
    $num = substr($num,2);
	$answer = $answer * BAFO_BASE;
	$n = index($bananafonana_strings, $d)/2.0;
	if ($n < 0.0) {
	    croak __PACKAGE__ . "::from_bananafonana -- invalid bananafonana string $d";
	}
	$answer = $answer + $n;
    }
    return $answer;
}

=pod

=head1 to_bananafonana

=head2 Parameters

A C<DNS::BigInt> object.

Optionally:

A markup character to split the string in more readable parts.
Can be C<->, C<_> or C<.>. Defaults to C<->.

A blocksize that determines the number of consonant-vowel combinations
between each markup character. Defaults to 5.

=head2 Returns

A string of bananafonana strings representing the number.

=cut

sub to_bananafonana
{
    my $num = shift;
    my $markup = shift || BAFO_MARKUP;
    my $blocksize = (shift || BAFO_BLOCKSIZE) + 1;
    my @digits;
    my $q;
    my $r;
    my $d;

    if (! $markup =~ /[-_\.]/) {
	    croak __PACKAGE__ . "::to_bananafonana -- invalid markup character ($markup)";
    }
    if ($blocksize < 0) {
	    croak __PACKAGE__ . "::to_bananafonana -- invalid blocksize ($blocksize)";
    }
	if ($num eq "NaN" ) {
	    croak __PACKAGE__ . "::to_bananafonana -- invalid number ($num)";
	}
    while ($num > 0) {
	$q = $num / BAFO_BASE;
	$r = $num % BAFO_BASE;
	$d = substr($bananafonana_strings, $r*2, 2);
    if ($blocksize > 0 && (($#digits + 1) % $blocksize ==  0)) {
        unshift @digits, $markup;
    }
	unshift @digits, $d;
	$num = $q;
    }
    pop @digits;
    unshift @digits, 'ba' unless (@digits);
    return join('', @digits);
}

=pod

=head1 bananafonana

=head2 Parameters

A string 

A string containing the domain name of the record. It will be appended to the
result when a pointer record is asked and removed from the input for hostname
lookups.

Optionally:

A string containing a prefix that needs to be added before the bananafonana
representation of the ip address. Defaults to empty.

A markup character to split the string in more readable parts.
Can be C<->, C<_> or C<.>. Defaults to C<->.

A blocksize that determines the number of consonant-vowel combinations
between each markup character. Defaults to 5.

=head2 Returns

A string containing either the bananafonana representation of the ip address
(presented in 1.2.3.4.in-addr.arpa or a.b...e.f.ip6.arpa notation)
or a string representing the ip address determined from the bonananfonana
encoded hostname (for all domains not ending in in-addr|ip6.arpa).

=cut

sub bananafonana
{
    my $name = shift;
    my $domain = shift || "";
    my $prefix = shift || "";
    my $markup = shift || BAFO_MARKUP;
    my $blocksize = (shift || BAFO_BLOCKSIZE) + 1;
    my $ip;

# Input validation
    if (! $markup =~ /[-_\.]/) {



( run in 1.310 second using v1.01-cache-2.11-cpan-5e09290becf )