Front page | perl.perl5.porters |
Postings from October 2003
[PATCH] Update MIME-Base64
Thread Next
From:
Gisle Aas
Date:
October 15, 2003 02:54
Subject:
[PATCH] Update MIME-Base64
Message ID:
lrk776x1v4.fsf@caliper.activestate.com
The following patch brings MIME-Base64 in sync with the last CPAN version.
diff -ru perl-current/ext/MIME/Base64/Base64.pm perl-hack/ext/MIME/Base64/Base64.pm
--- perl-current/ext/MIME/Base64/Base64.pm Tue May 13 23:35:38 2003
+++ perl-hack/ext/MIME/Base64/Base64.pm Wed Oct 15 02:52:00 2003
@@ -1,5 +1,5 @@
#
-# $Id: Base64.pm,v 2.29 2003/05/13 18:22:09 gisle Exp $
+# $Id: Base64.pm,v 2.34 2003/10/09 19:15:42 gisle Exp $
package MIME::Base64;
@@ -33,7 +33,7 @@
Encode data by calling the encode_base64() function. The first
argument is the string to encode. The second argument is the line
-ending sequence to use (it is optional and defaults to C<"\n">). The
+ending sequence to use. It is optional and defaults to "\n". The
returned encoded string is broken into lines of no more than 76
characters each and it will end with $eol unless it is empty. Pass an
empty string as second argument if you do not want the encoded string
@@ -49,8 +49,8 @@
silently ignored. Characters occuring after a '=' padding character
are never decoded.
-If the length of the string to decode (after ignoring
-non-base64 chars) is not a multiple of 4 or padding occurs too early,
+If the length of the string to decode, after ignoring
+non-base64 chars, is not a multiple of 4 or padding occurs too early,
then a warning is generated if perl is running under C<-w>.
=back
@@ -127,6 +127,10 @@
The XS implementation use code from metamail. Copyright 1991 Bell
Communications Research, Inc. (Bellcore)
+=head1 SEE ALSO
+
+L<MIME::QuotedPrint>
+
=cut
use strict;
@@ -137,7 +141,7 @@
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw(encode_base64 decode_base64);
-$VERSION = '2.20';
+$VERSION = '2.21';
eval { bootstrap MIME::Base64 $VERSION; };
if ($@) {
@@ -153,10 +157,20 @@
# The XS implementation runs about 20 times faster, but the Perl
# code might be more portable, so it is still here.
-use integer;
-
sub old_encode_base64 ($;$)
{
+ if ($] >= 5.006) {
+ require bytes;
+ if (bytes::length($_[0]) > length($_[0]) ||
+ ($] >= 5.008 && $_[0] =~ /[^\0-\xFF]/))
+ {
+ require Carp;
+ Carp::croak("The Base64 encoding is only defined for bytes");
+ }
+ }
+
+ use integer;
+
my $eol = $_[1];
$eol = "\n" unless defined $eol;
@@ -180,6 +194,7 @@
sub old_decode_base64 ($)
{
local($^W) = 0; # unpack("u",...) gives bogus warning in 5.00[123]
+ use integer;
my $str = shift;
$str =~ tr|A-Za-z0-9+=/||cd; # remove non-base64 chars
diff -ru perl-current/ext/MIME/Base64/Base64.xs perl-hack/ext/MIME/Base64/Base64.xs
--- perl-current/ext/MIME/Base64/Base64.xs Tue May 13 23:35:38 2003
+++ perl-hack/ext/MIME/Base64/Base64.xs Wed Oct 15 02:52:00 2003
@@ -1,4 +1,4 @@
-/* $Id: Base64.xs,v 1.37 2003/05/13 18:20:18 gisle Exp $
+/* $Id: Base64.xs,v 1.38 2003/10/09 11:26:12 gisle Exp $
Copyright 1997-2003 Gisle Aas
@@ -159,7 +159,7 @@
chunk = 0;
}
c1 = *str++;
- c2 = *str++;
+ c2 = len > 1 ? *str++ : '\0';
*r++ = basis_64[c1>>2];
*r++ = basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)];
if (len > 2) {
@@ -298,7 +298,7 @@
while (p < end && qp_isplain(*p)) {
p++;
}
- if (*p == '\n' || p == end) {
+ if (p == end || *p == '\n') {
/* whitespace at end of line must be encoded */
while (p > p_beg && (*(p - 1) == '\t' || *(p - 1) == ' '))
p--;
@@ -308,9 +308,9 @@
if (p_len) {
/* output plain text (with line breaks) */
if (eol_len) {
- STRLEN max_last_line = (*p == '\n' || p == end)
+ STRLEN max_last_line = (p == end || *p == '\n')
? MAX_LINE /* .......\n */
- : (*(p + 1) == '\n' || (p + 1) == end)
+ : ((p + 1) == end || *(p + 1) == '\n')
? MAX_LINE - 3 /* ....=XX\n */
: MAX_LINE - 4; /* ...=XX=\n */
while (p_len + linelen > max_last_line) {
@@ -331,13 +331,17 @@
}
}
- if (*p == '\n' && eol_len) {
+ if (p == end) {
+ break;
+ }
+ else if (*p == '\n' && eol_len) {
sv_catpvn(RETVAL, eol, eol_len);
p++;
linelen = 0;
}
- else if (p < end) {
+ else {
/* output escaped char (with line breaks) */
+ assert(p < end)
if (eol_len && linelen > MAX_LINE - 4) {
sv_catpvn(RETVAL, "=", 1);
sv_catpvn(RETVAL, eol, eol_len);
@@ -347,10 +351,6 @@
p++;
linelen += 3;
}
- else {
- assert(p == end);
- break;
- }
/* optimize reallocs a bit */
if (SvLEN(RETVAL) > 80 && SvLEN(RETVAL) - SvCUR(RETVAL) < 3) {
diff -ru perl-current/ext/MIME/Base64/Changes perl-hack/ext/MIME/Base64/Changes
--- perl-current/ext/MIME/Base64/Changes Tue May 13 23:35:38 2003
+++ perl-hack/ext/MIME/Base64/Changes Wed Oct 15 02:52:00 2003
@@ -1,3 +1,19 @@
+2003-10-09 Gisle Aas <gisle@ActiveState.com>
+
+ Release 2.21
+
+ Documentation tweaks.
+
+ Don't rely on SvEND(sv) == '\0' as discussed in the perl5-porters
+ mailing list thread that starts with
+ http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-10/msg00258.html
+
+ Should now pass test suite even without XS support.
+
+ Perl v5.005 or better is now required.
+
+
+
2003-05-13 Gisle Aas <gisle@ActiveState.com>
Release 2.20
diff -ru perl-current/ext/MIME/Base64/Makefile.PL perl-hack/ext/MIME/Base64/Makefile.PL
--- perl-current/ext/MIME/Base64/Makefile.PL Wed May 21 08:31:40 2003
+++ perl-hack/ext/MIME/Base64/Makefile.PL Wed Oct 15 02:52:42 2003
@@ -1,4 +1,4 @@
-require 5.002;
+require 5.005;
use ExtUtils::MakeMaker;
WriteMakefile(
diff -ru perl-current/ext/MIME/Base64/QuotedPrint.pm perl-hack/ext/MIME/Base64/QuotedPrint.pm
--- perl-current/ext/MIME/Base64/QuotedPrint.pm Tue May 13 23:35:38 2003
+++ perl-hack/ext/MIME/Base64/QuotedPrint.pm Wed Oct 15 02:52:00 2003
@@ -1,5 +1,5 @@
#
-# $Id: QuotedPrint.pm,v 2.13 2003/05/13 18:22:09 gisle Exp $
+# $Id: QuotedPrint.pm,v 2.17 2003/10/09 19:04:29 gisle Exp $
package MIME::QuotedPrint;
@@ -34,13 +34,24 @@
=item encode_qp($str, $eol)
This function will return an encoded version of the string given as
-argument. The second argument is the line ending sequence to use (it
-is optional and defaults to C<"\n">).
+argument.
+
+The second argument is the line ending sequence to use. It is
+optional and defaults to "\n". Every occurence of "\n" will be
+replaced with this string and it will also be used for additional
+"soft line breaks" to ensure that no line is longer than 76
+characters. You might want to pass it as "\015\012" to produce data
+suitable external consumption. The string "\r\n" will produce the
+same result on many platforms, but not all.
+
+An $eol of "" special. If passed no "soft line breaks" are introduced
+and any literal "\n" in the original data is encoded as well.
=item decode_qp($str);
This function will return the plain text version of the string given
-as argument. Lines with be "\n" terminated.
+as argument. The lines of the result will be "\n" terminated even it
+the $str argument contains "\r\n" terminated lines.
=back
@@ -52,6 +63,17 @@
$encoded = MIME::QuotedPrint::encode($decoded);
$decoded = MIME::QuotedPrint::decode($encoded);
+Perl v5.6 and better allow extended Unicode characters in strings.
+Such strings cannot be encoded directly as the quoted-printable
+encoding is only defined for bytes. The solution is to use the Encode
+module to select the byte encoding you want. For example:
+
+ use MIME::QuotedPrint qw(encode_qp);
+ use Encode qw(encode);
+
+ $encoded = encode_qp(encode("UTF-8", "\x{FFFF}\n"));
+ print $encoded;
+
=head1 COPYRIGHT
Copyright 1995-1997,2002-2003 Gisle Aas.
@@ -59,6 +81,10 @@
This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
+=head1 SEE ALSO
+
+L<MIME::Base64>
+
=cut
use strict;
@@ -71,9 +97,7 @@
@ISA = qw(Exporter);
@EXPORT = qw(encode_qp decode_qp);
-use Carp qw(croak);
-
-$VERSION = "2.20";
+$VERSION = "2.21";
use MIME::Base64; # try to load XS version of encode_qp
unless (defined &encode_qp) {
@@ -87,13 +111,15 @@
if ($] >= 5.006) {
require bytes;
if (bytes::length($res) > length($res) ||
- ($] >= 5.008 && $res =~ /[^\0-\xFF]/)) {
- croak("The Quoted-Printable encoding is only defined for bytes");
+ ($] >= 5.008 && $res =~ /[^\0-\xFF]/))
+ {
+ require Carp;
+ Carp::croak("The Quoted-Printable encoding is only defined for bytes");
}
}
my $eol = shift;
- $eol = "\n" unless defined($eol) || length($eol);
+ $eol = "\n" unless defined $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('<')).
@@ -122,12 +148,15 @@
}
else { # ASCII style machine
$res =~ s/([^ \t\n!"#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~])/sprintf("=%02X", ord($1))/eg; # rule #2,#3
+ $res =~ s/\n/=0A/g unless length($eol);
$res =~ s/([ \t]+)$/
join('', map { sprintf("=%02X", ord($_)) }
split('', $1)
)/egm; # rule #3 (encode whitespace at eol)
}
+ return $res unless length($eol);
+
# rule #5 (lines must be shorter than 76 chars, but we are not allowed
# to break =XX escapes. This makes things complicated :-( )
my $brokenlines = "";
@@ -137,6 +166,7 @@
|[^=\n] (?! [^=\n]{0,2} $) # 74 not followed by .?.?\n
| (?! [^=\n]{0,3} $) # 73 not followed by .?.?.?\n
))//xsm;
+ $res =~ s/\n\z/$eol/;
"$brokenlines$res";
}
diff -ru perl-current/ext/MIME/Base64/t/unicode.t perl-hack/ext/MIME/Base64/t/unicode.t
--- perl-current/ext/MIME/Base64/t/unicode.t Thu Jan 16 13:15:37 2003
+++ perl-hack/ext/MIME/Base64/t/unicode.t Wed Oct 15 02:52:00 2003
@@ -9,14 +9,25 @@
}
}
-print "1..1\n";
+print "1..2\n";
require MIME::Base64;
eval {
- MIME::Base64::encode(v300);
+ my $tmp = MIME::Base64::encode(v300);
+ print "# enc: $tmp\n";
};
-
+print "# $@" if $@;
print "not " unless $@;
print "ok 1\n";
+require MIME::QuotedPrint;
+
+eval {
+ my $tmp = MIME::QuotedPrint::encode(v300);
+ print "# enc: $tmp\n";
+};
+print "# $@" if $@;
+print "not " unless $@;
+print "ok 2\n";
+
Thread Next
-
[PATCH] Update MIME-Base64
by Gisle Aas