annotate Modules/binascii.c @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents fb8f079e4eff
children b3c913746900
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
1 /***********************************************************
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
2 Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
3 Amsterdam, The Netherlands.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
4
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
5 All Rights Reserved
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
6
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
7 Permission to use, copy, modify, and distribute this software and its
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
8 documentation for any purpose and without fee is hereby granted,
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
9 provided that the above copyright notice appear in all copies and that
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
10 both that copyright notice and this permission notice appear in
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
11 supporting documentation, and that the names of Stichting Mathematisch
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
12 Centrum or CWI or Corporation for National Research Initiatives or
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
13 CNRI not be used in advertising or publicity pertaining to
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
14 distribution of the software without specific, written prior
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
15 permission.
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
16
4503
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
17 While CWI is the initial source for this software, a modified version
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
18 is made available by the Corporation for National Research Initiatives
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
19 (CNRI) at the Internet address ftp://ftp.python.org.
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
20
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
65d2d8e67da3 New permission notice, includes CNRI.
Guido van Rossum <guido@python.org>
parents: 3415
diff changeset
28 PERFORMANCE OF THIS SOFTWARE.
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
29
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
30 ******************************************************************/
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
31
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
32 /*
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
33 ** Routines to represent binary data in ASCII and vice-versa
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
34 **
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
35 ** This module currently supports the following encodings:
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
36 ** uuencode:
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
37 ** each line encodes 45 bytes (except possibly the last)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
38 ** First char encodes (binary) length, rest data
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
39 ** each char encodes 6 bits, as follows:
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
40 ** binary: 01234567 abcdefgh ijklmnop
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
41 ** ascii: 012345 67abcd efghij klmnop
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
42 ** ASCII encoding method is "excess-space": 000000 is encoded as ' ', etc.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
43 ** short binary data is zero-extended (so the bits are always in the
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
44 ** right place), this does *not* reflect in the length.
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
45 ** base64:
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
46 ** Line breaks are insignificant, but lines are at most 76 chars
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
47 ** each char encodes 6 bits, in similar order as uucode/hqx. Encoding
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
48 ** is done via a table.
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
49 ** Short binary data is filled (in ASCII) with '='.
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
50 ** hqx:
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
51 ** File starts with introductory text, real data starts and ends
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
52 ** with colons.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
53 ** Data consists of three similar parts: info, datafork, resourcefork.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
54 ** Each part is protected (at the end) with a 16-bit crc
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
55 ** The binary data is run-length encoded, and then ascii-fied:
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
56 ** binary: 01234567 abcdefgh ijklmnop
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
57 ** ascii: 012345 67abcd efghij klmnop
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
58 ** ASCII encoding is table-driven, see the code.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
59 ** Short binary data results in the runt ascii-byte being output with
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
60 ** the bits in the right place.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
61 **
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
62 ** While I was reading dozens of programs that encode or decode the formats
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
63 ** here (documentation? hihi:-) I have formulated Jansen's Observation:
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
64 **
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
65 ** Programs that encode binary data in ASCII are written in
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
66 ** such a style that they are as unreadable as possible. Devices used
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
67 ** include unnecessary global variables, burying important tables
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
68 ** in unrelated sourcefiles, putting functions in include files,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
69 ** using seemingly-descriptive variable names for different purposes,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
70 ** calls to empty subroutines and a host of others.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
71 **
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
72 ** I have attempted to break with this tradition, but I guess that that
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
73 ** does make the performance sub-optimal. Oh well, too bad...
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
74 **
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
75 ** Jack Jansen, CWI, July 1995.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
76 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
77
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
78
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
79 #include "Python.h"
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
80
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
81 static PyObject *Error;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
82 static PyObject *Incomplete;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
83
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
84 /*
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
85 ** hqx lookup table, ascii->binary.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
86 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
87
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
88 #define RUNCHAR 0x90
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
89
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
90 #define DONE 0x7F
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
91 #define SKIP 0x7E
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
92 #define FAIL 0x7D
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
93
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
94 static unsigned char table_a2b_hqx[256] = {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
95 /* ^@ ^A ^B ^C ^D ^E ^F ^G */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
96 /* 0*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
97 /* \b \t \n ^K ^L \r ^N ^O */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
98 /* 1*/ FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
99 /* ^P ^Q ^R ^S ^T ^U ^V ^W */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
100 /* 2*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
101 /* ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
102 /* 3*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
103 /* ! " # $ % & ' */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
104 /* 4*/ FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
105 /* ( ) * + , - . / */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
106 /* 5*/ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
107 /* 0 1 2 3 4 5 6 7 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
108 /* 6*/ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
109 /* 8 9 : ; < = > ? */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
110 /* 7*/ 0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
111 /* @ A B C D E F G */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
112 /* 8*/ 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
113 /* H I J K L M N O */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
114 /* 9*/ 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
115 /* P Q R S T U V W */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
116 /*10*/ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
117 /* X Y Z [ \ ] ^ _ */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
118 /*11*/ 0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
119 /* ` a b c d e f g */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
120 /*12*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
121 /* h i j k l m n o */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
122 /*13*/ 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
123 /* p q r s t u v w */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
124 /*14*/ 0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
125 /* x y z { | } ~ ^? */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
126 /*15*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
127 /*16*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
128 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
129 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
130 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
131 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
132 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
133 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
134 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
135 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
136 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
137 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
138 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
139 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
140 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
141 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
142 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
143 };
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
144
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
145 static unsigned char table_b2a_hqx[] =
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
146 "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
147
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
148 static char table_a2b_base64[] = {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
149 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
150 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
151 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
152 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
153 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
154 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
155 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
156 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
157 };
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
158
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
159 #define BASE64_PAD '='
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
160 #define BASE64_MAXBIN 57 /* Max binary chunk size (76 char line) */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
161
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
162 static unsigned char table_b2a_base64[] =
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
163 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
164
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
165
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
166
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
167 static unsigned short crctab_hqx[256] = {
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
168 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
169 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
170 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
171 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
172 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
173 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
174 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
175 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
176 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
177 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
178 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
179 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
180 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
181 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
182 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
183 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
184 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
185 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
186 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
187 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
188 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
189 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
190 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
191 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
192 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
193 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
194 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
195 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
196 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
197 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
198 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
199 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
200 };
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
201
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
202 static char doc_a2b_uu[] = "(ascii) -> bin. Decode a line of uuencoded data";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
203
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
204 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
205 binascii_a2b_uu(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
206 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
207 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
208 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
209 unsigned char *ascii_data, *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
210 int leftbits = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
211 unsigned char this_ch;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
212 unsigned int leftchar = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
213 PyObject *rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
214 int ascii_len, bin_len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
215
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
216 if ( !PyArg_ParseTuple(args, "s#", &ascii_data, &ascii_len) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
217 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
218
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
219 /* First byte: binary data length (in bytes) */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
220 bin_len = (*ascii_data++ - ' ') & 077;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
221 ascii_len--;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
222
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
223 /* Allocate the buffer */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
224 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
225 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
226 bin_data = (unsigned char *)PyString_AsString(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
227
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
228 for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
229 this_ch = *ascii_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
230 if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
231 /*
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
232 ** Whitespace. Assume some spaces got eaten at
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
233 ** end-of-line. (We check this later)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
234 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
235 this_ch = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
236 } else {
3263
8c58ab7aa71e Allow '@' for ' ' in uuencoded files.
Jack Jansen <jack.jansen@cwi.nl>
parents: 3144
diff changeset
237 /* Check the character for legality
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
238 ** The 64 in stead of the expected 63 is because
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
239 ** there are a few uuencodes out there that use
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
240 ** '@' as zero instead of space.
3263
8c58ab7aa71e Allow '@' for ' ' in uuencoded files.
Jack Jansen <jack.jansen@cwi.nl>
parents: 3144
diff changeset
241 */
8c58ab7aa71e Allow '@' for ' ' in uuencoded files.
Jack Jansen <jack.jansen@cwi.nl>
parents: 3144
diff changeset
242 if ( this_ch < ' ' || this_ch > (' ' + 64)) {
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
243 PyErr_SetString(Error, "Illegal char");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
244 Py_DECREF(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
245 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
246 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
247 this_ch = (this_ch - ' ') & 077;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
248 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
249 /*
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
250 ** Shift it in on the low end, and see if there's
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
251 ** a byte ready for output.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
252 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
253 leftchar = (leftchar << 6) | (this_ch);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
254 leftbits += 6;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
255 if ( leftbits >= 8 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
256 leftbits -= 8;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
257 *bin_data++ = (leftchar >> leftbits) & 0xff;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
258 leftchar &= ((1 << leftbits) - 1);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
259 bin_len--;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
260 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
261 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
262 /*
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
263 ** Finally, check that if there's anything left on the line
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
264 ** that it's whitespace only.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
265 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
266 while( ascii_len-- > 0 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
267 this_ch = *ascii_data++;
5771
fb8f079e4eff Allow '@' character as end of line padding in uuencode format.
Guido van Rossum <guido@python.org>
parents: 4973
diff changeset
268 /* Extra '@' may be written as padding in some cases */
fb8f079e4eff Allow '@' character as end of line padding in uuencode format.
Guido van Rossum <guido@python.org>
parents: 4973
diff changeset
269 if ( this_ch != ' ' && this_ch != '@' &&
fb8f079e4eff Allow '@' character as end of line padding in uuencode format.
Guido van Rossum <guido@python.org>
parents: 4973
diff changeset
270 this_ch != '\n' && this_ch != '\r' ) {
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
271 PyErr_SetString(Error, "Trailing garbage");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
272 Py_DECREF(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
273 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
274 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
275 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
276 return rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
277 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
278
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
279 static char doc_b2a_uu[] = "(bin) -> ascii. Uuencode line of data";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
280
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
281 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
282 binascii_b2a_uu(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
283 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
284 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
285 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
286 unsigned char *ascii_data, *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
287 int leftbits = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
288 unsigned char this_ch;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
289 unsigned int leftchar = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
290 PyObject *rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
291 int bin_len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
292
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
293 if ( !PyArg_ParseTuple(args, "s#", &bin_data, &bin_len) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
294 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
295 if ( bin_len > 45 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
296 /* The 45 is a limit that appears in all uuencode's */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
297 PyErr_SetString(Error, "At most 45 bytes at once");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
298 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
299 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
300
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
301 /* We're lazy and allocate to much (fixed up later) */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
302 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
303 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
304 ascii_data = (unsigned char *)PyString_AsString(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
305
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
306 /* Store the length */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
307 *ascii_data++ = ' ' + (bin_len & 077);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
308
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
309 for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
310 /* Shift the data (or padding) into our buffer */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
311 if ( bin_len > 0 ) /* Data */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
312 leftchar = (leftchar << 8) | *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
313 else /* Padding */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
314 leftchar <<= 8;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
315 leftbits += 8;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
316
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
317 /* See if there are 6-bit groups ready */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
318 while ( leftbits >= 6 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
319 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
320 leftbits -= 6;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
321 *ascii_data++ = this_ch + ' ';
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
322 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
323 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
324 *ascii_data++ = '\n'; /* Append a courtesy newline */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
325
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
326 _PyString_Resize(&rv, (ascii_data -
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
327 (unsigned char *)PyString_AsString(rv)));
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
328 return rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
329 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
330
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
331 static char doc_a2b_base64[] = "(ascii) -> bin. Decode a line of base64 data";
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
332
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
333 static PyObject *
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
334 binascii_a2b_base64(self, args)
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
335 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
336 PyObject *args;
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
337 {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
338 unsigned char *ascii_data, *bin_data;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
339 int leftbits = 0;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
340 unsigned char this_ch;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
341 unsigned int leftchar = 0;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
342 int npad = 0;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
343 PyObject *rv;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
344 int ascii_len, bin_len;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
345
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
346 if ( !PyArg_ParseTuple(args, "s#", &ascii_data, &ascii_len) )
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
347 return NULL;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
348
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
349 bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
350
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
351 /* Allocate the buffer */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
352 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
353 return NULL;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
354 bin_data = (unsigned char *)PyString_AsString(rv);
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
355 bin_len = 0;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
356 for( ; ascii_len > 0 ; ascii_len--, ascii_data++ ) {
3343
012376d3aa14 Fixed off-by-one error in rle-decode, and allow whitespace in base64
Jack Jansen <jack.jansen@cwi.nl>
parents: 3263
diff changeset
357 /* Skip some punctuation */
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
358 this_ch = (*ascii_data & 0x7f);
3343
012376d3aa14 Fixed off-by-one error in rle-decode, and allow whitespace in base64
Jack Jansen <jack.jansen@cwi.nl>
parents: 3263
diff changeset
359 if ( this_ch == '\r' || this_ch == '\n' || this_ch == ' ' )
012376d3aa14 Fixed off-by-one error in rle-decode, and allow whitespace in base64
Jack Jansen <jack.jansen@cwi.nl>
parents: 3263
diff changeset
360 continue;
012376d3aa14 Fixed off-by-one error in rle-decode, and allow whitespace in base64
Jack Jansen <jack.jansen@cwi.nl>
parents: 3263
diff changeset
361
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
362 if ( this_ch == BASE64_PAD )
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
363 npad++;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
364 this_ch = table_a2b_base64[(*ascii_data) & 0x7f];
3415
f6a6a69927ff Add unsigned char cast
Guido van Rossum <guido@python.org>
parents: 3343
diff changeset
365 if ( this_ch == (unsigned char) -1 ) continue;
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
366 /*
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
367 ** Shift it in on the low end, and see if there's
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
368 ** a byte ready for output.
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
369 */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
370 leftchar = (leftchar << 6) | (this_ch);
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
371 leftbits += 6;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
372 if ( leftbits >= 8 ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
373 leftbits -= 8;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
374 *bin_data++ = (leftchar >> leftbits) & 0xff;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
375 leftchar &= ((1 << leftbits) - 1);
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
376 bin_len++;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
377 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
378 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
379 /* Check that no bits are left */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
380 if ( leftbits ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
381 PyErr_SetString(Error, "Incorrect padding");
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
382 Py_DECREF(rv);
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
383 return NULL;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
384 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
385 /* and remove any padding */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
386 bin_len -= npad;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
387 /* and set string size correctly */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
388 _PyString_Resize(&rv, bin_len);
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
389 return rv;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
390 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
391
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
392 static char doc_b2a_base64[] = "(bin) -> ascii. Base64-code line of data";
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
393
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
394 static PyObject *
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
395 binascii_b2a_base64(self, args)
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
396 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
397 PyObject *args;
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
398 {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
399 unsigned char *ascii_data, *bin_data;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
400 int leftbits = 0;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
401 unsigned char this_ch;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
402 unsigned int leftchar = 0;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
403 PyObject *rv;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
404 int bin_len;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
405
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
406 if ( !PyArg_ParseTuple(args, "s#", &bin_data, &bin_len) )
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
407 return NULL;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
408 if ( bin_len > BASE64_MAXBIN ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
409 PyErr_SetString(Error, "Too much data for base64 line");
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
410 return NULL;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
411 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
412
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
413 /* We're lazy and allocate to much (fixed up later) */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
414 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
415 return NULL;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
416 ascii_data = (unsigned char *)PyString_AsString(rv);
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
417
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
418 for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
419 /* Shift the data into our buffer */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
420 leftchar = (leftchar << 8) | *bin_data;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
421 leftbits += 8;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
422
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
423 /* See if there are 6-bit groups ready */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
424 while ( leftbits >= 6 ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
425 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
426 leftbits -= 6;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
427 *ascii_data++ = table_b2a_base64[this_ch];
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
428 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
429 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
430 if ( leftbits == 2 ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
431 *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
432 *ascii_data++ = BASE64_PAD;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
433 *ascii_data++ = BASE64_PAD;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
434 } else if ( leftbits == 4 ) {
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
435 *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
436 *ascii_data++ = BASE64_PAD;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
437 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
438 *ascii_data++ = '\n'; /* Append a courtesy newline */
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
439
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
440 _PyString_Resize(&rv, (ascii_data -
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
441 (unsigned char *)PyString_AsString(rv)));
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
442 return rv;
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
443 }
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
444
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
445 static char doc_a2b_hqx[] = "ascii -> bin, done. Decode .hqx coding";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
446
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
447 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
448 binascii_a2b_hqx(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
449 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
450 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
451 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
452 unsigned char *ascii_data, *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
453 int leftbits = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
454 unsigned char this_ch;
2976
4de779232aa4 Added missing 'leftchar' initializer.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2911
diff changeset
455 unsigned int leftchar = 0;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
456 PyObject *rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
457 int len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
458 int done = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
459
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
460 if ( !PyArg_ParseTuple(args, "s#", &ascii_data, &len) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
461 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
462
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
463 /* Allocate a string that is too big (fixed later) */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
464 if ( (rv=PyString_FromStringAndSize(NULL, len)) == NULL )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
465 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
466 bin_data = (unsigned char *)PyString_AsString(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
467
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
468 for( ; len > 0 ; len--, ascii_data++ ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
469 /* Get the byte and look it up */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
470 this_ch = table_a2b_hqx[*ascii_data];
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
471 if ( this_ch == SKIP )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
472 continue;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
473 if ( this_ch == FAIL ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
474 PyErr_SetString(Error, "Illegal char");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
475 Py_DECREF(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
476 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
477 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
478 if ( this_ch == DONE ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
479 /* The terminating colon */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
480 done = 1;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
481 break;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
482 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
483
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
484 /* Shift it into the buffer and see if any bytes are ready */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
485 leftchar = (leftchar << 6) | (this_ch);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
486 leftbits += 6;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
487 if ( leftbits >= 8 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
488 leftbits -= 8;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
489 *bin_data++ = (leftchar >> leftbits) & 0xff;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
490 leftchar &= ((1 << leftbits) - 1);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
491 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
492 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
493
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
494 if ( leftbits && !done ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
495 PyErr_SetString(Incomplete,
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
496 "String has incomplete number of bytes");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
497 Py_DECREF(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
498 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
499 }
4938
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
500 _PyString_Resize(
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
501 &rv, (bin_data - (unsigned char *)PyString_AsString(rv)));
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
502 if (rv) {
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
503 PyObject *rrv = Py_BuildValue("Oi", rv, done);
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
504 Py_DECREF(rv);
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
505 return rrv;
70db4be1dd4b Fix leak involving BuildValue("...O...").
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
506 }
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
507
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
508 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
509 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
510
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
511 static char doc_rlecode_hqx[] = "Binhex RLE-code binary data";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
512
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
513 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
514 binascii_rlecode_hqx(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
515 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
516 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
517 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
518 unsigned char *in_data, *out_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
519 PyObject *rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
520 unsigned char ch;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
521 int in, inend, len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
522
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
523 if ( !PyArg_ParseTuple(args, "s#", &in_data, &len) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
524 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
525
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
526 /* Worst case: output is twice as big as input (fixed later) */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
527 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
528 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
529 out_data = (unsigned char *)PyString_AsString(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
530
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
531 for( in=0; in<len; in++) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
532 ch = in_data[in];
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
533 if ( ch == RUNCHAR ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
534 /* RUNCHAR. Escape it. */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
535 *out_data++ = RUNCHAR;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
536 *out_data++ = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
537 } else {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
538 /* Check how many following are the same */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
539 for(inend=in+1;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
540 inend<len && in_data[inend] == ch &&
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
541 inend < in+255;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
542 inend++) ;
3042
6af0fbc8553a Obscure bugfix
Jack Jansen <jack.jansen@cwi.nl>
parents: 2976
diff changeset
543 if ( inend - in > 3 ) {
6af0fbc8553a Obscure bugfix
Jack Jansen <jack.jansen@cwi.nl>
parents: 2976
diff changeset
544 /* More than 3 in a row. Output RLE. */
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
545 *out_data++ = ch;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
546 *out_data++ = RUNCHAR;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
547 *out_data++ = inend-in;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
548 in = inend-1;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
549 } else {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
550 /* Less than 3. Output the byte itself */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
551 *out_data++ = ch;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
552 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
553 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
554 }
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
555 _PyString_Resize(&rv, (out_data -
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
556 (unsigned char *)PyString_AsString(rv)));
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
557 return rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
558 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
559
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
560 static char doc_b2a_hqx[] = "Encode .hqx data";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
561
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
562 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
563 binascii_b2a_hqx(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
564 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
565 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
566 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
567 unsigned char *ascii_data, *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
568 int leftbits = 0;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
569 unsigned char this_ch;
2976
4de779232aa4 Added missing 'leftchar' initializer.
Jack Jansen <jack.jansen@cwi.nl>
parents: 2911
diff changeset
570 unsigned int leftchar = 0;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
571 PyObject *rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
572 int len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
573
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
574 if ( !PyArg_ParseTuple(args, "s#", &bin_data, &len) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
575 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
576
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
577 /* Allocate a buffer that is at least large enough */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
578 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
579 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
580 ascii_data = (unsigned char *)PyString_AsString(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
581
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
582 for( ; len > 0 ; len--, bin_data++ ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
583 /* Shift into our buffer, and output any 6bits ready */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
584 leftchar = (leftchar << 8) | *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
585 leftbits += 8;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
586 while ( leftbits >= 6 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
587 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
588 leftbits -= 6;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
589 *ascii_data++ = table_b2a_hqx[this_ch];
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
590 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
591 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
592 /* Output a possible runt byte */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
593 if ( leftbits ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
594 leftchar <<= (6-leftbits);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
595 *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
596 }
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
597 _PyString_Resize(&rv, (ascii_data -
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
598 (unsigned char *)PyString_AsString(rv)));
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
599 return rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
600 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
601
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
602 static char doc_rledecode_hqx[] = "Decode hexbin RLE-coded string";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
603
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
604 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
605 binascii_rledecode_hqx(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
606 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
607 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
608 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
609 unsigned char *in_data, *out_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
610 unsigned char in_byte, in_repeat;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
611 PyObject *rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
612 int in_len, out_len, out_len_left;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
613
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
614 if ( !PyArg_ParseTuple(args, "s#", &in_data, &in_len) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
615 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
616
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
617 /* Empty string is a special case */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
618 if ( in_len == 0 )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
619 return Py_BuildValue("s", "");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
620
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
621 /* Allocate a buffer of reasonable size. Resized when needed */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
622 out_len = in_len*2;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
623 if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
624 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
625 out_len_left = out_len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
626 out_data = (unsigned char *)PyString_AsString(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
627
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
628 /*
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
629 ** We need two macros here to get/put bytes and handle
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
630 ** end-of-buffer for input and output strings.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
631 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
632 #define INBYTE(b) \
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
633 do { \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
634 if ( --in_len < 0 ) { \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
635 PyErr_SetString(Incomplete, ""); \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
636 Py_DECREF(rv); \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
637 return NULL; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
638 } \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
639 b = *in_data++; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
640 } while(0)
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
641
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
642 #define OUTBYTE(b) \
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
643 do { \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
644 if ( --out_len_left < 0 ) { \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
645 _PyString_Resize(&rv, 2*out_len); \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
646 if ( rv == NULL ) return NULL; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
647 out_data = (unsigned char *)PyString_AsString(rv) \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
648 + out_len; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
649 out_len_left = out_len-1; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
650 out_len = out_len * 2; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
651 } \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
652 *out_data++ = b; \
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
653 } while(0)
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
654
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
655 /*
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
656 ** Handle first byte separately (since we have to get angry
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
657 ** in case of an orphaned RLE code).
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
658 */
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
659 INBYTE(in_byte);
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
660
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
661 if (in_byte == RUNCHAR) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
662 INBYTE(in_repeat);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
663 if (in_repeat != 0) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
664 /* Note Error, not Incomplete (which is at the end
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
665 ** of the string only). This is a programmer error.
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
666 */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
667 PyErr_SetString(Error, "Orphaned RLE code at start");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
668 Py_DECREF(rv);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
669 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
670 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
671 OUTBYTE(RUNCHAR);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
672 } else {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
673 OUTBYTE(in_byte);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
674 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
675
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
676 while( in_len > 0 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
677 INBYTE(in_byte);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
678
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
679 if (in_byte == RUNCHAR) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
680 INBYTE(in_repeat);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
681 if ( in_repeat == 0 ) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
682 /* Just an escaped RUNCHAR value */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
683 OUTBYTE(RUNCHAR);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
684 } else {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
685 /* Pick up value and output a sequence of it */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
686 in_byte = out_data[-1];
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
687 while ( --in_repeat > 0 )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
688 OUTBYTE(in_byte);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
689 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
690 } else {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
691 /* Normal byte */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
692 OUTBYTE(in_byte);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
693 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
694 }
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
695 _PyString_Resize(&rv, (out_data -
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
696 (unsigned char *)PyString_AsString(rv)));
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
697 return rv;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
698 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
699
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
700 static char doc_crc_hqx[] =
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
701 "(data, oldcrc) -> newcrc. Compute hqx CRC incrementally";
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
702
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
703 static PyObject *
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
704 binascii_crc_hqx(self, args)
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
705 PyObject *self;
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
706 PyObject *args;
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
707 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
708 unsigned char *bin_data;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
709 unsigned int crc;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
710 int len;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
711
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
712 if ( !PyArg_ParseTuple(args, "s#i", &bin_data, &len, &crc) )
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
713 return NULL;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
714
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
715 while(len--) {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
716 crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
717 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
718
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
719 return Py_BuildValue("i", crc);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
720 }
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
721
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
722 /* List of functions defined in the module */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
723
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
724 static struct PyMethodDef binascii_module_methods[] = {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
725 {"a2b_uu", binascii_a2b_uu, 1, doc_a2b_uu},
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
726 {"b2a_uu", binascii_b2a_uu, 1, doc_b2a_uu},
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
727 {"a2b_base64", binascii_a2b_base64, 1,
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
728 doc_a2b_base64},
3144
fbf58d278d64 Added base64 support
Jack Jansen <jack.jansen@cwi.nl>
parents: 3042
diff changeset
729 {"b2a_base64", binascii_b2a_base64, 1,
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
730 doc_b2a_base64},
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
731 {"a2b_hqx", binascii_a2b_hqx, 1, doc_a2b_hqx},
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
732 {"b2a_hqx", binascii_b2a_hqx, 1, doc_b2a_hqx},
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
733 {"rlecode_hqx", binascii_rlecode_hqx, 1,
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
734 doc_rlecode_hqx},
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
735 {"rledecode_hqx", binascii_rledecode_hqx, 1,
4973
7d73cdc01198 Renamed.
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4938
diff changeset
736 doc_rledecode_hqx},
2911
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
737 {"crc_hqx", binascii_crc_hqx, 1, doc_crc_hqx},
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
738 {NULL, NULL} /* sentinel */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
739 };
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
740
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
741
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
742 /* Initialization function for the module (*must* be called initbinascii) */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
743 static char doc_binascii[] = "Conversion between binary data and ASCII";
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
744
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
745 void
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
746 initbinascii()
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
747 {
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
748 PyObject *m, *d, *x;
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
749
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
750 /* Create the module and add the functions */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
751 m = Py_InitModule("binascii", binascii_module_methods);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
752
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
753 d = PyModule_GetDict(m);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
754 x = PyString_FromString(doc_binascii);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
755 PyDict_SetItemString(d, "__doc__", x);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
756
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
757 Error = PyString_FromString("binascii.Error");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
758 PyDict_SetItemString(d, "Error", Error);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
759 Incomplete = PyString_FromString("binascii.Incomplete");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
760 PyDict_SetItemString(d, "Incomplete", Incomplete);
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
761
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
762 /* Check for errors */
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
763 if (PyErr_Occurred())
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
764 Py_FatalError("can't initialize module binascii");
429d7e1b1f2b Helper module for uuencode and binhex coders
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
765 }