blob: 5bd730c6f7e14b2470c29128f4fb6160dc380430 [file] [log] [blame]
Jack Jansen72781191995-08-07 14:34:15 +00001/*
2** Routines to represent binary data in ASCII and vice-versa
3**
4** This module currently supports the following encodings:
5** uuencode:
6** each line encodes 45 bytes (except possibly the last)
7** First char encodes (binary) length, rest data
8** each char encodes 6 bits, as follows:
9** binary: 01234567 abcdefgh ijklmnop
10** ascii: 012345 67abcd efghij klmnop
11** ASCII encoding method is "excess-space": 000000 is encoded as ' ', etc.
12** short binary data is zero-extended (so the bits are always in the
13** right place), this does *not* reflect in the length.
Jack Jansen84bbc2e1995-10-04 16:38:44 +000014** base64:
15** Line breaks are insignificant, but lines are at most 76 chars
16** each char encodes 6 bits, in similar order as uucode/hqx. Encoding
17** is done via a table.
18** Short binary data is filled (in ASCII) with '='.
Jack Jansen72781191995-08-07 14:34:15 +000019** hqx:
20** File starts with introductory text, real data starts and ends
21** with colons.
22** Data consists of three similar parts: info, datafork, resourcefork.
23** Each part is protected (at the end) with a 16-bit crc
24** The binary data is run-length encoded, and then ascii-fied:
25** binary: 01234567 abcdefgh ijklmnop
26** ascii: 012345 67abcd efghij klmnop
27** ASCII encoding is table-driven, see the code.
28** Short binary data results in the runt ascii-byte being output with
29** the bits in the right place.
30**
31** While I was reading dozens of programs that encode or decode the formats
32** here (documentation? hihi:-) I have formulated Jansen's Observation:
33**
34** Programs that encode binary data in ASCII are written in
35** such a style that they are as unreadable as possible. Devices used
36** include unnecessary global variables, burying important tables
37** in unrelated sourcefiles, putting functions in include files,
38** using seemingly-descriptive variable names for different purposes,
39** calls to empty subroutines and a host of others.
40**
41** I have attempted to break with this tradition, but I guess that that
42** does make the performance sub-optimal. Oh well, too bad...
43**
44** Jack Jansen, CWI, July 1995.
Tim Peters934c1a12002-07-02 22:24:50 +000045**
Martin v. Löwis16dc7f42001-09-30 20:32:11 +000046** Added support for quoted-printable encoding, based on rfc 1521 et al
Tim Peters934c1a12002-07-02 22:24:50 +000047** quoted-printable encoding specifies that non printable characters (anything
Martin v. Löwis16dc7f42001-09-30 20:32:11 +000048** below 32 and above 126) be encoded as =XX where XX is the hexadecimal value
49** of the character. It also specifies some other behavior to enable 8bit data
Tim Peters934c1a12002-07-02 22:24:50 +000050** in a mail message with little difficulty (maximum line sizes, protecting
51** some cases of whitespace, etc).
Martin v. Löwis16dc7f42001-09-30 20:32:11 +000052**
53** Brandon Long, September 2001.
Jack Jansen72781191995-08-07 14:34:15 +000054*/
55
56
57#include "Python.h"
58
59static PyObject *Error;
60static PyObject *Incomplete;
61
62/*
63** hqx lookup table, ascii->binary.
64*/
65
66#define RUNCHAR 0x90
67
68#define DONE 0x7F
69#define SKIP 0x7E
70#define FAIL 0x7D
71
72static unsigned char table_a2b_hqx[256] = {
73/* ^@ ^A ^B ^C ^D ^E ^F ^G */
74/* 0*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
75/* \b \t \n ^K ^L \r ^N ^O */
76/* 1*/ FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
77/* ^P ^Q ^R ^S ^T ^U ^V ^W */
78/* 2*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
79/* ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
80/* 3*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
81/* ! " # $ % & ' */
82/* 4*/ FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
83/* ( ) * + , - . / */
84/* 5*/ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
85/* 0 1 2 3 4 5 6 7 */
86/* 6*/ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
87/* 8 9 : ; < = > ? */
88/* 7*/ 0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
89/* @ A B C D E F G */
90/* 8*/ 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
91/* H I J K L M N O */
92/* 9*/ 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
93/* P Q R S T U V W */
94/*10*/ 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
95/* X Y Z [ \ ] ^ _ */
96/*11*/ 0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
97/* ` a b c d e f g */
98/*12*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
99/* h i j k l m n o */
100/*13*/ 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
101/* p q r s t u v w */
102/*14*/ 0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
103/* x y z { | } ~ ^? */
104/*15*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
105/*16*/ FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
106 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
107 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
108 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
109 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
110 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
111 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
112 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
113 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
114 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
115 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
116 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
117 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
118 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
119 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
120 FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
121};
122
123static unsigned char table_b2a_hqx[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000124"!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
Jack Jansen72781191995-08-07 14:34:15 +0000125
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000126static char table_a2b_base64[] = {
127 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
128 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
129 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
130 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
131 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
132 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
133 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
134 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
135};
136
137#define BASE64_PAD '='
Guido van Rossum355bc0c2001-10-30 03:00:52 +0000138
139/* Max binary chunk size; limited only by available memory */
Tim Peters1fbb5772001-12-19 04:41:35 +0000140#define BASE64_MAXBIN (INT_MAX/2 - sizeof(PyStringObject) - 3)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000141
142static unsigned char table_b2a_base64[] =
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000143"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000144
145
146
Jack Jansen72781191995-08-07 14:34:15 +0000147static unsigned short crctab_hqx[256] = {
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000148 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
149 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
150 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
151 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
152 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
153 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
154 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
155 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
156 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
157 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
158 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
159 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
160 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
161 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
162 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
163 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
164 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
165 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
166 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
167 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
168 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
169 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
170 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
171 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
172 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
173 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
174 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
175 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
176 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
177 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
178 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
179 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
Jack Jansen72781191995-08-07 14:34:15 +0000180};
181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000182PyDoc_STRVAR(doc_a2b_uu, "(ascii) -> bin. Decode a line of uuencoded data");
Jack Jansen72781191995-08-07 14:34:15 +0000183
184static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000185binascii_a2b_uu(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000186{
187 unsigned char *ascii_data, *bin_data;
188 int leftbits = 0;
189 unsigned char this_ch;
190 unsigned int leftchar = 0;
191 PyObject *rv;
192 int ascii_len, bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000193
Guido van Rossum43713e52000-02-29 13:59:29 +0000194 if ( !PyArg_ParseTuple(args, "t#:a2b_uu", &ascii_data, &ascii_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000195 return NULL;
196
197 /* First byte: binary data length (in bytes) */
198 bin_len = (*ascii_data++ - ' ') & 077;
199 ascii_len--;
200
201 /* Allocate the buffer */
202 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
203 return NULL;
204 bin_data = (unsigned char *)PyString_AsString(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000205
Jack Jansen72781191995-08-07 14:34:15 +0000206 for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
Neal Norwitzfe92eef2004-06-06 20:13:10 +0000207 /* XXX is it really best to add NULs if there's no more data */
208 this_ch = (ascii_len > 0) ? *ascii_data : 0;
Jack Jansen72781191995-08-07 14:34:15 +0000209 if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
210 /*
211 ** Whitespace. Assume some spaces got eaten at
212 ** end-of-line. (We check this later)
213 */
214 this_ch = 0;
215 } else {
Jack Jansen5d957971995-11-14 10:35:19 +0000216 /* Check the character for legality
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000217 ** The 64 in stead of the expected 63 is because
218 ** there are a few uuencodes out there that use
Guido van Rossum92d89172001-01-09 02:11:57 +0000219 ** '`' as zero instead of space.
Jack Jansen5d957971995-11-14 10:35:19 +0000220 */
221 if ( this_ch < ' ' || this_ch > (' ' + 64)) {
Jack Jansen72781191995-08-07 14:34:15 +0000222 PyErr_SetString(Error, "Illegal char");
223 Py_DECREF(rv);
224 return NULL;
225 }
226 this_ch = (this_ch - ' ') & 077;
227 }
228 /*
229 ** Shift it in on the low end, and see if there's
230 ** a byte ready for output.
231 */
232 leftchar = (leftchar << 6) | (this_ch);
233 leftbits += 6;
234 if ( leftbits >= 8 ) {
235 leftbits -= 8;
236 *bin_data++ = (leftchar >> leftbits) & 0xff;
237 leftchar &= ((1 << leftbits) - 1);
238 bin_len--;
239 }
240 }
241 /*
242 ** Finally, check that if there's anything left on the line
243 ** that it's whitespace only.
244 */
245 while( ascii_len-- > 0 ) {
246 this_ch = *ascii_data++;
Guido van Rossum92d89172001-01-09 02:11:57 +0000247 /* Extra '`' may be written as padding in some cases */
248 if ( this_ch != ' ' && this_ch != ' '+64 &&
Guido van Rossum1243ae71997-07-11 18:36:28 +0000249 this_ch != '\n' && this_ch != '\r' ) {
Jack Jansen72781191995-08-07 14:34:15 +0000250 PyErr_SetString(Error, "Trailing garbage");
251 Py_DECREF(rv);
252 return NULL;
253 }
254 }
255 return rv;
256}
257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000258PyDoc_STRVAR(doc_b2a_uu, "(bin) -> ascii. Uuencode line of data");
Tim Peters934c1a12002-07-02 22:24:50 +0000259
Jack Jansen72781191995-08-07 14:34:15 +0000260static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000261binascii_b2a_uu(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000262{
263 unsigned char *ascii_data, *bin_data;
264 int leftbits = 0;
265 unsigned char this_ch;
266 unsigned int leftchar = 0;
267 PyObject *rv;
268 int bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000269
Guido van Rossum43713e52000-02-29 13:59:29 +0000270 if ( !PyArg_ParseTuple(args, "s#:b2a_uu", &bin_data, &bin_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000271 return NULL;
272 if ( bin_len > 45 ) {
273 /* The 45 is a limit that appears in all uuencode's */
274 PyErr_SetString(Error, "At most 45 bytes at once");
275 return NULL;
276 }
277
278 /* We're lazy and allocate to much (fixed up later) */
279 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2)) == NULL )
280 return NULL;
281 ascii_data = (unsigned char *)PyString_AsString(rv);
282
283 /* Store the length */
284 *ascii_data++ = ' ' + (bin_len & 077);
Tim Peters934c1a12002-07-02 22:24:50 +0000285
Jack Jansen72781191995-08-07 14:34:15 +0000286 for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
287 /* Shift the data (or padding) into our buffer */
288 if ( bin_len > 0 ) /* Data */
289 leftchar = (leftchar << 8) | *bin_data;
290 else /* Padding */
291 leftchar <<= 8;
292 leftbits += 8;
293
294 /* See if there are 6-bit groups ready */
295 while ( leftbits >= 6 ) {
296 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
297 leftbits -= 6;
298 *ascii_data++ = this_ch + ' ';
299 }
300 }
301 *ascii_data++ = '\n'; /* Append a courtesy newline */
Tim Peters934c1a12002-07-02 22:24:50 +0000302
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000303 _PyString_Resize(&rv, (ascii_data -
304 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000305 return rv;
306}
307
Guido van Rossum2db4f471999-10-19 19:05:14 +0000308
309static int
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000310binascii_find_valid(unsigned char *s, int slen, int num)
Guido van Rossum2db4f471999-10-19 19:05:14 +0000311{
Tim Peters934c1a12002-07-02 22:24:50 +0000312 /* Finds & returns the (num+1)th
Guido van Rossum2db4f471999-10-19 19:05:14 +0000313 ** valid character for base64, or -1 if none.
314 */
315
316 int ret = -1;
317 unsigned char c, b64val;
318
319 while ((slen > 0) && (ret == -1)) {
320 c = *s;
321 b64val = table_a2b_base64[c & 0x7f];
322 if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
323 if (num == 0)
324 ret = *s;
325 num--;
326 }
327
328 s++;
329 slen--;
330 }
331 return ret;
332}
333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000334PyDoc_STRVAR(doc_a2b_base64, "(ascii) -> bin. Decode a line of base64 data");
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000335
336static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000337binascii_a2b_base64(PyObject *self, PyObject *args)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000338{
339 unsigned char *ascii_data, *bin_data;
340 int leftbits = 0;
341 unsigned char this_ch;
342 unsigned int leftchar = 0;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000343 PyObject *rv;
344 int ascii_len, bin_len;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000345 int quad_pos = 0;
Tim Peters934c1a12002-07-02 22:24:50 +0000346
Guido van Rossum43713e52000-02-29 13:59:29 +0000347 if ( !PyArg_ParseTuple(args, "t#:a2b_base64", &ascii_data, &ascii_len) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000348 return NULL;
349
350 bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
351
352 /* Allocate the buffer */
353 if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
354 return NULL;
355 bin_data = (unsigned char *)PyString_AsString(rv);
356 bin_len = 0;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000357
358 for( ; ascii_len > 0; ascii_len--, ascii_data++) {
359 this_ch = *ascii_data;
360
361 if (this_ch > 0x7f ||
362 this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
Jack Jansenba1de3b1996-01-22 10:47:15 +0000363 continue;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000364
365 /* Check for pad sequences and ignore
366 ** the invalid ones.
367 */
368 if (this_ch == BASE64_PAD) {
369 if ( (quad_pos < 2) ||
370 ((quad_pos == 2) &&
371 (binascii_find_valid(ascii_data, ascii_len, 1)
372 != BASE64_PAD)) )
373 {
374 continue;
375 }
376 else {
377 /* A pad sequence means no more input.
378 ** We've already interpreted the data
379 ** from the quad at this point.
380 */
381 leftbits = 0;
382 break;
383 }
384 }
385
386 this_ch = table_a2b_base64[*ascii_data];
387 if ( this_ch == (unsigned char) -1 )
388 continue;
389
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000390 /*
391 ** Shift it in on the low end, and see if there's
392 ** a byte ready for output.
393 */
Guido van Rossum2db4f471999-10-19 19:05:14 +0000394 quad_pos = (quad_pos + 1) & 0x03;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000395 leftchar = (leftchar << 6) | (this_ch);
396 leftbits += 6;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000397
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000398 if ( leftbits >= 8 ) {
399 leftbits -= 8;
400 *bin_data++ = (leftchar >> leftbits) & 0xff;
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000401 bin_len++;
Guido van Rossum2db4f471999-10-19 19:05:14 +0000402 leftchar &= ((1 << leftbits) - 1);
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000403 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000404 }
405
406 if (leftbits != 0) {
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000407 PyErr_SetString(Error, "Incorrect padding");
408 Py_DECREF(rv);
409 return NULL;
410 }
Guido van Rossum2db4f471999-10-19 19:05:14 +0000411
Thomas Wouters9e1c1922003-03-17 11:24:29 +0000412 /* And set string size correctly. If the result string is empty
413 ** (because the input was all invalid) return the shared empty
414 ** string instead; _PyString_Resize() won't do this for us.
415 */
Barry Warsaw0a51b582002-08-15 22:14:24 +0000416 if (bin_len > 0)
417 _PyString_Resize(&rv, bin_len);
Thomas Wouters9e1c1922003-03-17 11:24:29 +0000418 else {
419 Py_DECREF(rv);
420 rv = PyString_FromString("");
421 }
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000422 return rv;
423}
424
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000425PyDoc_STRVAR(doc_b2a_base64, "(bin) -> ascii. Base64-code line of data");
Tim Peters934c1a12002-07-02 22:24:50 +0000426
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000427static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000428binascii_b2a_base64(PyObject *self, PyObject *args)
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000429{
430 unsigned char *ascii_data, *bin_data;
431 int leftbits = 0;
432 unsigned char this_ch;
433 unsigned int leftchar = 0;
434 PyObject *rv;
435 int bin_len;
Tim Peters934c1a12002-07-02 22:24:50 +0000436
Guido van Rossum43713e52000-02-29 13:59:29 +0000437 if ( !PyArg_ParseTuple(args, "s#:b2a_base64", &bin_data, &bin_len) )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000438 return NULL;
439 if ( bin_len > BASE64_MAXBIN ) {
440 PyErr_SetString(Error, "Too much data for base64 line");
441 return NULL;
442 }
Tim Peters934c1a12002-07-02 22:24:50 +0000443
Tim Peters1fbb5772001-12-19 04:41:35 +0000444 /* We're lazy and allocate too much (fixed up later).
445 "+3" leaves room for up to two pad characters and a trailing
446 newline. Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */
447 if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL )
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000448 return NULL;
449 ascii_data = (unsigned char *)PyString_AsString(rv);
450
451 for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
452 /* Shift the data into our buffer */
453 leftchar = (leftchar << 8) | *bin_data;
454 leftbits += 8;
455
456 /* See if there are 6-bit groups ready */
457 while ( leftbits >= 6 ) {
458 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
459 leftbits -= 6;
460 *ascii_data++ = table_b2a_base64[this_ch];
461 }
462 }
463 if ( leftbits == 2 ) {
464 *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
465 *ascii_data++ = BASE64_PAD;
466 *ascii_data++ = BASE64_PAD;
467 } else if ( leftbits == 4 ) {
468 *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
469 *ascii_data++ = BASE64_PAD;
Tim Peters934c1a12002-07-02 22:24:50 +0000470 }
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000471 *ascii_data++ = '\n'; /* Append a courtesy newline */
Tim Peters934c1a12002-07-02 22:24:50 +0000472
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000473 _PyString_Resize(&rv, (ascii_data -
474 (unsigned char *)PyString_AsString(rv)));
Jack Jansen84bbc2e1995-10-04 16:38:44 +0000475 return rv;
476}
477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000478PyDoc_STRVAR(doc_a2b_hqx, "ascii -> bin, done. Decode .hqx coding");
Jack Jansen72781191995-08-07 14:34:15 +0000479
480static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000481binascii_a2b_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000482{
483 unsigned char *ascii_data, *bin_data;
484 int leftbits = 0;
485 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000486 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000487 PyObject *rv;
488 int len;
489 int done = 0;
Tim Peters934c1a12002-07-02 22:24:50 +0000490
Guido van Rossum43713e52000-02-29 13:59:29 +0000491 if ( !PyArg_ParseTuple(args, "t#:a2b_hqx", &ascii_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000492 return NULL;
493
494 /* Allocate a string that is too big (fixed later) */
495 if ( (rv=PyString_FromStringAndSize(NULL, len)) == NULL )
496 return NULL;
497 bin_data = (unsigned char *)PyString_AsString(rv);
498
499 for( ; len > 0 ; len--, ascii_data++ ) {
500 /* Get the byte and look it up */
501 this_ch = table_a2b_hqx[*ascii_data];
502 if ( this_ch == SKIP )
503 continue;
504 if ( this_ch == FAIL ) {
505 PyErr_SetString(Error, "Illegal char");
506 Py_DECREF(rv);
507 return NULL;
508 }
509 if ( this_ch == DONE ) {
510 /* The terminating colon */
511 done = 1;
512 break;
513 }
514
515 /* Shift it into the buffer and see if any bytes are ready */
516 leftchar = (leftchar << 6) | (this_ch);
517 leftbits += 6;
518 if ( leftbits >= 8 ) {
519 leftbits -= 8;
520 *bin_data++ = (leftchar >> leftbits) & 0xff;
521 leftchar &= ((1 << leftbits) - 1);
522 }
523 }
Tim Peters934c1a12002-07-02 22:24:50 +0000524
Jack Jansen72781191995-08-07 14:34:15 +0000525 if ( leftbits && !done ) {
526 PyErr_SetString(Incomplete,
527 "String has incomplete number of bytes");
528 Py_DECREF(rv);
529 return NULL;
530 }
Guido van Rossum9c6ba5e1997-01-12 20:02:04 +0000531 _PyString_Resize(
532 &rv, (bin_data - (unsigned char *)PyString_AsString(rv)));
533 if (rv) {
534 PyObject *rrv = Py_BuildValue("Oi", rv, done);
535 Py_DECREF(rv);
536 return rrv;
537 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000538
Jack Jansen72781191995-08-07 14:34:15 +0000539 return NULL;
540}
541
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000542PyDoc_STRVAR(doc_rlecode_hqx, "Binhex RLE-code binary data");
Jack Jansen72781191995-08-07 14:34:15 +0000543
544static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000545binascii_rlecode_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000546{
547 unsigned char *in_data, *out_data;
548 PyObject *rv;
549 unsigned char ch;
550 int in, inend, len;
Tim Peters934c1a12002-07-02 22:24:50 +0000551
Guido van Rossum43713e52000-02-29 13:59:29 +0000552 if ( !PyArg_ParseTuple(args, "s#:rlecode_hqx", &in_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000553 return NULL;
554
555 /* Worst case: output is twice as big as input (fixed later) */
556 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
557 return NULL;
558 out_data = (unsigned char *)PyString_AsString(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000559
Jack Jansen72781191995-08-07 14:34:15 +0000560 for( in=0; in<len; in++) {
561 ch = in_data[in];
562 if ( ch == RUNCHAR ) {
563 /* RUNCHAR. Escape it. */
564 *out_data++ = RUNCHAR;
565 *out_data++ = 0;
566 } else {
567 /* Check how many following are the same */
568 for(inend=in+1;
569 inend<len && in_data[inend] == ch &&
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000570 inend < in+255;
Jack Jansen72781191995-08-07 14:34:15 +0000571 inend++) ;
Jack Jansen0223aa11995-08-31 13:44:23 +0000572 if ( inend - in > 3 ) {
573 /* More than 3 in a row. Output RLE. */
Jack Jansen72781191995-08-07 14:34:15 +0000574 *out_data++ = ch;
575 *out_data++ = RUNCHAR;
576 *out_data++ = inend-in;
577 in = inend-1;
578 } else {
579 /* Less than 3. Output the byte itself */
580 *out_data++ = ch;
581 }
582 }
583 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000584 _PyString_Resize(&rv, (out_data -
585 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000586 return rv;
587}
588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000589PyDoc_STRVAR(doc_b2a_hqx, "Encode .hqx data");
Tim Peters934c1a12002-07-02 22:24:50 +0000590
Jack Jansen72781191995-08-07 14:34:15 +0000591static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000592binascii_b2a_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000593{
594 unsigned char *ascii_data, *bin_data;
595 int leftbits = 0;
596 unsigned char this_ch;
Jack Janseneaeb1c81995-08-14 12:17:57 +0000597 unsigned int leftchar = 0;
Jack Jansen72781191995-08-07 14:34:15 +0000598 PyObject *rv;
599 int len;
Tim Peters934c1a12002-07-02 22:24:50 +0000600
Guido van Rossum43713e52000-02-29 13:59:29 +0000601 if ( !PyArg_ParseTuple(args, "s#:b2a_hqx", &bin_data, &len) )
Jack Jansen72781191995-08-07 14:34:15 +0000602 return NULL;
603
604 /* Allocate a buffer that is at least large enough */
605 if ( (rv=PyString_FromStringAndSize(NULL, len*2)) == NULL )
606 return NULL;
607 ascii_data = (unsigned char *)PyString_AsString(rv);
Tim Peters934c1a12002-07-02 22:24:50 +0000608
Jack Jansen72781191995-08-07 14:34:15 +0000609 for( ; len > 0 ; len--, bin_data++ ) {
610 /* Shift into our buffer, and output any 6bits ready */
611 leftchar = (leftchar << 8) | *bin_data;
612 leftbits += 8;
613 while ( leftbits >= 6 ) {
614 this_ch = (leftchar >> (leftbits-6)) & 0x3f;
615 leftbits -= 6;
616 *ascii_data++ = table_b2a_hqx[this_ch];
617 }
618 }
619 /* Output a possible runt byte */
620 if ( leftbits ) {
621 leftchar <<= (6-leftbits);
622 *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
623 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000624 _PyString_Resize(&rv, (ascii_data -
625 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000626 return rv;
627}
628
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000629PyDoc_STRVAR(doc_rledecode_hqx, "Decode hexbin RLE-coded string");
Tim Peters934c1a12002-07-02 22:24:50 +0000630
Jack Jansen72781191995-08-07 14:34:15 +0000631static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000632binascii_rledecode_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000633{
634 unsigned char *in_data, *out_data;
635 unsigned char in_byte, in_repeat;
636 PyObject *rv;
637 int in_len, out_len, out_len_left;
638
Guido van Rossum43713e52000-02-29 13:59:29 +0000639 if ( !PyArg_ParseTuple(args, "s#:rledecode_hqx", &in_data, &in_len) )
Jack Jansen72781191995-08-07 14:34:15 +0000640 return NULL;
641
642 /* Empty string is a special case */
643 if ( in_len == 0 )
644 return Py_BuildValue("s", "");
645
646 /* Allocate a buffer of reasonable size. Resized when needed */
647 out_len = in_len*2;
648 if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL )
649 return NULL;
650 out_len_left = out_len;
651 out_data = (unsigned char *)PyString_AsString(rv);
652
653 /*
654 ** We need two macros here to get/put bytes and handle
655 ** end-of-buffer for input and output strings.
656 */
657#define INBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000658 do { \
659 if ( --in_len < 0 ) { \
660 PyErr_SetString(Incomplete, ""); \
661 Py_DECREF(rv); \
662 return NULL; \
663 } \
664 b = *in_data++; \
665 } while(0)
Tim Peters934c1a12002-07-02 22:24:50 +0000666
Jack Jansen72781191995-08-07 14:34:15 +0000667#define OUTBYTE(b) \
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000668 do { \
669 if ( --out_len_left < 0 ) { \
670 _PyString_Resize(&rv, 2*out_len); \
671 if ( rv == NULL ) return NULL; \
672 out_data = (unsigned char *)PyString_AsString(rv) \
673 + out_len; \
674 out_len_left = out_len-1; \
675 out_len = out_len * 2; \
676 } \
677 *out_data++ = b; \
678 } while(0)
Jack Jansen72781191995-08-07 14:34:15 +0000679
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000680 /*
681 ** Handle first byte separately (since we have to get angry
682 ** in case of an orphaned RLE code).
683 */
684 INBYTE(in_byte);
Jack Jansen72781191995-08-07 14:34:15 +0000685
686 if (in_byte == RUNCHAR) {
687 INBYTE(in_repeat);
688 if (in_repeat != 0) {
689 /* Note Error, not Incomplete (which is at the end
690 ** of the string only). This is a programmer error.
691 */
692 PyErr_SetString(Error, "Orphaned RLE code at start");
693 Py_DECREF(rv);
694 return NULL;
695 }
696 OUTBYTE(RUNCHAR);
697 } else {
698 OUTBYTE(in_byte);
699 }
Tim Peters934c1a12002-07-02 22:24:50 +0000700
Jack Jansen72781191995-08-07 14:34:15 +0000701 while( in_len > 0 ) {
702 INBYTE(in_byte);
703
704 if (in_byte == RUNCHAR) {
705 INBYTE(in_repeat);
706 if ( in_repeat == 0 ) {
707 /* Just an escaped RUNCHAR value */
708 OUTBYTE(RUNCHAR);
709 } else {
710 /* Pick up value and output a sequence of it */
711 in_byte = out_data[-1];
712 while ( --in_repeat > 0 )
713 OUTBYTE(in_byte);
714 }
715 } else {
716 /* Normal byte */
717 OUTBYTE(in_byte);
718 }
719 }
Roger E. Masse5f4ce181997-01-16 17:10:22 +0000720 _PyString_Resize(&rv, (out_data -
721 (unsigned char *)PyString_AsString(rv)));
Jack Jansen72781191995-08-07 14:34:15 +0000722 return rv;
723}
724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000725PyDoc_STRVAR(doc_crc_hqx,
726"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally");
Jack Jansen72781191995-08-07 14:34:15 +0000727
728static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000729binascii_crc_hqx(PyObject *self, PyObject *args)
Jack Jansen72781191995-08-07 14:34:15 +0000730{
731 unsigned char *bin_data;
732 unsigned int crc;
733 int len;
Tim Peters934c1a12002-07-02 22:24:50 +0000734
Guido van Rossum43713e52000-02-29 13:59:29 +0000735 if ( !PyArg_ParseTuple(args, "s#i:crc_hqx", &bin_data, &len, &crc) )
Jack Jansen72781191995-08-07 14:34:15 +0000736 return NULL;
737
738 while(len--) {
739 crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
740 }
741
742 return Py_BuildValue("i", crc);
743}
744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000745PyDoc_STRVAR(doc_crc32,
746"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000747
748/* Crc - 32 BIT ANSI X3.66 CRC checksum files
749 Also known as: ISO 3307
750**********************************************************************|
751* *|
752* Demonstration program to compute the 32-bit CRC used as the frame *|
753* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
754* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
755* protocol). The 32-bit FCS was added via the Federal Register, *|
756* 1 June 1982, p.23798. I presume but don't know for certain that *|
757* this polynomial is or will be included in CCITT V.41, which *|
758* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
759* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
760* errors by a factor of 10^-5 over 16-bit FCS. *|
761* *|
762**********************************************************************|
763
764 Copyright (C) 1986 Gary S. Brown. You may use this program, or
765 code or tables extracted from it, as desired without restriction.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000766
Tim Peters934c1a12002-07-02 22:24:50 +0000767 First, the polynomial itself and its table of feedback terms. The
768 polynomial is
769 X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
770 Note that we take it "backwards" and put the highest-order term in
771 the lowest-order bit. The X^32 term is "implied"; the LSB is the
772 X^31 term, etc. The X^0 term (usually shown as "+1") results in
773 the MSB being 1.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000774
Tim Peters934c1a12002-07-02 22:24:50 +0000775 Note that the usual hardware shift register implementation, which
776 is what we're using (we're merely optimizing it by doing eight-bit
777 chunks at a time) shifts bits into the lowest-order term. In our
778 implementation, that means shifting towards the right. Why do we
779 do it this way? Because the calculated CRC must be transmitted in
780 order from highest-order term to lowest-order term. UARTs transmit
781 characters in order from LSB to MSB. By storing the CRC this way,
782 we hand it to the UART in the order low-byte to high-byte; the UART
783 sends each low-bit to hight-bit; and the result is transmission bit
784 by bit from highest- to lowest-order term without requiring any bit
785 shuffling on our part. Reception works similarly.
786
787 The feedback terms table consists of 256, 32-bit entries. Notes:
788
789 1. The table can be generated at runtime if desired; code to do so
790 is shown later. It might not be obvious, but the feedback
791 terms simply represent the results of eight shift/xor opera-
792 tions for all combinations of data and CRC register values.
793
794 2. The CRC accumulation logic is the same for all CRC polynomials,
795 be they sixteen or thirty-two bits wide. You simply choose the
796 appropriate table. Alternatively, because the table can be
797 generated at runtime, you can start by generating the table for
798 the polynomial in question and use exactly the same "updcrc",
799 if your application needn't simultaneously handle two CRC
800 polynomials. (Note, however, that XMODEM is strange.)
801
802 3. For 16-bit CRCs, the table entries need be only 16 bits wide;
803 of course, 32-bit entries work OK if the high 16 bits are zero.
804
805 4. The values must be right-shifted by eight bits by the "updcrc"
806 logic; the shift must be unsigned (bring in zeroes). On some
807 hardware you could probably optimize the shift in assembler by
808 using byte-swap instructions.
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000809********************************************************************/
810
811static unsigned long crc_32_tab[256] = {
8120x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
8130x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
8140xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
8150x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
8160x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
8170x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
8180xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
8190xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
8200x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
8210x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
8220xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
8230xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
8240x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
8250x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
8260x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
8270xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
8280x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
8290x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
8300x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
8310xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
8320x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
8330x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
8340xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
8350xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
8360x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
8370x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
8380x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
8390x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
8400xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
8410x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
8420x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
8430x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
8440xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
8450xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
8460x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
8470x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
8480xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
8490xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
8500x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
8510x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
8520x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
8530xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
8540x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
8550x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
8560x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
8570xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
8580x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
8590x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
8600xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
8610xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
8620x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
8630x2d02ef8dUL
864};
865
866static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000867binascii_crc32(PyObject *self, PyObject *args)
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000868{ /* By Jim Ahlstrom; All rights transferred to CNRI */
869 unsigned char *bin_data;
870 unsigned long crc = 0UL; /* initial value of CRC */
871 int len;
Tim Petersa98011c2002-07-02 20:20:08 +0000872 long result;
Tim Peters934c1a12002-07-02 22:24:50 +0000873
Guido van Rossum43713e52000-02-29 13:59:29 +0000874 if ( !PyArg_ParseTuple(args, "s#|l:crc32", &bin_data, &len, &crc) )
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000875 return NULL;
876
Tim Peters934c1a12002-07-02 22:24:50 +0000877 crc = ~ crc;
878#if SIZEOF_LONG > 4
879 /* only want the trailing 32 bits */
880 crc &= 0xFFFFFFFFUL;
881#endif
882 while (len--)
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000883 crc = crc_32_tab[(crc ^ *bin_data++) & 0xffUL] ^ (crc >> 8);
884 /* Note: (crc >> 8) MUST zero fill on left */
Tim Petersa98011c2002-07-02 20:20:08 +0000885
886 result = (long)(crc ^ 0xFFFFFFFFUL);
Tim Peters934c1a12002-07-02 22:24:50 +0000887#if SIZEOF_LONG > 4
888 /* Extend the sign bit. This is one way to ensure the result is the
889 * same across platforms. The other way would be to return an
890 * unbounded unsigned long, but the evidence suggests that lots of
891 * code outside this treats the result as if it were a signed 4-byte
892 * integer.
Tim Petersa98011c2002-07-02 20:20:08 +0000893 */
894 result |= -(result & (1L << 31));
Tim Peters934c1a12002-07-02 22:24:50 +0000895#endif
Tim Petersa98011c2002-07-02 20:20:08 +0000896 return PyInt_FromLong(result);
Guido van Rossum7d47c9e2000-02-16 21:11:52 +0000897}
898
Barry Warsawe977c212000-08-15 06:07:13 +0000899
900static PyObject *
901binascii_hexlify(PyObject *self, PyObject *args)
902{
903 char* argbuf;
904 int arglen;
905 PyObject *retval;
906 char* retbuf;
907 int i, j;
908
909 if (!PyArg_ParseTuple(args, "t#:b2a_hex", &argbuf, &arglen))
910 return NULL;
911
912 retval = PyString_FromStringAndSize(NULL, arglen*2);
913 if (!retval)
914 return NULL;
915 retbuf = PyString_AsString(retval);
916 if (!retbuf)
917 goto finally;
918
919 /* make hex version of string, taken from shamodule.c */
920 for (i=j=0; i < arglen; i++) {
921 char c;
922 c = (argbuf[i] >> 4) & 0xf;
923 c = (c>9) ? c+'a'-10 : c + '0';
924 retbuf[j++] = c;
925 c = argbuf[i] & 0xf;
926 c = (c>9) ? c+'a'-10 : c + '0';
927 retbuf[j++] = c;
928 }
929 return retval;
930
931 finally:
932 Py_DECREF(retval);
933 return NULL;
934}
935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936PyDoc_STRVAR(doc_hexlify,
Barry Warsawe977c212000-08-15 06:07:13 +0000937"b2a_hex(data) -> s; Hexadecimal representation of binary data.\n\
938\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000939This function is also available as \"hexlify()\".");
Barry Warsawe977c212000-08-15 06:07:13 +0000940
941
942static int
Tim Peters934c1a12002-07-02 22:24:50 +0000943to_int(int c)
Barry Warsawe977c212000-08-15 06:07:13 +0000944{
945 if (isdigit(c))
946 return c - '0';
947 else {
948 if (isupper(c))
949 c = tolower(c);
950 if (c >= 'a' && c <= 'f')
951 return c - 'a' + 10;
952 }
953 return -1;
954}
955
956
957static PyObject *
958binascii_unhexlify(PyObject *self, PyObject *args)
959{
960 char* argbuf;
961 int arglen;
962 PyObject *retval;
963 char* retbuf;
964 int i, j;
965
966 if (!PyArg_ParseTuple(args, "s#:a2b_hex", &argbuf, &arglen))
967 return NULL;
968
Barry Warsaw16168472000-08-15 06:59:58 +0000969 /* XXX What should we do about strings with an odd length? Should
970 * we add an implicit leading zero, or a trailing zero? For now,
971 * raise an exception.
Barry Warsawe977c212000-08-15 06:07:13 +0000972 */
973 if (arglen % 2) {
Barry Warsaw16168472000-08-15 06:59:58 +0000974 PyErr_SetString(PyExc_TypeError, "Odd-length string");
Barry Warsawe977c212000-08-15 06:07:13 +0000975 return NULL;
976 }
977
978 retval = PyString_FromStringAndSize(NULL, (arglen/2));
979 if (!retval)
980 return NULL;
981 retbuf = PyString_AsString(retval);
982 if (!retbuf)
983 goto finally;
984
985 for (i=j=0; i < arglen; i += 2) {
986 int top = to_int(Py_CHARMASK(argbuf[i]));
987 int bot = to_int(Py_CHARMASK(argbuf[i+1]));
988 if (top == -1 || bot == -1) {
989 PyErr_SetString(PyExc_TypeError,
Barry Warsaw16168472000-08-15 06:59:58 +0000990 "Non-hexadecimal digit found");
Barry Warsawe977c212000-08-15 06:07:13 +0000991 goto finally;
992 }
993 retbuf[j++] = (top << 4) + bot;
994 }
995 return retval;
996
997 finally:
998 Py_DECREF(retval);
999 return NULL;
1000}
1001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001002PyDoc_STRVAR(doc_unhexlify,
Barry Warsawe977c212000-08-15 06:07:13 +00001003"a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n\
1004\n\
1005hexstr must contain an even number of hex digits (upper or lower case).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001006This function is also available as \"unhexlify()\"");
Barry Warsawe977c212000-08-15 06:07:13 +00001007
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001008static int table_hex[128] = {
1009 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1010 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1011 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1012 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,
1013 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1014 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1015 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
1016 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
1017};
1018
1019#define hexval(c) table_hex[(unsigned int)(c)]
1020
1021#define MAXLINESIZE 76
1022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001023PyDoc_STRVAR(doc_a2b_qp, "Decode a string of qp-encoded data");
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001024
Tim Peters934c1a12002-07-02 22:24:50 +00001025static PyObject*
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001026binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
1027{
1028 unsigned int in, out;
1029 char ch;
1030 unsigned char *data, *odata;
1031 unsigned int datalen = 0;
1032 PyObject *rv;
1033 static char *kwlist[] = {"data", "header", NULL};
1034 int header = 0;
1035
Tim Peters934c1a12002-07-02 22:24:50 +00001036 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|i", kwlist, &data,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001037 &datalen, &header))
1038 return NULL;
1039
Barry Warsaw23164a52004-05-11 02:05:11 +00001040 /* We allocate the output same size as input, this is overkill.
1041 * The previous implementation used calloc() so we'll zero out the
1042 * memory here too, since PyMem_Malloc() does not guarantee that.
1043 */
1044 odata = (unsigned char *) PyMem_Malloc(datalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001045 if (odata == NULL) {
1046 PyErr_NoMemory();
1047 return NULL;
1048 }
Martin v. Löwisb600fe92004-07-27 15:03:53 +00001049 memset(odata, 0, datalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001050
1051 in = out = 0;
1052 while (in < datalen) {
1053 if (data[in] == '=') {
1054 in++;
1055 if (in >= datalen) break;
1056 /* Soft line breaks */
Tim Peters934c1a12002-07-02 22:24:50 +00001057 if ((data[in] == '\n') || (data[in] == '\r') ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001058 (data[in] == ' ') || (data[in] == '\t')) {
1059 if (data[in] != '\n') {
1060 while (in < datalen && data[in] != '\n') in++;
1061 }
1062 if (in < datalen) in++;
1063 }
1064 else if (data[in] == '=') {
1065 /* broken case from broken python qp */
1066 odata[out++] = '=';
1067 in++;
1068 }
Tim Peters934c1a12002-07-02 22:24:50 +00001069 else if (((data[in] >= 'A' && data[in] <= 'F') ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001070 (data[in] >= 'a' && data[in] <= 'f') ||
1071 (data[in] >= '0' && data[in] <= '9')) &&
1072 ((data[in+1] >= 'A' && data[in+1] <= 'F') ||
1073 (data[in+1] >= 'a' && data[in+1] <= 'f') ||
1074 (data[in+1] >= '0' && data[in+1] <= '9'))) {
1075 /* hexval */
1076 ch = hexval(data[in]) << 4;
1077 in++;
1078 ch |= hexval(data[in]);
1079 in++;
1080 odata[out++] = ch;
1081 }
1082 else {
1083 odata[out++] = '=';
1084 }
1085 }
1086 else if (header && data[in] == '_') {
1087 odata[out++] = ' ';
1088 in++;
1089 }
1090 else {
1091 odata[out] = data[in];
1092 in++;
1093 out++;
1094 }
1095 }
Greg Warda645b302001-10-04 14:54:53 +00001096 if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
Barry Warsaw23164a52004-05-11 02:05:11 +00001097 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001098 return NULL;
1099 }
Barry Warsaw23164a52004-05-11 02:05:11 +00001100 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001101 return rv;
1102}
1103
Tim Peters934c1a12002-07-02 22:24:50 +00001104static int
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001105to_hex (unsigned char ch, unsigned char *s)
1106{
1107 unsigned int uvalue = ch;
1108
1109 s[1] = "0123456789ABCDEF"[uvalue % 16];
1110 uvalue = (uvalue / 16);
1111 s[0] = "0123456789ABCDEF"[uvalue % 16];
1112 return 0;
1113}
1114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001115PyDoc_STRVAR(doc_b2a_qp,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001116"b2a_qp(data, quotetabs=0, istext=1, header=0) -> s; \n\
1117 Encode a string using quoted-printable encoding. \n\
1118\n\
1119On encoding, when istext is set, newlines are not encoded, and white \n\
1120space at end of lines is. When istext is not set, \\r and \\n (CR/LF) are \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001121both encoded. When quotetabs is set, space and tabs are encoded.");
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001122
1123/* XXX: This is ridiculously complicated to be backward compatible
1124 * (mostly) with the quopri module. It doesn't re-create the quopri
1125 * module bug where text ending in CRLF has the CR encoded */
Tim Peters934c1a12002-07-02 22:24:50 +00001126static PyObject*
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001127binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
1128{
1129 unsigned int in, out;
1130 unsigned char *data, *odata;
1131 unsigned int datalen = 0, odatalen = 0;
1132 PyObject *rv;
1133 unsigned int linelen = 0;
1134 static char *kwlist[] = {"data", "quotetabs", "istext", "header", NULL};
1135 int istext = 1;
1136 int quotetabs = 0;
1137 int header = 0;
1138 unsigned char ch;
1139 int crlf = 0;
1140 unsigned char *p;
1141
Tim Peters934c1a12002-07-02 22:24:50 +00001142 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|iii", kwlist, &data,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001143 &datalen, &quotetabs, &istext, &header))
1144 return NULL;
1145
1146 /* See if this string is using CRLF line ends */
1147 /* XXX: this function has the side effect of converting all of
1148 * the end of lines to be the same depending on this detection
1149 * here */
Greg Warda645b302001-10-04 14:54:53 +00001150 p = (unsigned char *) strchr((char *)data, '\n');
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001151 if ((p != NULL) && (p > data) && (*(p-1) == '\r'))
1152 crlf = 1;
1153
1154 /* First, scan to see how many characters need to be encoded */
1155 in = 0;
1156 while (in < datalen) {
Tim Peters934c1a12002-07-02 22:24:50 +00001157 if ((data[in] > 126) ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001158 (data[in] == '=') ||
1159 (header && data[in] == '_') ||
1160 ((data[in] == '.') && (linelen == 1)) ||
1161 (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
1162 ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
Tim Peters934c1a12002-07-02 22:24:50 +00001163 ((data[in] < 33) &&
1164 (data[in] != '\r') && (data[in] != '\n') &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001165 (quotetabs && ((data[in] != '\t') || (data[in] != ' ')))))
1166 {
1167 if ((linelen + 3) >= MAXLINESIZE) {
1168 linelen = 0;
1169 if (crlf)
1170 odatalen += 3;
1171 else
1172 odatalen += 2;
1173 }
1174 linelen += 3;
1175 odatalen += 3;
1176 in++;
1177 }
1178 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001179 if (istext &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001180 ((data[in] == '\n') ||
1181 ((in+1 < datalen) && (data[in] == '\r') &&
1182 (data[in+1] == '\n'))))
1183 {
1184 linelen = 0;
1185 /* Protect against whitespace on end of line */
1186 if (in && ((data[in-1] == ' ') || (data[in-1] == '\t')))
1187 odatalen += 2;
1188 if (crlf)
1189 odatalen += 2;
1190 else
1191 odatalen += 1;
1192 if (data[in] == '\r')
1193 in += 2;
1194 else
1195 in++;
1196 }
1197 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001198 if ((in + 1 != datalen) &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001199 (data[in+1] != '\n') &&
1200 (linelen + 1) >= MAXLINESIZE) {
1201 linelen = 0;
1202 if (crlf)
1203 odatalen += 3;
1204 else
1205 odatalen += 2;
1206 }
1207 linelen++;
1208 odatalen++;
1209 in++;
1210 }
1211 }
1212 }
1213
Barry Warsaw23164a52004-05-11 02:05:11 +00001214 /* We allocate the output same size as input, this is overkill.
1215 * The previous implementation used calloc() so we'll zero out the
1216 * memory here too, since PyMem_Malloc() does not guarantee that.
1217 */
1218 odata = (unsigned char *) PyMem_Malloc(odatalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001219 if (odata == NULL) {
1220 PyErr_NoMemory();
1221 return NULL;
1222 }
Martin v. Löwisb600fe92004-07-27 15:03:53 +00001223 memset(odata, 0, odatalen);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001224
1225 in = out = linelen = 0;
1226 while (in < datalen) {
Tim Peters934c1a12002-07-02 22:24:50 +00001227 if ((data[in] > 126) ||
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001228 (data[in] == '=') ||
1229 (header && data[in] == '_') ||
1230 ((data[in] == '.') && (linelen == 1)) ||
1231 (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
1232 ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
Tim Peters934c1a12002-07-02 22:24:50 +00001233 ((data[in] < 33) &&
1234 (data[in] != '\r') && (data[in] != '\n') &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001235 (quotetabs && ((data[in] != '\t') || (data[in] != ' ')))))
1236 {
1237 if ((linelen + 3 )>= MAXLINESIZE) {
1238 odata[out++] = '=';
1239 if (crlf) odata[out++] = '\r';
1240 odata[out++] = '\n';
1241 linelen = 0;
1242 }
1243 odata[out++] = '=';
1244 to_hex(data[in], &odata[out]);
1245 out += 2;
1246 in++;
1247 linelen += 3;
1248 }
1249 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001250 if (istext &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001251 ((data[in] == '\n') ||
1252 ((in+1 < datalen) && (data[in] == '\r') &&
1253 (data[in+1] == '\n'))))
1254 {
1255 linelen = 0;
1256 /* Protect against whitespace on end of line */
1257 if (out && ((odata[out-1] == ' ') || (odata[out-1] == '\t'))) {
1258 ch = odata[out-1];
1259 odata[out-1] = '=';
1260 to_hex(ch, &odata[out]);
1261 out += 2;
1262 }
Tim Peters934c1a12002-07-02 22:24:50 +00001263
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001264 if (crlf) odata[out++] = '\r';
1265 odata[out++] = '\n';
1266 if (data[in] == '\r')
1267 in += 2;
1268 else
1269 in++;
1270 }
1271 else {
Tim Peters934c1a12002-07-02 22:24:50 +00001272 if ((in + 1 != datalen) &&
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001273 (data[in+1] != '\n') &&
1274 (linelen + 1) >= MAXLINESIZE) {
1275 odata[out++] = '=';
1276 if (crlf) odata[out++] = '\r';
1277 odata[out++] = '\n';
1278 linelen = 0;
1279 }
1280 linelen++;
1281 if (header && data[in] == ' ') {
1282 odata[out++] = '_';
1283 in++;
1284 }
1285 else {
1286 odata[out++] = data[in++];
1287 }
1288 }
1289 }
1290 }
Greg Warda645b302001-10-04 14:54:53 +00001291 if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
Barry Warsaw23164a52004-05-11 02:05:11 +00001292 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001293 return NULL;
1294 }
Barry Warsaw23164a52004-05-11 02:05:11 +00001295 PyMem_Free(odata);
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001296 return rv;
1297}
Barry Warsawe977c212000-08-15 06:07:13 +00001298
Jack Jansen72781191995-08-07 14:34:15 +00001299/* List of functions defined in the module */
1300
1301static struct PyMethodDef binascii_module_methods[] = {
Barry Warsawe977c212000-08-15 06:07:13 +00001302 {"a2b_uu", binascii_a2b_uu, METH_VARARGS, doc_a2b_uu},
1303 {"b2a_uu", binascii_b2a_uu, METH_VARARGS, doc_b2a_uu},
1304 {"a2b_base64", binascii_a2b_base64, METH_VARARGS, doc_a2b_base64},
1305 {"b2a_base64", binascii_b2a_base64, METH_VARARGS, doc_b2a_base64},
1306 {"a2b_hqx", binascii_a2b_hqx, METH_VARARGS, doc_a2b_hqx},
1307 {"b2a_hqx", binascii_b2a_hqx, METH_VARARGS, doc_b2a_hqx},
1308 {"b2a_hex", binascii_hexlify, METH_VARARGS, doc_hexlify},
1309 {"a2b_hex", binascii_unhexlify, METH_VARARGS, doc_unhexlify},
1310 {"hexlify", binascii_hexlify, METH_VARARGS, doc_hexlify},
1311 {"unhexlify", binascii_unhexlify, METH_VARARGS, doc_unhexlify},
1312 {"rlecode_hqx", binascii_rlecode_hqx, METH_VARARGS, doc_rlecode_hqx},
1313 {"rledecode_hqx", binascii_rledecode_hqx, METH_VARARGS,
1314 doc_rledecode_hqx},
1315 {"crc_hqx", binascii_crc_hqx, METH_VARARGS, doc_crc_hqx},
1316 {"crc32", binascii_crc32, METH_VARARGS, doc_crc32},
Tim Peters934c1a12002-07-02 22:24:50 +00001317 {"a2b_qp", (PyCFunction)binascii_a2b_qp, METH_VARARGS | METH_KEYWORDS,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001318 doc_a2b_qp},
Tim Peters934c1a12002-07-02 22:24:50 +00001319 {"b2a_qp", (PyCFunction)binascii_b2a_qp, METH_VARARGS | METH_KEYWORDS,
Martin v. Löwis16dc7f42001-09-30 20:32:11 +00001320 doc_b2a_qp},
Barry Warsawe977c212000-08-15 06:07:13 +00001321 {NULL, NULL} /* sentinel */
Jack Jansen72781191995-08-07 14:34:15 +00001322};
1323
1324
1325/* Initialization function for the module (*must* be called initbinascii) */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001326PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");
Jack Jansen72781191995-08-07 14:34:15 +00001327
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001328PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001329initbinascii(void)
Jack Jansen72781191995-08-07 14:34:15 +00001330{
1331 PyObject *m, *d, *x;
1332
1333 /* Create the module and add the functions */
1334 m = Py_InitModule("binascii", binascii_module_methods);
1335
1336 d = PyModule_GetDict(m);
1337 x = PyString_FromString(doc_binascii);
1338 PyDict_SetItemString(d, "__doc__", x);
Guido van Rossum5c159bd1997-08-04 23:55:25 +00001339 Py_XDECREF(x);
Jack Jansen72781191995-08-07 14:34:15 +00001340
Guido van Rossum7dbb48a1997-10-08 15:26:07 +00001341 Error = PyErr_NewException("binascii.Error", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +00001342 PyDict_SetItemString(d, "Error", Error);
Guido van Rossum7dbb48a1997-10-08 15:26:07 +00001343 Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
Jack Jansen72781191995-08-07 14:34:15 +00001344 PyDict_SetItemString(d, "Incomplete", Incomplete);
Jack Jansen72781191995-08-07 14:34:15 +00001345}