| 1 | /* $Id: Base64.xs,v 3.5 2005/11/26 10:44:14 gisle Exp $
|
|---|
| 2 |
|
|---|
| 3 | Copyright 1997-2004 Gisle Aas
|
|---|
| 4 |
|
|---|
| 5 | This library is free software; you can redistribute it and/or
|
|---|
| 6 | modify it under the same terms as Perl itself.
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 | The tables and some of the code that used to be here was borrowed from
|
|---|
| 10 | metamail, which comes with this message:
|
|---|
| 11 |
|
|---|
| 12 | Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
|
|---|
| 13 |
|
|---|
| 14 | Permission to use, copy, modify, and distribute this material
|
|---|
| 15 | for any purpose and without fee is hereby granted, provided
|
|---|
| 16 | that the above copyright notice and this permission notice
|
|---|
| 17 | appear in all copies, and that the name of Bellcore not be
|
|---|
| 18 | used in advertising or publicity pertaining to this
|
|---|
| 19 | material without the specific, prior written permission
|
|---|
| 20 | of an authorized representative of Bellcore. BELLCORE
|
|---|
| 21 | MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
|
|---|
| 22 | OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
|
|---|
| 23 | WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
|
|---|
| 24 |
|
|---|
| 25 | */
|
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 | #ifdef __cplusplus
|
|---|
| 29 | extern "C" {
|
|---|
| 30 | #endif
|
|---|
| 31 | #define PERL_NO_GET_CONTEXT /* we want efficiency */
|
|---|
| 32 | #include "EXTERN.h"
|
|---|
| 33 | #include "perl.h"
|
|---|
| 34 | #include "XSUB.h"
|
|---|
| 35 | #ifdef __cplusplus
|
|---|
| 36 | }
|
|---|
| 37 | #endif
|
|---|
| 38 |
|
|---|
| 39 | #ifndef PATCHLEVEL
|
|---|
| 40 | # include <patchlevel.h>
|
|---|
| 41 | # if !(defined(PERL_VERSION) || (SUBVERSION > 0 && defined(PATCHLEVEL)))
|
|---|
| 42 | # include <could_not_find_Perl_patchlevel.h>
|
|---|
| 43 | # endif
|
|---|
| 44 | #endif
|
|---|
| 45 |
|
|---|
| 46 | #if PATCHLEVEL <= 4 && !defined(PL_dowarn)
|
|---|
| 47 | #define PL_dowarn dowarn
|
|---|
| 48 | #endif
|
|---|
| 49 |
|
|---|
| 50 | #ifdef G_WARN_ON
|
|---|
| 51 | #define DOWARN (PL_dowarn & G_WARN_ON)
|
|---|
| 52 | #else
|
|---|
| 53 | #define DOWARN PL_dowarn
|
|---|
| 54 | #endif
|
|---|
| 55 |
|
|---|
| 56 |
|
|---|
| 57 | #define MAX_LINE 76 /* size of encoded lines */
|
|---|
| 58 |
|
|---|
| 59 | static const char basis_64[] =
|
|---|
| 60 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|---|
| 61 |
|
|---|
| 62 | #define XX 255 /* illegal base64 char */
|
|---|
| 63 | #define EQ 254 /* padding */
|
|---|
| 64 | #define INVALID XX
|
|---|
| 65 |
|
|---|
| 66 | static const unsigned char index_64[256] = {
|
|---|
| 67 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 68 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 69 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,XX,XX,63,
|
|---|
| 70 | 52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,EQ,XX,XX,
|
|---|
| 71 | XX, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
|
|---|
| 72 | 15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
|
|---|
| 73 | XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
|
|---|
| 74 | 41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX,
|
|---|
| 75 |
|
|---|
| 76 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 77 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 78 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 79 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 80 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 81 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 82 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 83 | XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
|
|---|
| 84 | };
|
|---|
| 85 |
|
|---|
| 86 | #ifdef SvPVbyte
|
|---|
| 87 | # if PERL_REVISION == 5 && PERL_VERSION < 7
|
|---|
| 88 | /* SvPVbyte does not work in perl-5.6.1, borrowed version for 5.7.3 */
|
|---|
| 89 | # undef SvPVbyte
|
|---|
| 90 | # define SvPVbyte(sv, lp) \
|
|---|
| 91 | ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
|
|---|
| 92 | ? ((lp = SvCUR(sv)), SvPVX(sv)) : my_sv_2pvbyte(aTHX_ sv, &lp))
|
|---|
| 93 | static char *
|
|---|
| 94 | my_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
|
|---|
| 95 | {
|
|---|
| 96 | sv_utf8_downgrade(sv,0);
|
|---|
| 97 | return SvPV(sv,*lp);
|
|---|
| 98 | }
|
|---|
| 99 | # endif
|
|---|
| 100 | #else
|
|---|
| 101 | # define SvPVbyte SvPV
|
|---|
| 102 | #endif
|
|---|
| 103 |
|
|---|
| 104 | #ifndef isXDIGIT
|
|---|
| 105 | # define isXDIGIT isxdigit
|
|---|
| 106 | #endif
|
|---|
|
|---|