#!c:\perl\bin\perl

# 2つの入力文字列を16進数と見なしてandまたはorを行う。
#
# 入力引数は、128文字の0-9a-fA-Fです。
# 戻り値は、　128文字の0-9A-Fです。
#
# 戻り値のアルファベットは大文字になります。
# 入力引数が128文字未満の時は、右詰にして、左側を0で埋めます。
# 入力引数が128文字を超える時は、右詰にして、左側を切捨てます。
# 不当な文字がある場合は、NULL("") になります。
#   $rtn1 = &f_or($aa,$ba) ;
#   if ($rtn1 eq "") { print "Input Error\n" ; } ;
#
# $out_len で最大長を変更できます。
#


#sub f_or($in_a_Hex_string,$in_b_Hex_string) {
sub f_or() {

    my $ina, $inb ;
    my $ina_ch, $inb_ch, $out_tmp ;
    my $out_Hex_or ;
    my $offset ;
    my $ina_len, $inb_len, $out_len ;

    ($ina,$inb) = @_ ;

    $out_Hex_or = "" ;
    $out_len = 128 ;

    if (($ina !~ /^[\da-fA-F]+$/) || ($inb !~ /^[\da-fA-F]+$/)) {
        return $out_Hex_or ;
    }

    $ina_len = length($ina) ;
    if ($ina_len < $out_len) {
        $ina = ('0' x ($out_len - $ina_len)) . $ina ;
    } elsif ($ina_len > $out_len) {
        $ina = substr($ina,-($out_len)) ;
    }

    $inb_len = length($inb) ;
    if ($inb_len < $out_len) {
        $inb = ('0' x ($out_len - $inb_len)) . $inb ;
    } elsif ($inb_len > $out_len) {
        $inb = substr($inb,-($out_len)) ;
    }

    for ($offset = 0; $offset < $out_len; $offset++) {
        $ina_ch = hex( substr($ina,$offset,1) ) ;
        $inb_ch = hex( substr($inb,$offset,1) ) ;
        $out_tmp = sprintf("%1X", ($ina_ch | $inb_ch) );

        $out_Hex_or = $out_Hex_or . $out_tmp
    }

#    $out_Hex_or =~ tr/a-f/A-F/ ;

    return $out_Hex_or ;
}

#sub f_and($in_a_Hex_string,$in_b_Hex_string) {
sub f_and() {

    my $ina, $inb ;
    my $ina_ch, $inb_ch, $out_tmp ;
    my $out_Hex_and ;
    my $offset ;
    my $ina_len, $inb_len, $out_len ;

    ($ina,$inb) = @_ ;

    $out_Hex_and = "" ;
    $out_len = 128 ;

    if (($ina !~ /^[\da-fA-F]+$/) || ($inb !~ /^[\da-fA-F]+$/)) {
        return $out_Hex_and ;
    }

    $ina_len = length($ina) ;
    if ($ina_len < $out_len) {
        $ina = ('0' x ($out_len - $ina_len)) . $ina ;
    } elsif ($ina_len > $out_len) {
        $ina = substr($ina,-($out_len)) ;
    }

    $inb_len = length($inb) ;
    if ($inb_len < $out_len) {
        $inb = ('0' x ($out_len - $inb_len)) . $inb ;
    } elsif ($inb_len > $out_len) {
        $inb = substr($inb,-($out_len)) ;
    }

    for ($offset = 0; $offset < $out_len; $offset++) {
        $ina_ch = hex( substr($ina,$offset,1) ) ;
        $inb_ch = hex( substr($inb,$offset,1) ) ;
        $out_tmp = sprintf("%1X", ($ina_ch & $inb_ch) );

        $out_Hex_and = $out_Hex_and . $out_tmp
    }

#    $out_Hex_and =~ tr/a-f/A-F/ ;

    return $out_Hex_and ;
}

1;
