##################################################
# v2019.9.27
# Compares two large positive integers.
# The integers can be binary, octal,
# decimal, or hexadecimal.
#
# NOTE: Both numbers must be in the same base.
# The numbers should not contain spaces, tabs, line breaks,
# minus sign, decimal points, or anything other than digits!
# Illegal characters can mess up the result.
#
# Returns: 0 if they are equal
# 1 if the first one is greater
# 2 if the second one is greater
#
# Special cases:
# * When comparing zero against an empty string or
# undefined value, the zero will be greater.
# * When comparing an undefined value against
# an empty string, they will be equal.
#
# Usage: INTEGER = CMP(STRING, STRING)
#
sub CMP
{
my $A = defined $_[0] ? uc($_[0]) : '';
my $B = defined $_[1] ? uc($_[1]) : '';
my $AL = length($A);
my $BL = length($B);
return 2 if ($AL < $BL);
return 1 if ($AL > $BL);
return 0 if ($A eq $B);
# At this point, we know that both numbers have the
# same length, and one of them is greater than the other.
my $DIFF = 0;
for (my $i = 0; $DIFF == 0 && $i < $AL; $i++)
{
$DIFF = vec($A, $i, 8) - vec($B, $i, 8);
}
return ($DIFF > 0) ? 1 : 2;
}