summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorPeter Prymmer <PPrymmer@factset.com>2001-06-01 08:49:22 -0700
committerJarkko Hietaniemi <jhi@iki.fi>2001-06-01 21:53:14 +0000
commit95635e5f3146a92e0968ae6fb207309af7cdb6d6 (patch)
tree1c5e6d541d43934aa5014ffe898fc28f70c0f8c9 /ext
parentfecbda2b590e985946f0a69ff09a806c69267f6f (diff)
downloadperl-95635e5f3146a92e0968ae6fb207309af7cdb6d6.tar.gz
allow MIME::QuotePrint to handle ASCII code numbers on EBCDIC machines
Message-ID: <Pine.OSF.4.10.10106011545140.323662-100000@aspara.forte.com> p4raw-id: //depot/perl@10384
Diffstat (limited to 'ext')
-rw-r--r--ext/MIME/Base64/QuotedPrint.pm55
1 files changed, 49 insertions, 6 deletions
diff --git a/ext/MIME/Base64/QuotedPrint.pm b/ext/MIME/Base64/QuotedPrint.pm
index b72a4b905c..b3ff9924f6 100644
--- a/ext/MIME/Base64/QuotedPrint.pm
+++ b/ext/MIME/Base64/QuotedPrint.pm
@@ -64,6 +64,9 @@ modify it under the same terms as Perl itself.
use strict;
use vars qw(@ISA @EXPORT $VERSION);
+if (ord('A') == 193) { # on EBCDIC machines we need translation help
+ use Encode ();
+}
require Exporter;
@ISA = qw(Exporter);
@@ -76,11 +79,38 @@ use re 'asciirange'; # ranges in regular expressions refer to ASCII
sub encode_qp ($)
{
my $res = shift;
- $res =~ s/([^ \t\n!-<>-~])/sprintf("=%02X", ord($1))/eg; # rule #2,#3
- $res =~ s/([ \t]+)$/
- join('', map { sprintf("=%02X", ord($_)) }
- split('', $1)
- )/egm; # rule #3 (encode whitespace at eol)
+ # Do not mention ranges such as $res =~ s/([^ \t\n!-<>-~])/sprintf("=%02X", ord($1))/eg;
+ # since that will not even compile on an EBCDIC machine (where ord('!') > ord('<')).
+ if (ord('A') == 193) { # EBCDIC style machine
+ if (ord('[') == 173) {
+ $res =~ s/([^ \t\n!"#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~])/sprintf("=%02X", ord(Encode::encode('iso-8859-1',Encode::decode('cp1047',$1))))/eg; # rule #2,#3
+ $res =~ s/([ \t]+)$/
+ join('', map { sprintf("=%02X", ord(Encode::encode('iso-8859-1',Encode::decode('cp1047',$_)))) }
+ split('', $1)
+ )/egm; # rule #3 (encode whitespace at eol)
+ }
+ elsif (ord('[') == 187) {
+ $res =~ s/([^ \t\n!"#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~])/sprintf("=%02X", ord(Encode::encode('iso-8859-1',Encode::decode('posix-bc',$1))))/eg; # rule #2,#3
+ $res =~ s/([ \t]+)$/
+ join('', map { sprintf("=%02X", ord(Encode::encode('iso-8859-1',Encode::decode('posix-bc',$_)))) }
+ split('', $1)
+ )/egm; # rule #3 (encode whitespace at eol)
+ }
+ elsif (ord('[') == 186) {
+ $res =~ s/([^ \t\n!"#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~])/sprintf("=%02X", ord(Encode::encode('iso-8859-1',Encode::decode('cp37',$1))))/eg; # rule #2,#3
+ $res =~ s/([ \t]+)$/
+ join('', map { sprintf("=%02X", ord(Encode::encode('iso-8859-1',Encode::decode('cp37',$_)))) }
+ split('', $1)
+ )/egm; # rule #3 (encode whitespace at eol)
+ }
+ }
+ else { # ASCII style machine
+ $res =~ s/([^ \t\n!"#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~])/sprintf("=%02X", ord($1))/eg; # rule #2,#3
+ $res =~ s/([ \t]+)$/
+ join('', map { sprintf("=%02X", ord($_)) }
+ split('', $1)
+ )/egm; # rule #3 (encode whitespace at eol)
+ }
# rule #5 (lines must be shorter than 76 chars, but we are not allowed
# to break =XX escapes. This makes things complicated :-( )
@@ -101,7 +131,20 @@ sub decode_qp ($)
my $res = shift;
$res =~ s/[ \t]+?(\r?\n)/$1/g; # rule #3 (trailing space must be deleted)
$res =~ s/=\r?\n//g; # rule #5 (soft line breaks)
- $res =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
+ if (ord('A') == 193) { # EBCDIC style machine
+ if (ord('[') == 173) {
+ $res =~ s/=([\da-fA-F]{2})/Encode::encode('cp1047',Encode::decode('iso-8859-1',pack("C", hex($1))))/ge;
+ }
+ elsif (ord('[') == 187) {
+ $res =~ s/=([\da-fA-F]{2})/Encode::encode('posix-bc',Encode::decode('iso-8859-1',pack("C", hex($1))))/ge;
+ }
+ elsif (ord('[') == 186) {
+ $res =~ s/=([\da-fA-F]{2})/Encode::encode('cp37',Encode::decode('iso-8859-1',pack("C", hex($1))))/ge;
+ }
+ }
+ else { # ASCII style machine
+ $res =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
+ }
$res;
}