package Convert::IBM390;        # -*-perl-*-

use strict;
use Carp;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

require Exporter;

@ISA = qw(Exporter);
@EXPORT = qw();
@EXPORT_OK = qw(asc2eb eb2asc eb2ascp packeb unpackeb
   hexdump set_codepage set_translation);
$VERSION = '0.27';

%EXPORT_TAGS = ( all => [ @EXPORT_OK ] );

#------------ These tables are now defined in IBM390.xs.
#------------ Kept here for historical purposes only.
#my ($a2e_table, $e2a_table);
#$a2e_table = pack "H512",
# "00010203372d2e2f1605150b0c0d0e0f101112133c3d322618193f271c1d1e1f".
# "405a7f7b5b6c507d4d5d5c4e6b604b61f0f1f2f3f4f5f6f7f8f97a5e4c7e6e6f".
# "7cc1c2c3c4c5c6c7c8c9d1d2d3d4d5d6d7d8d9e2e3e4e5e6e7e8e9ade0bd5f6d".
# "79818283848586878889919293949596979899a2a3a4a5a6a7a8a9c04fd0a107".
# "202122232425061728292a2b2c090a1b30311a333435360838393a3b04143eff".
# "41aa4ab19fb26ab5bbb49a8ab0caafbc908feafabea0b6b39dda9b8bb7b8b9ab".
# "6465626663679e687471727378757677ac69edeeebefecbf80fdfefbfcbaae59".
# "4445424643479c4854515253585556578c49cdcecbcfcce170dddedbdc8d8edf";
#
#$e2a_table = pack "H512",
# "000102039c09867f978d8e0b0c0d0e0f101112139d0a08871819928f1c1d1e1f".
# "808182838485171b88898a8b8c050607909116939495960498999a9b14159e1a".
# "20a0e2e4e0e1e3e5e7f1a22e3c282b7c26e9eaebe8edeeefecdf21242a293b5e".
# "2d2fc2c4c0c1c3c5c7d1a62c255f3e3ff8c9cacbc8cdcecfcc603a2340273d22".
# "d8616263646566676869abbbf0fdfeb1b06a6b6c6d6e6f707172aabae6b8c6a4".
# "b57e737475767778797aa1bfd05bdeaeaca3a5b7a9a7b6bcbdbedda8af5db4d7".
# "7b414243444546474849adf4f6f2f3f57d4a4b4c4d4e4f505152b9fbfcf9faff".
# "5cf7535455565758595ab2d4d6d2d3d530313233343536373839b3dbdcd9da9f";
#------------ End of tables.


# Print an entire string in hexdump format, 32 bytes at a time
# (like a sysabend dump).
sub hexdump {
 my ($String, $startad, $charset) = @_;
 $startad ||= 0;
 $charset ||= "ascii";
 my ($i, $j, $d, $str, $pri, $hexes);
 my @outlines = ();
 my $L = length($String);
#   Generate a printable version of the string.
 my $pri_ex;
 if ($charset =~ m/ebc/i) {
    $pri_ex = '$pri = eb2ascp $str;';
 } else {
    $pri_ex = '($pri = $str) =~ tr/\\000-\\037\\177-\\377/ /;';
 }
 for ($i = 0; $i < $L; $i += 32) {
    $str = substr($String, $i,32);
#   Generate a printable version of the string.
    eval $pri_ex;
    $hexes = unpack("H64", $str);
    $hexes =~ tr/a-f/A-F/;
    if (($L - $i) < 32) {   # Pad with blanks if necessary.
       $pri = pack("A32", $pri);
       $hexes = pack("A64", $hexes);
    }
    $d = sprintf("%06X: ", $startad + $i);
    for ($j = 0; $j < 64; $j += 8) {
       $d .= substr($hexes, $j, 8) . " ";
       $d .= " " if $j == 24;
    }
    $d .= " *$pri*\n";
    push @outlines, $d;
 }
 return @outlines;
}

sub version {
 return "Convert::IBM390 version $VERSION XS+C";
}

#---------------------------------------------------------------------
# Use XSLoader if available, otherwise DynaLoader:

eval {
  require XSLoader;
  XSLoader::load('Convert::IBM390', $VERSION);
  1;
} or do {
  require DynaLoader;
  push @ISA, 'DynaLoader';
  bootstrap Convert::IBM390 $VERSION;
};
