symbian-qemu-0.9.1-12/python-2.6.1/Modules/binascii.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     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.
       
    14 ** 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 '='.
       
    19 ** 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.
       
    45 **
       
    46 ** Added support for quoted-printable encoding, based on rfc 1521 et al
       
    47 ** quoted-printable encoding specifies that non printable characters (anything
       
    48 ** 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
       
    50 ** in a mail message with little difficulty (maximum line sizes, protecting
       
    51 ** some cases of whitespace, etc).
       
    52 **
       
    53 ** Brandon Long, September 2001.
       
    54 */
       
    55 
       
    56 #define PY_SSIZE_T_CLEAN
       
    57 
       
    58 #include "Python.h"
       
    59 #ifdef USE_ZLIB_CRC32
       
    60 #include "zlib.h"
       
    61 #endif
       
    62 
       
    63 static PyObject *Error;
       
    64 static PyObject *Incomplete;
       
    65 
       
    66 /*
       
    67 ** hqx lookup table, ascii->binary.
       
    68 */
       
    69 
       
    70 #define RUNCHAR 0x90
       
    71 
       
    72 #define DONE 0x7F
       
    73 #define SKIP 0x7E
       
    74 #define FAIL 0x7D
       
    75 
       
    76 static unsigned char table_a2b_hqx[256] = {
       
    77 /*       ^@    ^A    ^B    ^C    ^D    ^E    ^F    ^G   */
       
    78 /* 0*/	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
    79 /*       \b    \t    \n    ^K    ^L    \r    ^N    ^O   */
       
    80 /* 1*/	FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
       
    81 /*       ^P    ^Q    ^R    ^S    ^T    ^U    ^V    ^W   */
       
    82 /* 2*/	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
    83 /*       ^X    ^Y    ^Z    ^[    ^\    ^]    ^^    ^_   */
       
    84 /* 3*/	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
    85 /*              !     "     #     $     %     &     '   */
       
    86 /* 4*/	FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
       
    87 /*        (     )     *     +     ,     -     .     /   */
       
    88 /* 5*/	0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
       
    89 /*        0     1     2     3     4     5     6     7   */
       
    90 /* 6*/	0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
       
    91 /*        8     9     :     ;     <     =     >     ?   */
       
    92 /* 7*/	0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
       
    93 /*        @     A     B     C     D     E     F     G   */
       
    94 /* 8*/	0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
       
    95 /*        H     I     J     K     L     M     N     O   */
       
    96 /* 9*/	0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
       
    97 /*        P     Q     R     S     T     U     V     W   */
       
    98 /*10*/	0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
       
    99 /*        X     Y     Z     [     \     ]     ^     _   */
       
   100 /*11*/	0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
       
   101 /*        `     a     b     c     d     e     f     g   */
       
   102 /*12*/	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
       
   103 /*        h     i     j     k     l     m     n     o   */
       
   104 /*13*/	0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
       
   105 /*        p     q     r     s     t     u     v     w   */
       
   106 /*14*/	0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
       
   107 /*        x     y     z     {     |     }     ~    ^?   */
       
   108 /*15*/	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
   109 /*16*/	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 	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
   122 	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
   123 	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
   124 	FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
       
   125 };
       
   126 
       
   127 static unsigned char table_b2a_hqx[] =
       
   128 "!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";
       
   129 
       
   130 static char table_a2b_base64[] = {
       
   131 	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
   132 	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
   133 	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
       
   134 	52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */
       
   135 	-1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
       
   136 	15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
       
   137 	-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
       
   138 	41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
       
   139 };
       
   140 
       
   141 #define BASE64_PAD '='
       
   142 
       
   143 /* Max binary chunk size; limited only by available memory */
       
   144 #define BASE64_MAXBIN (PY_SSIZE_T_MAX/2 - sizeof(PyStringObject) - 3)
       
   145 
       
   146 static unsigned char table_b2a_base64[] =
       
   147 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
       
   148 
       
   149 
       
   150 
       
   151 static unsigned short crctab_hqx[256] = {
       
   152 	0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
       
   153 	0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
       
   154 	0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
       
   155 	0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
       
   156 	0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
       
   157 	0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
       
   158 	0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
       
   159 	0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
       
   160 	0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
       
   161 	0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
       
   162 	0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
       
   163 	0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
       
   164 	0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
       
   165 	0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
       
   166 	0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
       
   167 	0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
       
   168 	0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
       
   169 	0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
       
   170 	0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
       
   171 	0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
       
   172 	0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
       
   173 	0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
       
   174 	0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
       
   175 	0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
       
   176 	0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
       
   177 	0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
       
   178 	0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
       
   179 	0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
       
   180 	0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
       
   181 	0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
       
   182 	0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
       
   183 	0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
       
   184 };
       
   185 
       
   186 PyDoc_STRVAR(doc_a2b_uu, "(ascii) -> bin. Decode a line of uuencoded data");
       
   187 
       
   188 static PyObject *
       
   189 binascii_a2b_uu(PyObject *self, PyObject *args)
       
   190 {
       
   191 	unsigned char *ascii_data, *bin_data;
       
   192 	int leftbits = 0;
       
   193 	unsigned char this_ch;
       
   194 	unsigned int leftchar = 0;
       
   195 	PyObject *rv;
       
   196 	Py_ssize_t ascii_len, bin_len;
       
   197 
       
   198 	if ( !PyArg_ParseTuple(args, "t#:a2b_uu", &ascii_data, &ascii_len) )
       
   199 		return NULL;
       
   200 
       
   201 	assert(ascii_len >= 0);
       
   202 
       
   203 	/* First byte: binary data length (in bytes) */
       
   204 	bin_len = (*ascii_data++ - ' ') & 077;
       
   205 	ascii_len--;
       
   206 
       
   207 	/* Allocate the buffer */
       
   208 	if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
       
   209 		return NULL;
       
   210 	bin_data = (unsigned char *)PyString_AsString(rv);
       
   211 
       
   212 	for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
       
   213 		/* XXX is it really best to add NULs if there's no more data */
       
   214 		this_ch = (ascii_len > 0) ? *ascii_data : 0;
       
   215 		if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
       
   216 			/*
       
   217 			** Whitespace. Assume some spaces got eaten at
       
   218 			** end-of-line. (We check this later)
       
   219 			*/
       
   220 			this_ch = 0;
       
   221 	        } else {
       
   222 			/* Check the character for legality
       
   223 			** The 64 in stead of the expected 63 is because
       
   224 			** there are a few uuencodes out there that use
       
   225 			** '`' as zero instead of space.
       
   226 			*/
       
   227 			if ( this_ch < ' ' || this_ch > (' ' + 64)) {
       
   228 				PyErr_SetString(Error, "Illegal char");
       
   229 				Py_DECREF(rv);
       
   230 				return NULL;
       
   231 			}
       
   232 			this_ch = (this_ch - ' ') & 077;
       
   233 		}
       
   234 		/*
       
   235 		** Shift it in on the low end, and see if there's
       
   236 		** a byte ready for output.
       
   237 		*/
       
   238 		leftchar = (leftchar << 6) | (this_ch);
       
   239 		leftbits += 6;
       
   240 		if ( leftbits >= 8 ) {
       
   241 			leftbits -= 8;
       
   242 			*bin_data++ = (leftchar >> leftbits) & 0xff;
       
   243 			leftchar &= ((1 << leftbits) - 1);
       
   244 			bin_len--;
       
   245 		}
       
   246 	}
       
   247 	/*
       
   248 	** Finally, check that if there's anything left on the line
       
   249 	** that it's whitespace only.
       
   250 	*/
       
   251 	while( ascii_len-- > 0 ) {
       
   252 		this_ch = *ascii_data++;
       
   253 		/* Extra '`' may be written as padding in some cases */
       
   254 		if ( this_ch != ' ' && this_ch != ' '+64 &&
       
   255 		     this_ch != '\n' && this_ch != '\r' ) {
       
   256 			PyErr_SetString(Error, "Trailing garbage");
       
   257 			Py_DECREF(rv);
       
   258 			return NULL;
       
   259 		}
       
   260 	}
       
   261 	return rv;
       
   262 }
       
   263 
       
   264 PyDoc_STRVAR(doc_b2a_uu, "(bin) -> ascii. Uuencode line of data");
       
   265 
       
   266 static PyObject *
       
   267 binascii_b2a_uu(PyObject *self, PyObject *args)
       
   268 {
       
   269 	unsigned char *ascii_data, *bin_data;
       
   270 	int leftbits = 0;
       
   271 	unsigned char this_ch;
       
   272 	unsigned int leftchar = 0;
       
   273 	PyObject *rv;
       
   274 	Py_ssize_t bin_len;
       
   275 
       
   276 	if ( !PyArg_ParseTuple(args, "s#:b2a_uu", &bin_data, &bin_len) )
       
   277 		return NULL;
       
   278 	if ( bin_len > 45 ) {
       
   279 		/* The 45 is a limit that appears in all uuencode's */
       
   280 		PyErr_SetString(Error, "At most 45 bytes at once");
       
   281 		return NULL;
       
   282 	}
       
   283 
       
   284 	/* We're lazy and allocate to much (fixed up later) */
       
   285 	if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2+2)) == NULL )
       
   286 		return NULL;
       
   287 	ascii_data = (unsigned char *)PyString_AsString(rv);
       
   288 
       
   289 	/* Store the length */
       
   290 	*ascii_data++ = ' ' + (bin_len & 077);
       
   291 
       
   292 	for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
       
   293 		/* Shift the data (or padding) into our buffer */
       
   294 		if ( bin_len > 0 )	/* Data */
       
   295 			leftchar = (leftchar << 8) | *bin_data;
       
   296 		else			/* Padding */
       
   297 			leftchar <<= 8;
       
   298 		leftbits += 8;
       
   299 
       
   300 		/* See if there are 6-bit groups ready */
       
   301 		while ( leftbits >= 6 ) {
       
   302 			this_ch = (leftchar >> (leftbits-6)) & 0x3f;
       
   303 			leftbits -= 6;
       
   304 			*ascii_data++ = this_ch + ' ';
       
   305 		}
       
   306 	}
       
   307 	*ascii_data++ = '\n';	/* Append a courtesy newline */
       
   308 
       
   309 	_PyString_Resize(&rv, (ascii_data -
       
   310 			       (unsigned char *)PyString_AsString(rv)));
       
   311 	return rv;
       
   312 }
       
   313 
       
   314 
       
   315 static int
       
   316 binascii_find_valid(unsigned char *s, Py_ssize_t slen, int num)
       
   317 {
       
   318 	/* Finds & returns the (num+1)th
       
   319 	** valid character for base64, or -1 if none.
       
   320 	*/
       
   321 
       
   322 	int ret = -1;
       
   323 	unsigned char c, b64val;
       
   324 
       
   325 	while ((slen > 0) && (ret == -1)) {
       
   326 		c = *s;
       
   327 		b64val = table_a2b_base64[c & 0x7f];
       
   328 		if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
       
   329 			if (num == 0)
       
   330 				ret = *s;
       
   331 			num--;
       
   332 		}
       
   333 
       
   334 		s++;
       
   335 		slen--;
       
   336 	}
       
   337 	return ret;
       
   338 }
       
   339 
       
   340 PyDoc_STRVAR(doc_a2b_base64, "(ascii) -> bin. Decode a line of base64 data");
       
   341 
       
   342 static PyObject *
       
   343 binascii_a2b_base64(PyObject *self, PyObject *args)
       
   344 {
       
   345 	unsigned char *ascii_data, *bin_data;
       
   346 	int leftbits = 0;
       
   347 	unsigned char this_ch;
       
   348 	unsigned int leftchar = 0;
       
   349 	PyObject *rv;
       
   350 	Py_ssize_t ascii_len, bin_len;
       
   351 	int quad_pos = 0;
       
   352 
       
   353 	if ( !PyArg_ParseTuple(args, "t#:a2b_base64", &ascii_data, &ascii_len) )
       
   354 		return NULL;
       
   355 
       
   356 	assert(ascii_len >= 0);
       
   357 
       
   358 	if (ascii_len > PY_SSIZE_T_MAX - 3)
       
   359 		return PyErr_NoMemory();
       
   360 
       
   361 	bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
       
   362 
       
   363 	/* Allocate the buffer */
       
   364 	if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL )
       
   365 		return NULL;
       
   366 	bin_data = (unsigned char *)PyString_AsString(rv);
       
   367 	bin_len = 0;
       
   368 
       
   369 	for( ; ascii_len > 0; ascii_len--, ascii_data++) {
       
   370 		this_ch = *ascii_data;
       
   371 
       
   372 		if (this_ch > 0x7f ||
       
   373 		    this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
       
   374 			continue;
       
   375 
       
   376 		/* Check for pad sequences and ignore
       
   377 		** the invalid ones.
       
   378 		*/
       
   379 		if (this_ch == BASE64_PAD) {
       
   380 			if ( (quad_pos < 2) ||
       
   381 			     ((quad_pos == 2) &&
       
   382 			      (binascii_find_valid(ascii_data, ascii_len, 1)
       
   383 			       != BASE64_PAD)) )
       
   384 			{
       
   385 				continue;
       
   386 			}
       
   387 			else {
       
   388 				/* A pad sequence means no more input.
       
   389 				** We've already interpreted the data
       
   390 				** from the quad at this point.
       
   391 				*/
       
   392 				leftbits = 0;
       
   393 				break;
       
   394 			}
       
   395 		}
       
   396 
       
   397 		this_ch = table_a2b_base64[*ascii_data];
       
   398 		if ( this_ch == (unsigned char) -1 )
       
   399 			continue;
       
   400 
       
   401 		/*
       
   402 		** Shift it in on the low end, and see if there's
       
   403 		** a byte ready for output.
       
   404 		*/
       
   405 		quad_pos = (quad_pos + 1) & 0x03;
       
   406 		leftchar = (leftchar << 6) | (this_ch);
       
   407 		leftbits += 6;
       
   408 
       
   409 		if ( leftbits >= 8 ) {
       
   410 			leftbits -= 8;
       
   411 			*bin_data++ = (leftchar >> leftbits) & 0xff;
       
   412 			bin_len++;
       
   413 			leftchar &= ((1 << leftbits) - 1);
       
   414 		}
       
   415  	}
       
   416 
       
   417 	if (leftbits != 0) {
       
   418 		PyErr_SetString(Error, "Incorrect padding");
       
   419 		Py_DECREF(rv);
       
   420 		return NULL;
       
   421 	}
       
   422 
       
   423 	/* And set string size correctly. If the result string is empty
       
   424 	** (because the input was all invalid) return the shared empty
       
   425 	** string instead; _PyString_Resize() won't do this for us.
       
   426 	*/
       
   427 	if (bin_len > 0)
       
   428 		_PyString_Resize(&rv, bin_len);
       
   429 	else {
       
   430 		Py_DECREF(rv);
       
   431 		rv = PyString_FromString("");
       
   432 	}
       
   433 	return rv;
       
   434 }
       
   435 
       
   436 PyDoc_STRVAR(doc_b2a_base64, "(bin) -> ascii. Base64-code line of data");
       
   437 
       
   438 static PyObject *
       
   439 binascii_b2a_base64(PyObject *self, PyObject *args)
       
   440 {
       
   441 	unsigned char *ascii_data, *bin_data;
       
   442 	int leftbits = 0;
       
   443 	unsigned char this_ch;
       
   444 	unsigned int leftchar = 0;
       
   445 	PyObject *rv;
       
   446 	Py_ssize_t bin_len;
       
   447 
       
   448 	if ( !PyArg_ParseTuple(args, "s#:b2a_base64", &bin_data, &bin_len) )
       
   449 		return NULL;
       
   450 
       
   451 	assert(bin_len >= 0);
       
   452 
       
   453 	if ( bin_len > BASE64_MAXBIN ) {
       
   454 		PyErr_SetString(Error, "Too much data for base64 line");
       
   455 		return NULL;
       
   456 	}
       
   457 
       
   458 	/* We're lazy and allocate too much (fixed up later).
       
   459 	   "+3" leaves room for up to two pad characters and a trailing
       
   460 	   newline.  Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */
       
   461 	if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL )
       
   462 		return NULL;
       
   463 	ascii_data = (unsigned char *)PyString_AsString(rv);
       
   464 
       
   465 	for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
       
   466 		/* Shift the data into our buffer */
       
   467 		leftchar = (leftchar << 8) | *bin_data;
       
   468 		leftbits += 8;
       
   469 
       
   470 		/* See if there are 6-bit groups ready */
       
   471 		while ( leftbits >= 6 ) {
       
   472 			this_ch = (leftchar >> (leftbits-6)) & 0x3f;
       
   473 			leftbits -= 6;
       
   474 			*ascii_data++ = table_b2a_base64[this_ch];
       
   475 		}
       
   476 	}
       
   477 	if ( leftbits == 2 ) {
       
   478 		*ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
       
   479 		*ascii_data++ = BASE64_PAD;
       
   480 		*ascii_data++ = BASE64_PAD;
       
   481 	} else if ( leftbits == 4 ) {
       
   482 		*ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
       
   483 		*ascii_data++ = BASE64_PAD;
       
   484 	}
       
   485 	*ascii_data++ = '\n';	/* Append a courtesy newline */
       
   486 
       
   487 	_PyString_Resize(&rv, (ascii_data -
       
   488 			       (unsigned char *)PyString_AsString(rv)));
       
   489 	return rv;
       
   490 }
       
   491 
       
   492 PyDoc_STRVAR(doc_a2b_hqx, "ascii -> bin, done. Decode .hqx coding");
       
   493 
       
   494 static PyObject *
       
   495 binascii_a2b_hqx(PyObject *self, PyObject *args)
       
   496 {
       
   497 	unsigned char *ascii_data, *bin_data;
       
   498 	int leftbits = 0;
       
   499 	unsigned char this_ch;
       
   500 	unsigned int leftchar = 0;
       
   501 	PyObject *rv;
       
   502 	Py_ssize_t len;
       
   503 	int done = 0;
       
   504 
       
   505 	if ( !PyArg_ParseTuple(args, "t#:a2b_hqx", &ascii_data, &len) )
       
   506 		return NULL;
       
   507 
       
   508 	assert(len >= 0);
       
   509 
       
   510 	if (len > PY_SSIZE_T_MAX - 2)
       
   511 		return PyErr_NoMemory();
       
   512 
       
   513 	/* Allocate a string that is too big (fixed later) 
       
   514 	   Add two to the initial length to prevent interning which
       
   515 	   would preclude subsequent resizing.  */
       
   516 	if ( (rv=PyString_FromStringAndSize(NULL, len+2)) == NULL )
       
   517 		return NULL;
       
   518 	bin_data = (unsigned char *)PyString_AsString(rv);
       
   519 
       
   520 	for( ; len > 0 ; len--, ascii_data++ ) {
       
   521 		/* Get the byte and look it up */
       
   522 		this_ch = table_a2b_hqx[*ascii_data];
       
   523 		if ( this_ch == SKIP )
       
   524 			continue;
       
   525 		if ( this_ch == FAIL ) {
       
   526 			PyErr_SetString(Error, "Illegal char");
       
   527 			Py_DECREF(rv);
       
   528 			return NULL;
       
   529 		}
       
   530 		if ( this_ch == DONE ) {
       
   531 			/* The terminating colon */
       
   532 			done = 1;
       
   533 			break;
       
   534 		}
       
   535 
       
   536 		/* Shift it into the buffer and see if any bytes are ready */
       
   537 		leftchar = (leftchar << 6) | (this_ch);
       
   538 		leftbits += 6;
       
   539 		if ( leftbits >= 8 ) {
       
   540 			leftbits -= 8;
       
   541 			*bin_data++ = (leftchar >> leftbits) & 0xff;
       
   542 			leftchar &= ((1 << leftbits) - 1);
       
   543 		}
       
   544 	}
       
   545 
       
   546 	if ( leftbits && !done ) {
       
   547 		PyErr_SetString(Incomplete,
       
   548 				"String has incomplete number of bytes");
       
   549 		Py_DECREF(rv);
       
   550 		return NULL;
       
   551 	}
       
   552 	_PyString_Resize(
       
   553 		&rv, (bin_data - (unsigned char *)PyString_AsString(rv)));
       
   554 	if (rv) {
       
   555 		PyObject *rrv = Py_BuildValue("Oi", rv, done);
       
   556 		Py_DECREF(rv);
       
   557 		return rrv;
       
   558 	}
       
   559 
       
   560 	return NULL;
       
   561 }
       
   562 
       
   563 PyDoc_STRVAR(doc_rlecode_hqx, "Binhex RLE-code binary data");
       
   564 
       
   565 static PyObject *
       
   566 binascii_rlecode_hqx(PyObject *self, PyObject *args)
       
   567 {
       
   568 	unsigned char *in_data, *out_data;
       
   569 	PyObject *rv;
       
   570 	unsigned char ch;
       
   571 	Py_ssize_t in, inend, len;
       
   572 
       
   573 	if ( !PyArg_ParseTuple(args, "s#:rlecode_hqx", &in_data, &len) )
       
   574 		return NULL;
       
   575 
       
   576 	assert(len >= 0);
       
   577 
       
   578 	if (len > PY_SSIZE_T_MAX / 2 - 2)
       
   579 		return PyErr_NoMemory();
       
   580 
       
   581 	/* Worst case: output is twice as big as input (fixed later) */
       
   582 	if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL )
       
   583 		return NULL;
       
   584 	out_data = (unsigned char *)PyString_AsString(rv);
       
   585 
       
   586 	for( in=0; in<len; in++) {
       
   587 		ch = in_data[in];
       
   588 		if ( ch == RUNCHAR ) {
       
   589 			/* RUNCHAR. Escape it. */
       
   590 			*out_data++ = RUNCHAR;
       
   591 			*out_data++ = 0;
       
   592 		} else {
       
   593 			/* Check how many following are the same */
       
   594 			for(inend=in+1;
       
   595 			    inend<len && in_data[inend] == ch &&
       
   596 				    inend < in+255;
       
   597 			    inend++) ;
       
   598 			if ( inend - in > 3 ) {
       
   599 				/* More than 3 in a row. Output RLE. */
       
   600 				*out_data++ = ch;
       
   601 				*out_data++ = RUNCHAR;
       
   602 				*out_data++ = inend-in;
       
   603 				in = inend-1;
       
   604 			} else {
       
   605 				/* Less than 3. Output the byte itself */
       
   606 				*out_data++ = ch;
       
   607 			}
       
   608 		}
       
   609 	}
       
   610 	_PyString_Resize(&rv, (out_data -
       
   611 			       (unsigned char *)PyString_AsString(rv)));
       
   612 	return rv;
       
   613 }
       
   614 
       
   615 PyDoc_STRVAR(doc_b2a_hqx, "Encode .hqx data");
       
   616 
       
   617 static PyObject *
       
   618 binascii_b2a_hqx(PyObject *self, PyObject *args)
       
   619 {
       
   620 	unsigned char *ascii_data, *bin_data;
       
   621 	int leftbits = 0;
       
   622 	unsigned char this_ch;
       
   623 	unsigned int leftchar = 0;
       
   624 	PyObject *rv;
       
   625 	Py_ssize_t len;
       
   626 
       
   627 	if ( !PyArg_ParseTuple(args, "s#:b2a_hqx", &bin_data, &len) )
       
   628 		return NULL;
       
   629 
       
   630 	assert(len >= 0);
       
   631 
       
   632 	if (len > PY_SSIZE_T_MAX / 2 - 2)
       
   633 		return PyErr_NoMemory();
       
   634 
       
   635 	/* Allocate a buffer that is at least large enough */
       
   636 	if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL )
       
   637 		return NULL;
       
   638 	ascii_data = (unsigned char *)PyString_AsString(rv);
       
   639 
       
   640 	for( ; len > 0 ; len--, bin_data++ ) {
       
   641 		/* Shift into our buffer, and output any 6bits ready */
       
   642 		leftchar = (leftchar << 8) | *bin_data;
       
   643 		leftbits += 8;
       
   644 		while ( leftbits >= 6 ) {
       
   645 			this_ch = (leftchar >> (leftbits-6)) & 0x3f;
       
   646 			leftbits -= 6;
       
   647 			*ascii_data++ = table_b2a_hqx[this_ch];
       
   648 		}
       
   649 	}
       
   650 	/* Output a possible runt byte */
       
   651 	if ( leftbits ) {
       
   652 		leftchar <<= (6-leftbits);
       
   653 		*ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
       
   654 	}
       
   655 	_PyString_Resize(&rv, (ascii_data -
       
   656 			       (unsigned char *)PyString_AsString(rv)));
       
   657 	return rv;
       
   658 }
       
   659 
       
   660 PyDoc_STRVAR(doc_rledecode_hqx, "Decode hexbin RLE-coded string");
       
   661 
       
   662 static PyObject *
       
   663 binascii_rledecode_hqx(PyObject *self, PyObject *args)
       
   664 {
       
   665 	unsigned char *in_data, *out_data;
       
   666 	unsigned char in_byte, in_repeat;
       
   667 	PyObject *rv;
       
   668 	Py_ssize_t in_len, out_len, out_len_left;
       
   669 
       
   670 	if ( !PyArg_ParseTuple(args, "s#:rledecode_hqx", &in_data, &in_len) )
       
   671 		return NULL;
       
   672 
       
   673 	assert(in_len >= 0);
       
   674 
       
   675 	/* Empty string is a special case */
       
   676 	if ( in_len == 0 )
       
   677 		return PyString_FromString("");
       
   678     else if (in_len > PY_SSIZE_T_MAX / 2)
       
   679         return PyErr_NoMemory();
       
   680 
       
   681 	/* Allocate a buffer of reasonable size. Resized when needed */
       
   682 	out_len = in_len*2;
       
   683 	if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL )
       
   684 		return NULL;
       
   685 	out_len_left = out_len;
       
   686 	out_data = (unsigned char *)PyString_AsString(rv);
       
   687 
       
   688 	/*
       
   689 	** We need two macros here to get/put bytes and handle
       
   690 	** end-of-buffer for input and output strings.
       
   691 	*/
       
   692 #define INBYTE(b) \
       
   693 	do { \
       
   694 	         if ( --in_len < 0 ) { \
       
   695 			   PyErr_SetString(Incomplete, ""); \
       
   696 			   Py_DECREF(rv); \
       
   697 			   return NULL; \
       
   698 		 } \
       
   699 		 b = *in_data++; \
       
   700 	} while(0)
       
   701 
       
   702 #define OUTBYTE(b) \
       
   703 	do { \
       
   704 		 if ( --out_len_left < 0 ) { \
       
   705 			  if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \
       
   706 			  _PyString_Resize(&rv, 2*out_len); \
       
   707 			  if ( rv == NULL ) return NULL; \
       
   708 			  out_data = (unsigned char *)PyString_AsString(rv) \
       
   709 								 + out_len; \
       
   710 			  out_len_left = out_len-1; \
       
   711 			  out_len = out_len * 2; \
       
   712 		 } \
       
   713 		 *out_data++ = b; \
       
   714 	} while(0)
       
   715 
       
   716 		/*
       
   717 		** Handle first byte separately (since we have to get angry
       
   718 		** in case of an orphaned RLE code).
       
   719 		*/
       
   720 		INBYTE(in_byte);
       
   721 
       
   722 	if (in_byte == RUNCHAR) {
       
   723 		INBYTE(in_repeat);
       
   724 		if (in_repeat != 0) {
       
   725 			/* Note Error, not Incomplete (which is at the end
       
   726 			** of the string only). This is a programmer error.
       
   727 			*/
       
   728 			PyErr_SetString(Error, "Orphaned RLE code at start");
       
   729 			Py_DECREF(rv);
       
   730 			return NULL;
       
   731 		}
       
   732 		OUTBYTE(RUNCHAR);
       
   733 	} else {
       
   734 		OUTBYTE(in_byte);
       
   735 	}
       
   736 
       
   737 	while( in_len > 0 ) {
       
   738 		INBYTE(in_byte);
       
   739 
       
   740 		if (in_byte == RUNCHAR) {
       
   741 			INBYTE(in_repeat);
       
   742 			if ( in_repeat == 0 ) {
       
   743 				/* Just an escaped RUNCHAR value */
       
   744 				OUTBYTE(RUNCHAR);
       
   745 			} else {
       
   746 				/* Pick up value and output a sequence of it */
       
   747 				in_byte = out_data[-1];
       
   748 				while ( --in_repeat > 0 )
       
   749 					OUTBYTE(in_byte);
       
   750 			}
       
   751 		} else {
       
   752 			/* Normal byte */
       
   753 			OUTBYTE(in_byte);
       
   754 		}
       
   755 	}
       
   756 	_PyString_Resize(&rv, (out_data -
       
   757 			       (unsigned char *)PyString_AsString(rv)));
       
   758 	return rv;
       
   759 }
       
   760 
       
   761 PyDoc_STRVAR(doc_crc_hqx,
       
   762 "(data, oldcrc) -> newcrc. Compute hqx CRC incrementally");
       
   763 
       
   764 static PyObject *
       
   765 binascii_crc_hqx(PyObject *self, PyObject *args)
       
   766 {
       
   767 	unsigned char *bin_data;
       
   768 	unsigned int crc;
       
   769 	Py_ssize_t len;
       
   770 
       
   771 	if ( !PyArg_ParseTuple(args, "s#i:crc_hqx", &bin_data, &len, &crc) )
       
   772 		return NULL;
       
   773 
       
   774 	while(len-- > 0) {
       
   775 		crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
       
   776 	}
       
   777 
       
   778 	return Py_BuildValue("i", crc);
       
   779 }
       
   780 
       
   781 PyDoc_STRVAR(doc_crc32,
       
   782 "(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");
       
   783 
       
   784 #ifdef USE_ZLIB_CRC32
       
   785 /* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */
       
   786 static PyObject *
       
   787 binascii_crc32(PyObject *self, PyObject *args)
       
   788 {
       
   789     unsigned int crc32val = 0;  /* crc32(0L, Z_NULL, 0) */
       
   790     Byte *buf;
       
   791     Py_ssize_t len;
       
   792     int signed_val;
       
   793 
       
   794     if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
       
   795 	return NULL;
       
   796     /* In Python 2.x we return a signed integer regardless of native platform
       
   797      * long size (the 32bit unsigned long is treated as 32-bit signed and sign
       
   798      * extended into a 64-bit long inside the integer object).  3.0 does the
       
   799      * right thing and returns unsigned. http://bugs.python.org/issue1202 */
       
   800     signed_val = crc32(crc32val, buf, len);
       
   801     return PyInt_FromLong(signed_val);
       
   802 }
       
   803 #else  /* USE_ZLIB_CRC32 */
       
   804 /*  Crc - 32 BIT ANSI X3.66 CRC checksum files
       
   805     Also known as: ISO 3307
       
   806 **********************************************************************|
       
   807 *                                                                    *|
       
   808 * Demonstration program to compute the 32-bit CRC used as the frame  *|
       
   809 * check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|
       
   810 * and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|
       
   811 * protocol).  The 32-bit FCS was added via the Federal Register,     *|
       
   812 * 1 June 1982, p.23798.  I presume but don't know for certain that   *|
       
   813 * this polynomial is or will be included in CCITT V.41, which        *|
       
   814 * defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|
       
   815 * PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|
       
   816 * errors by a factor of 10^-5 over 16-bit FCS.                       *|
       
   817 *                                                                    *|
       
   818 **********************************************************************|
       
   819 
       
   820  Copyright (C) 1986 Gary S. Brown.  You may use this program, or
       
   821  code or tables extracted from it, as desired without restriction.
       
   822 
       
   823  First, the polynomial itself and its table of feedback terms.  The
       
   824  polynomial is
       
   825  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
       
   826  Note that we take it "backwards" and put the highest-order term in
       
   827  the lowest-order bit.  The X^32 term is "implied"; the LSB is the
       
   828  X^31 term, etc.  The X^0 term (usually shown as "+1") results in
       
   829  the MSB being 1.
       
   830 
       
   831  Note that the usual hardware shift register implementation, which
       
   832  is what we're using (we're merely optimizing it by doing eight-bit
       
   833  chunks at a time) shifts bits into the lowest-order term.  In our
       
   834  implementation, that means shifting towards the right.  Why do we
       
   835  do it this way?  Because the calculated CRC must be transmitted in
       
   836  order from highest-order term to lowest-order term.  UARTs transmit
       
   837  characters in order from LSB to MSB.  By storing the CRC this way,
       
   838  we hand it to the UART in the order low-byte to high-byte; the UART
       
   839  sends each low-bit to hight-bit; and the result is transmission bit
       
   840  by bit from highest- to lowest-order term without requiring any bit
       
   841  shuffling on our part.  Reception works similarly.
       
   842 
       
   843  The feedback terms table consists of 256, 32-bit entries.  Notes:
       
   844 
       
   845   1. The table can be generated at runtime if desired; code to do so
       
   846      is shown later.  It might not be obvious, but the feedback
       
   847      terms simply represent the results of eight shift/xor opera-
       
   848      tions for all combinations of data and CRC register values.
       
   849 
       
   850   2. The CRC accumulation logic is the same for all CRC polynomials,
       
   851      be they sixteen or thirty-two bits wide.  You simply choose the
       
   852      appropriate table.  Alternatively, because the table can be
       
   853      generated at runtime, you can start by generating the table for
       
   854      the polynomial in question and use exactly the same "updcrc",
       
   855      if your application needn't simultaneously handle two CRC
       
   856      polynomials.  (Note, however, that XMODEM is strange.)
       
   857 
       
   858   3. For 16-bit CRCs, the table entries need be only 16 bits wide;
       
   859      of course, 32-bit entries work OK if the high 16 bits are zero.
       
   860 
       
   861   4. The values must be right-shifted by eight bits by the "updcrc"
       
   862      logic; the shift must be unsigned (bring in zeroes).  On some
       
   863      hardware you could probably optimize the shift in assembler by
       
   864      using byte-swap instructions.
       
   865 ********************************************************************/
       
   866 
       
   867 static unsigned int crc_32_tab[256] = {
       
   868 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U,
       
   869 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U,
       
   870 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U,
       
   871 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU,
       
   872 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U,
       
   873 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U,
       
   874 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U,
       
   875 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU,
       
   876 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U,
       
   877 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU,
       
   878 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U,
       
   879 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U,
       
   880 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U,
       
   881 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU,
       
   882 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU,
       
   883 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U,
       
   884 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU,
       
   885 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U,
       
   886 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U,
       
   887 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U,
       
   888 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU,
       
   889 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U,
       
   890 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U,
       
   891 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU,
       
   892 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U,
       
   893 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U,
       
   894 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U,
       
   895 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U,
       
   896 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U,
       
   897 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU,
       
   898 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU,
       
   899 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U,
       
   900 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U,
       
   901 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU,
       
   902 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU,
       
   903 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U,
       
   904 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU,
       
   905 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U,
       
   906 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU,
       
   907 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U,
       
   908 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU,
       
   909 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U,
       
   910 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U,
       
   911 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU,
       
   912 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U,
       
   913 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U,
       
   914 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U,
       
   915 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U,
       
   916 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U,
       
   917 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U,
       
   918 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU,
       
   919 0x2d02ef8dU
       
   920 };
       
   921 
       
   922 static PyObject *
       
   923 binascii_crc32(PyObject *self, PyObject *args)
       
   924 { /* By Jim Ahlstrom; All rights transferred to CNRI */
       
   925 	unsigned char *bin_data;
       
   926 	unsigned int crc = 0U;	/* initial value of CRC */
       
   927 	Py_ssize_t len;
       
   928 	int result;
       
   929 
       
   930 	if ( !PyArg_ParseTuple(args, "s#|I:crc32", &bin_data, &len, &crc) )
       
   931 		return NULL;
       
   932 
       
   933 	crc = ~ crc;
       
   934 	while (len-- > 0)
       
   935 		crc = crc_32_tab[(crc ^ *bin_data++) & 0xffU] ^ (crc >> 8);
       
   936 		/* Note:  (crc >> 8) MUST zero fill on left */
       
   937 
       
   938 	result = (int)(crc ^ 0xFFFFFFFFU);
       
   939 	return PyInt_FromLong(result);
       
   940 }
       
   941 #endif  /* USE_ZLIB_CRC32 */
       
   942 
       
   943 
       
   944 static PyObject *
       
   945 binascii_hexlify(PyObject *self, PyObject *args)
       
   946 {
       
   947 	char* argbuf;
       
   948 	Py_ssize_t arglen;
       
   949 	PyObject *retval;
       
   950 	char* retbuf;
       
   951 	Py_ssize_t i, j;
       
   952 
       
   953 	if (!PyArg_ParseTuple(args, "s#:b2a_hex", &argbuf, &arglen))
       
   954 		return NULL;
       
   955 
       
   956 	assert(arglen >= 0);
       
   957 	if (arglen > PY_SSIZE_T_MAX / 2)
       
   958 		return PyErr_NoMemory();
       
   959 
       
   960 	retval = PyString_FromStringAndSize(NULL, arglen*2);
       
   961 	if (!retval)
       
   962 		return NULL;
       
   963 	retbuf = PyString_AsString(retval);
       
   964 	if (!retbuf)
       
   965 		goto finally;
       
   966 
       
   967 	/* make hex version of string, taken from shamodule.c */
       
   968 	for (i=j=0; i < arglen; i++) {
       
   969 		char c;
       
   970 		c = (argbuf[i] >> 4) & 0xf;
       
   971 		c = (c>9) ? c+'a'-10 : c + '0';
       
   972 		retbuf[j++] = c;
       
   973 		c = argbuf[i] & 0xf;
       
   974 		c = (c>9) ? c+'a'-10 : c + '0';
       
   975 		retbuf[j++] = c;
       
   976 	}
       
   977 	return retval;
       
   978 
       
   979   finally:
       
   980 	Py_DECREF(retval);
       
   981 	return NULL;
       
   982 }
       
   983 
       
   984 PyDoc_STRVAR(doc_hexlify,
       
   985 "b2a_hex(data) -> s; Hexadecimal representation of binary data.\n\
       
   986 \n\
       
   987 This function is also available as \"hexlify()\".");
       
   988 
       
   989 
       
   990 static int
       
   991 to_int(int c)
       
   992 {
       
   993 	if (isdigit(c))
       
   994 		return c - '0';
       
   995 	else {
       
   996 		if (isupper(c))
       
   997 			c = tolower(c);
       
   998 		if (c >= 'a' && c <= 'f')
       
   999 			return c - 'a' + 10;
       
  1000 	}
       
  1001 	return -1;
       
  1002 }
       
  1003 
       
  1004 
       
  1005 static PyObject *
       
  1006 binascii_unhexlify(PyObject *self, PyObject *args)
       
  1007 {
       
  1008 	char* argbuf;
       
  1009 	Py_ssize_t arglen;
       
  1010 	PyObject *retval;
       
  1011 	char* retbuf;
       
  1012 	Py_ssize_t i, j;
       
  1013 
       
  1014 	if (!PyArg_ParseTuple(args, "s#:a2b_hex", &argbuf, &arglen))
       
  1015 		return NULL;
       
  1016 
       
  1017 	assert(arglen >= 0);
       
  1018 
       
  1019 	/* XXX What should we do about strings with an odd length?  Should
       
  1020 	 * we add an implicit leading zero, or a trailing zero?  For now,
       
  1021 	 * raise an exception.
       
  1022 	 */
       
  1023 	if (arglen % 2) {
       
  1024 		PyErr_SetString(PyExc_TypeError, "Odd-length string");
       
  1025 		return NULL;
       
  1026 	}
       
  1027 
       
  1028 	retval = PyString_FromStringAndSize(NULL, (arglen/2));
       
  1029 	if (!retval)
       
  1030 		return NULL;
       
  1031 	retbuf = PyString_AsString(retval);
       
  1032 	if (!retbuf)
       
  1033 		goto finally;
       
  1034 
       
  1035 	for (i=j=0; i < arglen; i += 2) {
       
  1036 		int top = to_int(Py_CHARMASK(argbuf[i]));
       
  1037 		int bot = to_int(Py_CHARMASK(argbuf[i+1]));
       
  1038 		if (top == -1 || bot == -1) {
       
  1039 			PyErr_SetString(PyExc_TypeError,
       
  1040 					"Non-hexadecimal digit found");
       
  1041 			goto finally;
       
  1042 		}
       
  1043 		retbuf[j++] = (top << 4) + bot;
       
  1044 	}
       
  1045 	return retval;
       
  1046 
       
  1047   finally:
       
  1048 	Py_DECREF(retval);
       
  1049 	return NULL;
       
  1050 }
       
  1051 
       
  1052 PyDoc_STRVAR(doc_unhexlify,
       
  1053 "a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n\
       
  1054 \n\
       
  1055 hexstr must contain an even number of hex digits (upper or lower case).\n\
       
  1056 This function is also available as \"unhexlify()\"");
       
  1057 
       
  1058 static int table_hex[128] = {
       
  1059   -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
  1060   -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
  1061   -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
  1062    0, 1, 2, 3,  4, 5, 6, 7,  8, 9,-1,-1, -1,-1,-1,-1,
       
  1063   -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
  1064   -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
  1065   -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
       
  1066   -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
       
  1067 };
       
  1068 
       
  1069 #define hexval(c) table_hex[(unsigned int)(c)]
       
  1070 
       
  1071 #define MAXLINESIZE 76
       
  1072 
       
  1073 PyDoc_STRVAR(doc_a2b_qp, "Decode a string of qp-encoded data");
       
  1074 
       
  1075 static PyObject*
       
  1076 binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
       
  1077 {
       
  1078 	Py_ssize_t in, out;
       
  1079 	char ch;
       
  1080 	unsigned char *data, *odata;
       
  1081 	Py_ssize_t datalen = 0;
       
  1082 	PyObject *rv;
       
  1083 	static char *kwlist[] = {"data", "header", NULL};
       
  1084 	int header = 0;
       
  1085 
       
  1086 	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|i", kwlist, &data,
       
  1087 	      &datalen, &header))
       
  1088 		return NULL;
       
  1089 
       
  1090 	/* We allocate the output same size as input, this is overkill.
       
  1091 	 * The previous implementation used calloc() so we'll zero out the
       
  1092 	 * memory here too, since PyMem_Malloc() does not guarantee that.
       
  1093 	 */
       
  1094 	odata = (unsigned char *) PyMem_Malloc(datalen);
       
  1095 	if (odata == NULL) {
       
  1096 		PyErr_NoMemory();
       
  1097 		return NULL;
       
  1098 	}
       
  1099 	memset(odata, 0, datalen);
       
  1100 
       
  1101 	in = out = 0;
       
  1102 	while (in < datalen) {
       
  1103 		if (data[in] == '=') {
       
  1104 			in++;
       
  1105 			if (in >= datalen) break;
       
  1106 			/* Soft line breaks */
       
  1107 			if ((data[in] == '\n') || (data[in] == '\r')) {
       
  1108 				if (data[in] != '\n') {
       
  1109 					while (in < datalen && data[in] != '\n') in++;
       
  1110 				}
       
  1111 				if (in < datalen) in++;
       
  1112 			}
       
  1113 			else if (data[in] == '=') {
       
  1114 				/* broken case from broken python qp */
       
  1115 				odata[out++] = '=';
       
  1116 				in++;
       
  1117 			}
       
  1118 			else if (((data[in] >= 'A' && data[in] <= 'F') ||
       
  1119 			          (data[in] >= 'a' && data[in] <= 'f') ||
       
  1120 				  (data[in] >= '0' && data[in] <= '9')) &&
       
  1121 			         ((data[in+1] >= 'A' && data[in+1] <= 'F') ||
       
  1122 				  (data[in+1] >= 'a' && data[in+1] <= 'f') ||
       
  1123 				  (data[in+1] >= '0' && data[in+1] <= '9'))) {
       
  1124 				/* hexval */
       
  1125 				ch = hexval(data[in]) << 4;
       
  1126 				in++;
       
  1127 				ch |= hexval(data[in]);
       
  1128 				in++;
       
  1129 				odata[out++] = ch;
       
  1130 			}
       
  1131 			else {
       
  1132 			  odata[out++] = '=';
       
  1133 			}
       
  1134 		}
       
  1135 		else if (header && data[in] == '_') {
       
  1136 			odata[out++] = ' ';
       
  1137 			in++;
       
  1138 		}
       
  1139 		else {
       
  1140 			odata[out] = data[in];
       
  1141 			in++;
       
  1142 			out++;
       
  1143 		}
       
  1144 	}
       
  1145 	if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
       
  1146 		PyMem_Free(odata);
       
  1147 		return NULL;
       
  1148 	}
       
  1149 	PyMem_Free(odata);
       
  1150 	return rv;
       
  1151 }
       
  1152 
       
  1153 static int
       
  1154 to_hex (unsigned char ch, unsigned char *s)
       
  1155 {
       
  1156 	unsigned int uvalue = ch;
       
  1157 
       
  1158 	s[1] = "0123456789ABCDEF"[uvalue % 16];
       
  1159 	uvalue = (uvalue / 16);
       
  1160 	s[0] = "0123456789ABCDEF"[uvalue % 16];
       
  1161 	return 0;
       
  1162 }
       
  1163 
       
  1164 PyDoc_STRVAR(doc_b2a_qp,
       
  1165 "b2a_qp(data, quotetabs=0, istext=1, header=0) -> s; \n\
       
  1166  Encode a string using quoted-printable encoding. \n\
       
  1167 \n\
       
  1168 On encoding, when istext is set, newlines are not encoded, and white \n\
       
  1169 space at end of lines is.  When istext is not set, \\r and \\n (CR/LF) are \n\
       
  1170 both encoded.  When quotetabs is set, space and tabs are encoded.");
       
  1171 
       
  1172 /* XXX: This is ridiculously complicated to be backward compatible
       
  1173  * (mostly) with the quopri module.  It doesn't re-create the quopri
       
  1174  * module bug where text ending in CRLF has the CR encoded */
       
  1175 static PyObject*
       
  1176 binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
       
  1177 {
       
  1178 	Py_ssize_t in, out;
       
  1179 	unsigned char *data, *odata;
       
  1180 	Py_ssize_t datalen = 0, odatalen = 0;
       
  1181 	PyObject *rv;
       
  1182 	unsigned int linelen = 0;
       
  1183 	static char *kwlist[] = {"data", "quotetabs", "istext",
       
  1184                                        "header", NULL};
       
  1185 	int istext = 1;
       
  1186 	int quotetabs = 0;
       
  1187 	int header = 0;
       
  1188 	unsigned char ch;
       
  1189 	int crlf = 0;
       
  1190 	unsigned char *p;
       
  1191 
       
  1192 	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|iii", kwlist, &data,
       
  1193 	      &datalen, &quotetabs, &istext, &header))
       
  1194 		return NULL;
       
  1195 
       
  1196 	/* See if this string is using CRLF line ends */
       
  1197 	/* XXX: this function has the side effect of converting all of
       
  1198 	 * the end of lines to be the same depending on this detection
       
  1199 	 * here */
       
  1200 	p = (unsigned char *) memchr(data, '\n', datalen);
       
  1201 	if ((p != NULL) && (p > data) && (*(p-1) == '\r'))
       
  1202 		crlf = 1;
       
  1203 
       
  1204 	/* First, scan to see how many characters need to be encoded */
       
  1205 	in = 0;
       
  1206 	while (in < datalen) {
       
  1207 		if ((data[in] > 126) ||
       
  1208 		    (data[in] == '=') ||
       
  1209 		    (header && data[in] == '_') ||
       
  1210 		    ((data[in] == '.') && (linelen == 0) &&
       
  1211 		     (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
       
  1212 		    (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
       
  1213 		    ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
       
  1214 		    ((data[in] < 33) &&
       
  1215 		     (data[in] != '\r') && (data[in] != '\n') &&
       
  1216 		     (quotetabs ||
       
  1217 		     	(!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
       
  1218 		{
       
  1219 			if ((linelen + 3) >= MAXLINESIZE) {
       
  1220 				linelen = 0;
       
  1221 				if (crlf)
       
  1222 					odatalen += 3;
       
  1223 				else
       
  1224 					odatalen += 2;
       
  1225 			}
       
  1226 			linelen += 3;
       
  1227 			odatalen += 3;
       
  1228 			in++;
       
  1229 		}
       
  1230 		else {
       
  1231 		  	if (istext &&
       
  1232 			    ((data[in] == '\n') ||
       
  1233 			     ((in+1 < datalen) && (data[in] == '\r') &&
       
  1234 			     (data[in+1] == '\n'))))
       
  1235 			{
       
  1236 			  	linelen = 0;
       
  1237 				/* Protect against whitespace on end of line */
       
  1238 				if (in && ((data[in-1] == ' ') || (data[in-1] == '\t')))
       
  1239 					odatalen += 2;
       
  1240 				if (crlf)
       
  1241 					odatalen += 2;
       
  1242 				else
       
  1243 					odatalen += 1;
       
  1244 				if (data[in] == '\r')
       
  1245 					in += 2;
       
  1246 				else
       
  1247 					in++;
       
  1248 			}
       
  1249 			else {
       
  1250 				if ((in + 1 != datalen) &&
       
  1251 				    (data[in+1] != '\n') &&
       
  1252 				    (linelen + 1) >= MAXLINESIZE) {
       
  1253 					linelen = 0;
       
  1254 					if (crlf)
       
  1255 						odatalen += 3;
       
  1256 					else
       
  1257 						odatalen += 2;
       
  1258 				}
       
  1259 				linelen++;
       
  1260 				odatalen++;
       
  1261 				in++;
       
  1262 			}
       
  1263 		}
       
  1264 	}
       
  1265 
       
  1266 	/* We allocate the output same size as input, this is overkill.
       
  1267 	 * The previous implementation used calloc() so we'll zero out the
       
  1268 	 * memory here too, since PyMem_Malloc() does not guarantee that.
       
  1269 	 */
       
  1270 	odata = (unsigned char *) PyMem_Malloc(odatalen);
       
  1271 	if (odata == NULL) {
       
  1272 		PyErr_NoMemory();
       
  1273 		return NULL;
       
  1274 	}
       
  1275 	memset(odata, 0, odatalen);
       
  1276 
       
  1277 	in = out = linelen = 0;
       
  1278 	while (in < datalen) {
       
  1279 		if ((data[in] > 126) ||
       
  1280 		    (data[in] == '=') ||
       
  1281 		    (header && data[in] == '_') ||
       
  1282 		    ((data[in] == '.') && (linelen == 0) &&
       
  1283 		     (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
       
  1284 		    (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
       
  1285 		    ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
       
  1286 		    ((data[in] < 33) &&
       
  1287 		     (data[in] != '\r') && (data[in] != '\n') &&
       
  1288 		     (quotetabs ||
       
  1289 		     	(!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
       
  1290 		{
       
  1291 			if ((linelen + 3 )>= MAXLINESIZE) {
       
  1292 				odata[out++] = '=';
       
  1293 				if (crlf) odata[out++] = '\r';
       
  1294 				odata[out++] = '\n';
       
  1295 				linelen = 0;
       
  1296 			}
       
  1297 			odata[out++] = '=';
       
  1298 			to_hex(data[in], &odata[out]);
       
  1299 			out += 2;
       
  1300 			in++;
       
  1301 			linelen += 3;
       
  1302 		}
       
  1303 		else {
       
  1304 		  	if (istext &&
       
  1305 			    ((data[in] == '\n') ||
       
  1306 			     ((in+1 < datalen) && (data[in] == '\r') &&
       
  1307 			     (data[in+1] == '\n'))))
       
  1308 			{
       
  1309 			  	linelen = 0;
       
  1310 				/* Protect against whitespace on end of line */
       
  1311 				if (out && ((odata[out-1] == ' ') || (odata[out-1] == '\t'))) {
       
  1312 					ch = odata[out-1];
       
  1313 					odata[out-1] = '=';
       
  1314 					to_hex(ch, &odata[out]);
       
  1315 					out += 2;
       
  1316 				}
       
  1317 
       
  1318 				if (crlf) odata[out++] = '\r';
       
  1319 				odata[out++] = '\n';
       
  1320 				if (data[in] == '\r')
       
  1321 					in += 2;
       
  1322 				else
       
  1323 					in++;
       
  1324 			}
       
  1325 			else {
       
  1326 				if ((in + 1 != datalen) &&
       
  1327 				    (data[in+1] != '\n') &&
       
  1328 				    (linelen + 1) >= MAXLINESIZE) {
       
  1329 					odata[out++] = '=';
       
  1330 					if (crlf) odata[out++] = '\r';
       
  1331 					odata[out++] = '\n';
       
  1332 					linelen = 0;
       
  1333 				}
       
  1334 				linelen++;
       
  1335 				if (header && data[in] == ' ') {
       
  1336 					odata[out++] = '_';
       
  1337 					in++;
       
  1338 				}
       
  1339 				else {
       
  1340 					odata[out++] = data[in++];
       
  1341 				}
       
  1342 			}
       
  1343 		}
       
  1344 	}
       
  1345 	if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
       
  1346 		PyMem_Free(odata);
       
  1347 		return NULL;
       
  1348 	}
       
  1349 	PyMem_Free(odata);
       
  1350 	return rv;
       
  1351 }
       
  1352 
       
  1353 /* List of functions defined in the module */
       
  1354 
       
  1355 static struct PyMethodDef binascii_module_methods[] = {
       
  1356 	{"a2b_uu",     binascii_a2b_uu,     METH_VARARGS, doc_a2b_uu},
       
  1357 	{"b2a_uu",     binascii_b2a_uu,     METH_VARARGS, doc_b2a_uu},
       
  1358 	{"a2b_base64", binascii_a2b_base64, METH_VARARGS, doc_a2b_base64},
       
  1359 	{"b2a_base64", binascii_b2a_base64, METH_VARARGS, doc_b2a_base64},
       
  1360 	{"a2b_hqx",    binascii_a2b_hqx,    METH_VARARGS, doc_a2b_hqx},
       
  1361 	{"b2a_hqx",    binascii_b2a_hqx,    METH_VARARGS, doc_b2a_hqx},
       
  1362 	{"b2a_hex",    binascii_hexlify,    METH_VARARGS, doc_hexlify},
       
  1363 	{"a2b_hex",    binascii_unhexlify,  METH_VARARGS, doc_unhexlify},
       
  1364 	{"hexlify",    binascii_hexlify,    METH_VARARGS, doc_hexlify},
       
  1365 	{"unhexlify",  binascii_unhexlify,  METH_VARARGS, doc_unhexlify},
       
  1366 	{"rlecode_hqx",   binascii_rlecode_hqx, METH_VARARGS, doc_rlecode_hqx},
       
  1367 	{"rledecode_hqx", binascii_rledecode_hqx, METH_VARARGS,
       
  1368 	 doc_rledecode_hqx},
       
  1369 	{"crc_hqx",    binascii_crc_hqx,    METH_VARARGS, doc_crc_hqx},
       
  1370 	{"crc32",      binascii_crc32,      METH_VARARGS, doc_crc32},
       
  1371 	{"a2b_qp", (PyCFunction)binascii_a2b_qp, METH_VARARGS | METH_KEYWORDS,
       
  1372 	  doc_a2b_qp},
       
  1373 	{"b2a_qp", (PyCFunction)binascii_b2a_qp, METH_VARARGS | METH_KEYWORDS,
       
  1374           doc_b2a_qp},
       
  1375 	{NULL, NULL}			     /* sentinel */
       
  1376 };
       
  1377 
       
  1378 
       
  1379 /* Initialization function for the module (*must* be called initbinascii) */
       
  1380 PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");
       
  1381 
       
  1382 PyMODINIT_FUNC
       
  1383 initbinascii(void)
       
  1384 {
       
  1385 	PyObject *m, *d, *x;
       
  1386 
       
  1387 	/* Create the module and add the functions */
       
  1388 	m = Py_InitModule("binascii", binascii_module_methods);
       
  1389 	if (m == NULL)
       
  1390 		return;
       
  1391 
       
  1392 	d = PyModule_GetDict(m);
       
  1393 	x = PyString_FromString(doc_binascii);
       
  1394 	PyDict_SetItemString(d, "__doc__", x);
       
  1395 	Py_XDECREF(x);
       
  1396 
       
  1397 	Error = PyErr_NewException("binascii.Error", NULL, NULL);
       
  1398 	PyDict_SetItemString(d, "Error", Error);
       
  1399 	Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
       
  1400 	PyDict_SetItemString(d, "Incomplete", Incomplete);
       
  1401 }