As we're not passing over (or copying in) a NUL, don't need that extra
[p5sagit/p5-mst-13.2.git] / ext / MIME / Base64 / Base64.xs
index 6a36766..afbad93 100644 (file)
@@ -1,6 +1,6 @@
-/* $Id: Base64.xs,v 1.38 2003/10/09 11:26:12 gisle Exp $
+/* $Id: Base64.xs,v 3.5 2005/11/26 10:44:14 gisle Exp $
 
-Copyright 1997-2003 Gisle Aas
+Copyright 1997-2004 Gisle Aas
 
 This library is free software; you can redistribute it and/or
 modify it under the same terms as Perl itself.
@@ -28,6 +28,7 @@ metamail, which comes with this message:
 #ifdef __cplusplus
 extern "C" {
 #endif
+#define PERL_NO_GET_CONTEXT     /* we want efficiency */
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
@@ -55,14 +56,14 @@ extern "C" {
 
 #define MAX_LINE  76 /* size of encoded lines */
 
-static char basis_64[] =
+static const char basis_64[] =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
 #define XX      255    /* illegal base64 char */
 #define EQ      254    /* padding */
 #define INVALID XX
 
-static unsigned char index_64[256] = {
+static const unsigned char index_64[256] = {
     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,XX,XX,63,
@@ -100,6 +101,10 @@ static unsigned char index_64[256] = {
 #   define SvPVbyte SvPV
 #endif
 
+#ifndef isXDIGIT
+#   define isXDIGIT isxdigit
+#endif
+
 #ifndef NATIVE_TO_ASCII
 #   define NATIVE_TO_ASCII(ch) (ch)
 #endif
@@ -253,16 +258,21 @@ decode_base64(sv)
 
 MODULE = MIME::Base64          PACKAGE = MIME::QuotedPrint
 
-#define qp_isplain(c) ((c) == '\t' || ((c) >= ' ' && (c) <= '~') && (c) != '=')
+#ifdef EBCDIC
+#define qp_isplain(c) ((c) == '\t' || ((!isprint(c) && (c) != '=')))
+#else
+#define qp_isplain(c) ((c) == '\t' || (((c) >= ' ' && (c) <= '~') && (c) != '='))
+#endif
 
 SV*
 encode_qp(sv,...)
        SV* sv
-       PROTOTYPE: $;$
+       PROTOTYPE: $;$$
 
        PREINIT:
        char *eol;
        STRLEN eol_len;
+       int binary;
        STRLEN sv_len;
        STRLEN linelen;
        char *beg;
@@ -283,6 +293,8 @@ encode_qp(sv,...)
            eol_len = 1;
        }
 
+       binary = (items > 2 && SvTRUE(ST(2)));
+
        beg = SvPV(sv, sv_len);
        end = beg + sv_len;
 
@@ -334,14 +346,14 @@ encode_qp(sv,...)
            if (p == end) {
                break;
             }
-           else if (*p == '\n' && eol_len) {
+           else if (*p == '\n' && eol_len && !binary) {
                sv_catpvn(RETVAL, eol, eol_len);
                p++;
                linelen = 0;
            }
            else {
                /* output escaped char (with line breaks) */
-               assert(p < end)
+               assert(p < end);
                if (eol_len && linelen > MAX_LINE - 4) {
                    sv_catpvn(RETVAL, "=", 1);
                    sv_catpvn(RETVAL, eol, eol_len);
@@ -359,6 +371,11 @@ encode_qp(sv,...)
            }
         }
 
+       if (SvCUR(RETVAL) && eol_len && linelen) {
+           sv_catpvn(RETVAL, "=", 1);
+           sv_catpvn(RETVAL, eol, eol_len);
+       }
+
        OUTPUT:
        RETVAL
 
@@ -399,7 +416,7 @@ decode_qp(sv)
                    whitespace = 0;
                 }
                if (*str == '=') {
-                   if ((str + 2) < end && isxdigit(str[1]) && isxdigit(str[2])) {
+                   if ((str + 2) < end && isXDIGIT(str[1]) && isXDIGIT(str[2])) {
                        char buf[3];
                         str++;
                        buf[0] = *str++;