Ignore:
Timestamp:
Mar 19, 2014, 11:11:30 AM (11 years ago)
Author:
dmik
Message:

python: Update vendor to 2.7.6.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • python/vendor/current/Modules/binascii.c

    r2 r388  
    44** This module currently supports the following encodings:
    55** 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.
     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.
    1414** base64:
    1515**      Line breaks are insignificant, but lines are at most 76 chars
     
    1818**      Short binary data is filled (in ASCII) with '='.
    1919** 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.
     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.
    3030**
    3131** While I was reading dozens of programs that encode or decode the formats
    3232** here (documentation? hihi:-) I have formulated Jansen's Observation:
    3333**
    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.
     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.
    4040**
    4141** I have attempted to break with this tradition, but I guess that that
     
    7676static unsigned char table_a2b_hqx[256] = {
    7777/*       ^@    ^A    ^B    ^C    ^D    ^E    ^F    ^G   */
    78 /* 0*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
     78/* 0*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
    7979/*       \b    \t    \n    ^K    ^L    \r    ^N    ^O   */
    80 /* 1*/  FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
     80/* 1*/  FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,
    8181/*       ^P    ^Q    ^R    ^S    ^T    ^U    ^V    ^W   */
    82 /* 2*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
     82/* 2*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
    8383/*       ^X    ^Y    ^Z    ^[    ^\    ^]    ^^    ^_   */
    84 /* 3*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
     84/* 3*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,
    8585/*              !     "     #     $     %     &     '   */
    86 /* 4*/  FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
     86/* 4*/  FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    8787/*        (     )     *     +     ,     -     .     /   */
    88 /* 5*/  0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
     88/* 5*/  0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,
    8989/*        0     1     2     3     4     5     6     7   */
    90 /* 6*/  0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
     90/* 6*/  0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,
    9191/*        8     9     :     ;     <     =     >     ?   */
    92 /* 7*/  0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
     92/* 7*/  0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,
    9393/*        @     A     B     C     D     E     F     G   */
    94 /* 8*/  0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
     94/* 8*/  0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
    9595/*        H     I     J     K     L     M     N     O   */
    96 /* 9*/  0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
     96/* 9*/  0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,
    9797/*        P     Q     R     S     T     U     V     W   */
    98 /*10*/  0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
     98/*10*/  0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,
    9999/*        X     Y     Z     [     \     ]     ^     _   */
    100 /*11*/  0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
     100/*11*/  0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,
    101101/*        `     a     b     c     d     e     f     g   */
    102 /*12*/  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
     102/*12*/  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,
    103103/*        h     i     j     k     l     m     n     o   */
    104 /*13*/  0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
     104/*13*/  0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,
    105105/*        p     q     r     s     t     u     v     w   */
    106 /*14*/  0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
     106/*14*/  0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,
    107107/*        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,
     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,
    125125};
    126126
     
    129129
    130130static 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
     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
    139139};
    140140
     
    150150
    151151static 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,
     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,
    184184};
    185185
     
    189189binascii_a2b_uu(PyObject *self, PyObject *args)
    190190{
    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;
     191    Py_buffer pascii;
     192    unsigned char *ascii_data, *bin_data;
     193    int leftbits = 0;
     194    unsigned char this_ch;
     195    unsigned int leftchar = 0;
     196    PyObject *rv;
     197    Py_ssize_t ascii_len, bin_len;
     198
     199    if ( !PyArg_ParseTuple(args, "s*:a2b_uu", &pascii) )
     200        return NULL;
     201    ascii_data = pascii.buf;
     202    ascii_len = pascii.len;
     203
     204    assert(ascii_len >= 0);
     205
     206    /* First byte: binary data length (in bytes) */
     207    bin_len = (*ascii_data++ - ' ') & 077;
     208    ascii_len--;
     209
     210    /* Allocate the buffer */
     211    if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) {
     212        PyBuffer_Release(&pascii);
     213        return NULL;
     214    }
     215    bin_data = (unsigned char *)PyString_AS_STRING(rv);
     216
     217    for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {
     218        /* XXX is it really best to add NULs if there's no more data */
     219        this_ch = (ascii_len > 0) ? *ascii_data : 0;
     220        if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {
     221            /*
     222            ** Whitespace. Assume some spaces got eaten at
     223            ** end-of-line. (We check this later)
     224            */
     225            this_ch = 0;
     226        } else {
     227            /* Check the character for legality
     228            ** The 64 in stead of the expected 63 is because
     229            ** there are a few uuencodes out there that use
     230            ** '`' as zero instead of space.
     231            */
     232            if ( this_ch < ' ' || this_ch > (' ' + 64)) {
     233                PyErr_SetString(Error, "Illegal char");
     234                PyBuffer_Release(&pascii);
     235                Py_DECREF(rv);
     236                return NULL;
     237            }
     238            this_ch = (this_ch - ' ') & 077;
     239        }
     240        /*
     241        ** Shift it in on the low end, and see if there's
     242        ** a byte ready for output.
     243        */
     244        leftchar = (leftchar << 6) | (this_ch);
     245        leftbits += 6;
     246        if ( leftbits >= 8 ) {
     247            leftbits -= 8;
     248            *bin_data++ = (leftchar >> leftbits) & 0xff;
     249            leftchar &= ((1 << leftbits) - 1);
     250            bin_len--;
     251        }
     252    }
     253    /*
     254    ** Finally, check that if there's anything left on the line
     255    ** that it's whitespace only.
     256    */
     257    while( ascii_len-- > 0 ) {
     258        this_ch = *ascii_data++;
     259        /* Extra '`' may be written as padding in some cases */
     260        if ( this_ch != ' ' && this_ch != ' '+64 &&
     261             this_ch != '\n' && this_ch != '\r' ) {
     262            PyErr_SetString(Error, "Trailing garbage");
     263            PyBuffer_Release(&pascii);
     264            Py_DECREF(rv);
     265            return NULL;
     266        }
     267    }
     268    PyBuffer_Release(&pascii);
     269    return rv;
    262270}
    263271
     
    267275binascii_b2a_uu(PyObject *self, PyObject *args)
    268276{
    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, 2 + (bin_len+2)/3*4)) == 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;
     277    Py_buffer pbin;
     278    unsigned char *ascii_data, *bin_data;
     279    int leftbits = 0;
     280    unsigned char this_ch;
     281    unsigned int leftchar = 0;
     282    PyObject *rv;
     283    Py_ssize_t bin_len;
     284
     285    if ( !PyArg_ParseTuple(args, "s*:b2a_uu", &pbin) )
     286        return NULL;
     287    bin_data = pbin.buf;
     288    bin_len = pbin.len;
     289    if ( bin_len > 45 ) {
     290        /* The 45 is a limit that appears in all uuencode's */
     291        PyErr_SetString(Error, "At most 45 bytes at once");
     292        PyBuffer_Release(&pbin);
     293        return NULL;
     294    }
     295
     296    /* We're lazy and allocate to much (fixed up later) */
     297    if ( (rv=PyString_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL ) {
     298        PyBuffer_Release(&pbin);
     299        return NULL;
     300    }
     301    ascii_data = (unsigned char *)PyString_AS_STRING(rv);
     302
     303    /* Store the length */
     304    *ascii_data++ = ' ' + (bin_len & 077);
     305
     306    for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
     307        /* Shift the data (or padding) into our buffer */
     308        if ( bin_len > 0 )              /* Data */
     309            leftchar = (leftchar << 8) | *bin_data;
     310        else                            /* Padding */
     311            leftchar <<= 8;
     312        leftbits += 8;
     313
     314        /* See if there are 6-bit groups ready */
     315        while ( leftbits >= 6 ) {
     316            this_ch = (leftchar >> (leftbits-6)) & 0x3f;
     317            leftbits -= 6;
     318            *ascii_data++ = this_ch + ' ';
     319        }
     320    }
     321    *ascii_data++ = '\n';       /* Append a courtesy newline */
     322
     323    if (_PyString_Resize(&rv,
     324                       (ascii_data -
     325                        (unsigned char *)PyString_AS_STRING(rv))) < 0) {
     326        Py_DECREF(rv);
     327        rv = NULL;
     328    }
     329    PyBuffer_Release(&pbin);
     330    return rv;
    312331}
    313332
     
    316335binascii_find_valid(unsigned char *s, Py_ssize_t slen, int num)
    317336{
    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;
     337    /* Finds & returns the (num+1)th
     338    ** valid character for base64, or -1 if none.
     339    */
     340
     341    int ret = -1;
     342    unsigned char c, b64val;
     343
     344    while ((slen > 0) && (ret == -1)) {
     345        c = *s;
     346        b64val = table_a2b_base64[c & 0x7f];
     347        if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {
     348            if (num == 0)
     349                ret = *s;
     350            num--;
     351        }
     352
     353        s++;
     354        slen--;
     355    }
     356    return ret;
    338357}
    339358
     
    343362binascii_a2b_base64(PyObject *self, PyObject *args)
    344363{
    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;
     364    Py_buffer pascii;
     365    unsigned char *ascii_data, *bin_data;
     366    int leftbits = 0;
     367    unsigned char this_ch;
     368    unsigned int leftchar = 0;
     369    PyObject *rv;
     370    Py_ssize_t ascii_len, bin_len;
     371    int quad_pos = 0;
     372
     373    if ( !PyArg_ParseTuple(args, "s*:a2b_base64", &pascii) )
     374        return NULL;
     375    ascii_data = pascii.buf;
     376    ascii_len = pascii.len;
     377
     378    assert(ascii_len >= 0);
     379
     380    if (ascii_len > PY_SSIZE_T_MAX - 3) {
     381        PyBuffer_Release(&pascii);
     382        return PyErr_NoMemory();
     383    }
     384
     385    bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */
     386
     387    /* Allocate the buffer */
     388    if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) {
     389        PyBuffer_Release(&pascii);
     390        return NULL;
     391    }
     392    bin_data = (unsigned char *)PyString_AS_STRING(rv);
     393    bin_len = 0;
     394
     395    for( ; ascii_len > 0; ascii_len--, ascii_data++) {
     396        this_ch = *ascii_data;
     397
     398        if (this_ch > 0x7f ||
     399            this_ch == '\r' || this_ch == '\n' || this_ch == ' ')
     400            continue;
     401
     402        /* Check for pad sequences and ignore
     403        ** the invalid ones.
     404        */
     405        if (this_ch == BASE64_PAD) {
     406            if ( (quad_pos < 2) ||
     407                 ((quad_pos == 2) &&
     408                  (binascii_find_valid(ascii_data, ascii_len, 1)
     409                   != BASE64_PAD)) )
     410            {
     411                continue;
     412            }
     413            else {
     414                /* A pad sequence means no more input.
     415                ** We've already interpreted the data
     416                ** from the quad at this point.
     417                */
     418                leftbits = 0;
     419                break;
     420            }
     421        }
     422
     423        this_ch = table_a2b_base64[*ascii_data];
     424        if ( this_ch == (unsigned char) -1 )
     425            continue;
     426
     427        /*
     428        ** Shift it in on the low end, and see if there's
     429        ** a byte ready for output.
     430        */
     431        quad_pos = (quad_pos + 1) & 0x03;
     432        leftchar = (leftchar << 6) | (this_ch);
     433        leftbits += 6;
     434
     435        if ( leftbits >= 8 ) {
     436            leftbits -= 8;
     437            *bin_data++ = (leftchar >> leftbits) & 0xff;
     438            bin_len++;
     439            leftchar &= ((1 << leftbits) - 1);
     440        }
     441    }
     442
     443    if (leftbits != 0) {
     444        PyBuffer_Release(&pascii);
     445        PyErr_SetString(Error, "Incorrect padding");
     446        Py_DECREF(rv);
     447        return NULL;
     448    }
     449
     450    /* And set string size correctly. If the result string is empty
     451    ** (because the input was all invalid) return the shared empty
     452    ** string instead; _PyString_Resize() won't do this for us.
     453    */
     454    if (bin_len > 0) {
     455        if (_PyString_Resize(&rv, bin_len) < 0) {
     456            Py_DECREF(rv);
     457            rv = NULL;
     458        }
     459    }
     460    else {
     461        Py_DECREF(rv);
     462        rv = PyString_FromStringAndSize("", 0);
     463    }
     464    PyBuffer_Release(&pascii);
     465    return rv;
    434466}
    435467
     
    439471binascii_b2a_base64(PyObject *self, PyObject *args)
    440472{
    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;
     473    Py_buffer pbuf;
     474    unsigned char *ascii_data, *bin_data;
     475    int leftbits = 0;
     476    unsigned char this_ch;
     477    unsigned int leftchar = 0;
     478    PyObject *rv;
     479    Py_ssize_t bin_len;
     480
     481    if ( !PyArg_ParseTuple(args, "s*:b2a_base64", &pbuf) )
     482        return NULL;
     483    bin_data = pbuf.buf;
     484    bin_len = pbuf.len;
     485
     486    assert(bin_len >= 0);
     487
     488    if ( bin_len > BASE64_MAXBIN ) {
     489        PyErr_SetString(Error, "Too much data for base64 line");
     490        PyBuffer_Release(&pbuf);
     491        return NULL;
     492    }
     493
     494    /* We're lazy and allocate too much (fixed up later).
     495       "+3" leaves room for up to two pad characters and a trailing
     496       newline.  Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */
     497    if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) {
     498        PyBuffer_Release(&pbuf);
     499        return NULL;
     500    }
     501    ascii_data = (unsigned char *)PyString_AS_STRING(rv);
     502
     503    for( ; bin_len > 0 ; bin_len--, bin_data++ ) {
     504        /* Shift the data into our buffer */
     505        leftchar = (leftchar << 8) | *bin_data;
     506        leftbits += 8;
     507
     508        /* See if there are 6-bit groups ready */
     509        while ( leftbits >= 6 ) {
     510            this_ch = (leftchar >> (leftbits-6)) & 0x3f;
     511            leftbits -= 6;
     512            *ascii_data++ = table_b2a_base64[this_ch];
     513        }
     514    }
     515    if ( leftbits == 2 ) {
     516        *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];
     517        *ascii_data++ = BASE64_PAD;
     518        *ascii_data++ = BASE64_PAD;
     519    } else if ( leftbits == 4 ) {
     520        *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];
     521        *ascii_data++ = BASE64_PAD;
     522    }
     523    *ascii_data++ = '\n';       /* Append a courtesy newline */
     524
     525    if (_PyString_Resize(&rv,
     526                       (ascii_data -
     527                        (unsigned char *)PyString_AS_STRING(rv))) < 0) {
     528        Py_DECREF(rv);
     529        rv = NULL;
     530    }
     531    PyBuffer_Release(&pbuf);
     532    return rv;
    490533}
    491534
     
    495538binascii_a2b_hqx(PyObject *self, PyObject *args)
    496539{
    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;
     540    Py_buffer pascii;
     541    unsigned char *ascii_data, *bin_data;
     542    int leftbits = 0;
     543    unsigned char this_ch;
     544    unsigned int leftchar = 0;
     545    PyObject *rv;
     546    Py_ssize_t len;
     547    int done = 0;
     548
     549    if ( !PyArg_ParseTuple(args, "s*:a2b_hqx", &pascii) )
     550        return NULL;
     551    ascii_data = pascii.buf;
     552    len = pascii.len;
     553
     554    assert(len >= 0);
     555
     556    if (len > PY_SSIZE_T_MAX - 2) {
     557        PyBuffer_Release(&pascii);
     558        return PyErr_NoMemory();
     559    }
     560
     561    /* Allocate a string that is too big (fixed later)
     562       Add two to the initial length to prevent interning which
     563       would preclude subsequent resizing.  */
     564    if ( (rv=PyString_FromStringAndSize(NULL, len+2)) == NULL ) {
     565        PyBuffer_Release(&pascii);
     566        return NULL;
     567    }
     568    bin_data = (unsigned char *)PyString_AS_STRING(rv);
     569
     570    for( ; len > 0 ; len--, ascii_data++ ) {
     571        /* Get the byte and look it up */
     572        this_ch = table_a2b_hqx[*ascii_data];
     573        if ( this_ch == SKIP )
     574            continue;
     575        if ( this_ch == FAIL ) {
     576            PyErr_SetString(Error, "Illegal char");
     577            PyBuffer_Release(&pascii);
     578            Py_DECREF(rv);
     579            return NULL;
     580        }
     581        if ( this_ch == DONE ) {
     582            /* The terminating colon */
     583            done = 1;
     584            break;
     585        }
     586
     587        /* Shift it into the buffer and see if any bytes are ready */
     588        leftchar = (leftchar << 6) | (this_ch);
     589        leftbits += 6;
     590        if ( leftbits >= 8 ) {
     591            leftbits -= 8;
     592            *bin_data++ = (leftchar >> leftbits) & 0xff;
     593            leftchar &= ((1 << leftbits) - 1);
     594        }
     595    }
     596
     597    if ( leftbits && !done ) {
     598        PyErr_SetString(Incomplete,
     599                        "String has incomplete number of bytes");
     600        PyBuffer_Release(&pascii);
     601        Py_DECREF(rv);
     602        return NULL;
     603    }
     604    if (_PyString_Resize(&rv,
     605                       (bin_data -
     606                        (unsigned char *)PyString_AS_STRING(rv))) < 0) {
     607        Py_DECREF(rv);
     608        rv = NULL;
     609    }
     610    if (rv) {
     611        PyObject *rrv = Py_BuildValue("Oi", rv, done);
     612        PyBuffer_Release(&pascii);
     613        Py_DECREF(rv);
     614        return rrv;
     615    }
     616
     617    PyBuffer_Release(&pascii);
     618    return NULL;
    561619}
    562620
     
    566624binascii_rlecode_hqx(PyObject *self, PyObject *args)
    567625{
    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;
     626    Py_buffer pbuf;
     627    unsigned char *in_data, *out_data;
     628    PyObject *rv;
     629    unsigned char ch;
     630    Py_ssize_t in, inend, len;
     631
     632    if ( !PyArg_ParseTuple(args, "s*:rlecode_hqx", &pbuf) )
     633        return NULL;
     634    in_data = pbuf.buf;
     635    len = pbuf.len;
     636
     637    assert(len >= 0);
     638
     639    if (len > PY_SSIZE_T_MAX / 2 - 2) {
     640        PyBuffer_Release(&pbuf);
     641        return PyErr_NoMemory();
     642    }
     643
     644    /* Worst case: output is twice as big as input (fixed later) */
     645    if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) {
     646        PyBuffer_Release(&pbuf);
     647        return NULL;
     648    }
     649    out_data = (unsigned char *)PyString_AS_STRING(rv);
     650
     651    for( in=0; in<len; in++) {
     652        ch = in_data[in];
     653        if ( ch == RUNCHAR ) {
     654            /* RUNCHAR. Escape it. */
     655            *out_data++ = RUNCHAR;
     656            *out_data++ = 0;
     657        } else {
     658            /* Check how many following are the same */
     659            for(inend=in+1;
     660                inend<len && in_data[inend] == ch &&
     661                    inend < in+255;
     662                inend++) ;
     663            if ( inend - in > 3 ) {
     664                /* More than 3 in a row. Output RLE. */
     665                *out_data++ = ch;
     666                *out_data++ = RUNCHAR;
     667                *out_data++ = inend-in;
     668                in = inend-1;
     669            } else {
     670                /* Less than 3. Output the byte itself */
     671                *out_data++ = ch;
     672            }
     673        }
     674    }
     675    if (_PyString_Resize(&rv,
     676                       (out_data -
     677                        (unsigned char *)PyString_AS_STRING(rv))) < 0) {
     678        Py_DECREF(rv);
     679        rv = NULL;
     680    }
     681    PyBuffer_Release(&pbuf);
     682    return rv;
    613683}
    614684
     
    618688binascii_b2a_hqx(PyObject *self, PyObject *args)
    619689{
    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;
     690    Py_buffer pbin;
     691    unsigned char *ascii_data, *bin_data;
     692    int leftbits = 0;
     693    unsigned char this_ch;
     694    unsigned int leftchar = 0;
     695    PyObject *rv;
     696    Py_ssize_t len;
     697
     698    if ( !PyArg_ParseTuple(args, "s*:b2a_hqx", &pbin) )
     699        return NULL;
     700    bin_data = pbin.buf;
     701    len = pbin.len;
     702
     703    assert(len >= 0);
     704
     705    if (len > PY_SSIZE_T_MAX / 2 - 2) {
     706        PyBuffer_Release(&pbin);
     707        return PyErr_NoMemory();
     708    }
     709
     710    /* Allocate a buffer that is at least large enough */
     711    if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) {
     712        PyBuffer_Release(&pbin);
     713        return NULL;
     714    }
     715    ascii_data = (unsigned char *)PyString_AS_STRING(rv);
     716
     717    for( ; len > 0 ; len--, bin_data++ ) {
     718        /* Shift into our buffer, and output any 6bits ready */
     719        leftchar = (leftchar << 8) | *bin_data;
     720        leftbits += 8;
     721        while ( leftbits >= 6 ) {
     722            this_ch = (leftchar >> (leftbits-6)) & 0x3f;
     723            leftbits -= 6;
     724            *ascii_data++ = table_b2a_hqx[this_ch];
     725        }
     726    }
     727    /* Output a possible runt byte */
     728    if ( leftbits ) {
     729        leftchar <<= (6-leftbits);
     730        *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];
     731    }
     732    if (_PyString_Resize(&rv,
     733                       (ascii_data -
     734                        (unsigned char *)PyString_AS_STRING(rv))) < 0) {
     735        Py_DECREF(rv);
     736        rv = NULL;
     737    }
     738    PyBuffer_Release(&pbin);
     739    return rv;
    658740}
    659741
     
    663745binascii_rledecode_hqx(PyObject *self, PyObject *args)
    664746{
    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)
     747    Py_buffer pin;
     748    unsigned char *in_data, *out_data;
     749    unsigned char in_byte, in_repeat;
     750    PyObject *rv;
     751    Py_ssize_t in_len, out_len, out_len_left;
     752
     753    if ( !PyArg_ParseTuple(args, "s*:rledecode_hqx", &pin) )
     754        return NULL;
     755    in_data = pin.buf;
     756    in_len = pin.len;
     757
     758    assert(in_len >= 0);
     759
     760    /* Empty string is a special case */
     761    if ( in_len == 0 ) {
     762        PyBuffer_Release(&pin);
     763        return PyString_FromStringAndSize("", 0);
     764    }
     765    else if (in_len > PY_SSIZE_T_MAX / 2) {
     766        PyBuffer_Release(&pin);
    679767        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         */
     768    }
     769
     770    /* Allocate a buffer of reasonable size. Resized when needed */
     771    out_len = in_len*2;
     772    if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL ) {
     773        PyBuffer_Release(&pin);
     774        return NULL;
     775    }
     776    out_len_left = out_len;
     777    out_data = (unsigned char *)PyString_AS_STRING(rv);
     778
     779    /*
     780    ** We need two macros here to get/put bytes and handle
     781    ** end-of-buffer for input and output strings.
     782    */
    692783#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)
     784    do { \
     785             if ( --in_len < 0 ) { \
     786                       PyErr_SetString(Incomplete, ""); \
     787                       Py_DECREF(rv); \
     788                       PyBuffer_Release(&pin); \
     789                       return NULL; \
     790             } \
     791             b = *in_data++; \
     792    } while(0)
    701793
    702794#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;
     795    do { \
     796             if ( --out_len_left < 0 ) { \
     797                      if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \
     798                      if (_PyString_Resize(&rv, 2*out_len) < 0) \
     799                        { Py_DECREF(rv); PyBuffer_Release(&pin); return NULL; } \
     800                      out_data = (unsigned char *)PyString_AS_STRING(rv) \
     801                                                             + out_len; \
     802                      out_len_left = out_len-1; \
     803                      out_len = out_len * 2; \
     804             } \
     805             *out_data++ = b; \
     806    } while(0)
     807
     808        /*
     809        ** Handle first byte separately (since we have to get angry
     810        ** in case of an orphaned RLE code).
     811        */
     812        INBYTE(in_byte);
     813
     814    if (in_byte == RUNCHAR) {
     815        INBYTE(in_repeat);
     816        if (in_repeat != 0) {
     817            /* Note Error, not Incomplete (which is at the end
     818            ** of the string only). This is a programmer error.
     819            */
     820            PyErr_SetString(Error, "Orphaned RLE code at start");
     821            PyBuffer_Release(&pin);
     822            Py_DECREF(rv);
     823            return NULL;
     824        }
     825        OUTBYTE(RUNCHAR);
     826    } else {
     827        OUTBYTE(in_byte);
     828    }
     829
     830    while( in_len > 0 ) {
     831        INBYTE(in_byte);
     832
     833        if (in_byte == RUNCHAR) {
     834            INBYTE(in_repeat);
     835            if ( in_repeat == 0 ) {
     836                /* Just an escaped RUNCHAR value */
     837                OUTBYTE(RUNCHAR);
     838            } else {
     839                /* Pick up value and output a sequence of it */
     840                in_byte = out_data[-1];
     841                while ( --in_repeat > 0 )
     842                    OUTBYTE(in_byte);
     843            }
     844        } else {
     845            /* Normal byte */
     846            OUTBYTE(in_byte);
     847        }
     848    }
     849    if (_PyString_Resize(&rv,
     850                       (out_data -
     851                        (unsigned char *)PyString_AS_STRING(rv))) < 0) {
     852        Py_DECREF(rv);
     853        rv = NULL;
     854    }
     855    PyBuffer_Release(&pin);
     856    return rv;
    759857}
    760858
     
    765863binascii_crc_hqx(PyObject *self, PyObject *args)
    766864{
    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);
     865    Py_buffer pin;
     866    unsigned char *bin_data;
     867    unsigned int crc;
     868    Py_ssize_t len;
     869
     870    if ( !PyArg_ParseTuple(args, "s*i:crc_hqx", &pin, &crc) )
     871        return NULL;
     872    bin_data = pin.buf;
     873    len = pin.len;
     874
     875    while(len-- > 0) {
     876        crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];
     877    }
     878
     879    PyBuffer_Release(&pin);
     880    return Py_BuildValue("i", crc);
    779881}
    780882
     
    788890{
    789891    unsigned int crc32val = 0;  /* crc32(0L, Z_NULL, 0) */
     892    Py_buffer pbuf;
    790893    Byte *buf;
    791894    Py_ssize_t len;
    792895    int signed_val;
    793896
    794     if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
    795         return NULL;
     897    if (!PyArg_ParseTuple(args, "s*|I:crc32", &pbuf, &crc32val))
     898    return NULL;
    796899    /* In Python 2.x we return a signed integer regardless of native platform
    797900     * long size (the 32bit unsigned long is treated as 32-bit signed and sign
    798901     * extended into a 64-bit long inside the integer object).  3.0 does the
    799902     * right thing and returns unsigned. http://bugs.python.org/issue1202 */
     903    buf = (Byte*)pbuf.buf;
     904    len = pbuf.len;
    800905    signed_val = crc32(crc32val, buf, len);
     906    PyBuffer_Release(&pbuf);
    801907    return PyInt_FromLong(signed_val);
    802908}
     
    9231029binascii_crc32(PyObject *self, PyObject *args)
    9241030{ /* 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);
     1031    Py_buffer pbin;
     1032    unsigned char *bin_data;
     1033    unsigned int crc = 0U;      /* initial value of CRC */
     1034    Py_ssize_t len;
     1035    int result;
     1036
     1037    if ( !PyArg_ParseTuple(args, "s*|I:crc32", &pbin, &crc) )
     1038        return NULL;
     1039    bin_data = pbin.buf;
     1040    len = pbin.len;
     1041
     1042    crc = ~ crc;
     1043    while (len-- > 0)
     1044        crc = crc_32_tab[(crc ^ *bin_data++) & 0xffU] ^ (crc >> 8);
     1045        /* Note:  (crc >> 8) MUST zero fill on left */
     1046
     1047    result = (int)(crc ^ 0xFFFFFFFFU);
     1048    PyBuffer_Release(&pbin);
     1049    return PyInt_FromLong(result);
    9401050}
    9411051#endif  /* USE_ZLIB_CRC32 */
     
    9451055binascii_hexlify(PyObject *self, PyObject *args)
    9461056{
    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;
     1057    Py_buffer parg;
     1058    char* argbuf;
     1059    Py_ssize_t arglen;
     1060    PyObject *retval;
     1061    char* retbuf;
     1062    Py_ssize_t i, j;
     1063
     1064    if (!PyArg_ParseTuple(args, "s*:b2a_hex", &parg))
     1065        return NULL;
     1066    argbuf = parg.buf;
     1067    arglen = parg.len;
     1068
     1069    assert(arglen >= 0);
     1070    if (arglen > PY_SSIZE_T_MAX / 2) {
     1071        PyBuffer_Release(&parg);
     1072        return PyErr_NoMemory();
     1073    }
     1074
     1075    retval = PyString_FromStringAndSize(NULL, arglen*2);
     1076    if (!retval) {
     1077        PyBuffer_Release(&parg);
     1078        return NULL;
     1079    }
     1080    retbuf = PyString_AS_STRING(retval);
     1081
     1082    /* make hex version of string, taken from shamodule.c */
     1083    for (i=j=0; i < arglen; i++) {
     1084        char c;
     1085        c = (argbuf[i] >> 4) & 0xf;
     1086        c = (c>9) ? c+'a'-10 : c + '0';
     1087        retbuf[j++] = c;
     1088        c = argbuf[i] & 0xf;
     1089        c = (c>9) ? c+'a'-10 : c + '0';
     1090        retbuf[j++] = c;
     1091    }
     1092    PyBuffer_Release(&parg);
     1093    return retval;
    9821094}
    9831095
     
    9911103to_int(int c)
    9921104{
    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;
     1105    if (isdigit(c))
     1106        return c - '0';
     1107    else {
     1108        if (Py_ISUPPER(c))
     1109            c = Py_TOLOWER(c);
     1110        if (c >= 'a' && c <= 'f')
     1111            return c - 'a' + 10;
     1112    }
     1113    return -1;
    10021114}
    10031115
     
    10061118binascii_unhexlify(PyObject *self, PyObject *args)
    10071119{
    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;
     1120    Py_buffer parg;
     1121    char* argbuf;
     1122    Py_ssize_t arglen;
     1123    PyObject *retval;
     1124    char* retbuf;
     1125    Py_ssize_t i, j;
     1126
     1127    if (!PyArg_ParseTuple(args, "s*:a2b_hex", &parg))
     1128        return NULL;
     1129    argbuf = parg.buf;
     1130    arglen = parg.len;
     1131
     1132    assert(arglen >= 0);
     1133
     1134    /* XXX What should we do about strings with an odd length?  Should
     1135     * we add an implicit leading zero, or a trailing zero?  For now,
     1136     * raise an exception.
     1137     */
     1138    if (arglen % 2) {
     1139        PyBuffer_Release(&parg);
     1140        PyErr_SetString(PyExc_TypeError, "Odd-length string");
     1141        return NULL;
     1142    }
     1143
     1144    retval = PyString_FromStringAndSize(NULL, (arglen/2));
     1145    if (!retval) {
     1146        PyBuffer_Release(&parg);
     1147        return NULL;
     1148    }
     1149    retbuf = PyString_AS_STRING(retval);
     1150
     1151    for (i=j=0; i < arglen; i += 2) {
     1152        int top = to_int(Py_CHARMASK(argbuf[i]));
     1153        int bot = to_int(Py_CHARMASK(argbuf[i+1]));
     1154        if (top == -1 || bot == -1) {
     1155            PyErr_SetString(PyExc_TypeError,
     1156                            "Non-hexadecimal digit found");
     1157            goto finally;
     1158        }
     1159        retbuf[j++] = (top << 4) + bot;
     1160    }
     1161    PyBuffer_Release(&parg);
     1162    return retval;
    10461163
    10471164  finally:
    1048         Py_DECREF(retval);
    1049         return NULL;
     1165    PyBuffer_Release(&parg);
     1166    Py_DECREF(retval);
     1167    return NULL;
    10501168}
    10511169
     
    10761194binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
    10771195{
    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;
     1196    Py_ssize_t in, out;
     1197    char ch;
     1198    Py_buffer pdata;
     1199    unsigned char *data, *odata;
     1200    Py_ssize_t datalen = 0;
     1201    PyObject *rv;
     1202    static char *kwlist[] = {"data", "header", NULL};
     1203    int header = 0;
     1204
     1205    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i", kwlist, &pdata,
     1206          &header))
     1207        return NULL;
     1208    data = pdata.buf;
     1209    datalen = pdata.len;
     1210
     1211    /* We allocate the output same size as input, this is overkill.
     1212     * The previous implementation used calloc() so we'll zero out the
     1213     * memory here too, since PyMem_Malloc() does not guarantee that.
     1214     */
     1215    odata = (unsigned char *) PyMem_Malloc(datalen);
     1216    if (odata == NULL) {
     1217        PyBuffer_Release(&pdata);
     1218        PyErr_NoMemory();
     1219        return NULL;
     1220    }
     1221    memset(odata, 0, datalen);
     1222
     1223    in = out = 0;
     1224    while (in < datalen) {
     1225        if (data[in] == '=') {
     1226            in++;
     1227            if (in >= datalen) break;
     1228            /* Soft line breaks */
     1229            if ((data[in] == '\n') || (data[in] == '\r')) {
     1230                if (data[in] != '\n') {
     1231                    while (in < datalen && data[in] != '\n') in++;
     1232                }
     1233                if (in < datalen) in++;
     1234            }
     1235            else if (data[in] == '=') {
     1236                /* broken case from broken python qp */
     1237                odata[out++] = '=';
     1238                in++;
     1239            }
     1240            else if (((data[in] >= 'A' && data[in] <= 'F') ||
     1241                      (data[in] >= 'a' && data[in] <= 'f') ||
     1242                      (data[in] >= '0' && data[in] <= '9')) &&
     1243                     ((data[in+1] >= 'A' && data[in+1] <= 'F') ||
     1244                      (data[in+1] >= 'a' && data[in+1] <= 'f') ||
     1245                      (data[in+1] >= '0' && data[in+1] <= '9'))) {
     1246                /* hexval */
     1247                ch = hexval(data[in]) << 4;
     1248                in++;
     1249                ch |= hexval(data[in]);
     1250                in++;
     1251                odata[out++] = ch;
     1252            }
     1253            else {
     1254              odata[out++] = '=';
     1255            }
     1256        }
     1257        else if (header && data[in] == '_') {
     1258            odata[out++] = ' ';
     1259            in++;
     1260        }
     1261        else {
     1262            odata[out] = data[in];
     1263            in++;
     1264            out++;
     1265        }
     1266    }
     1267    if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
     1268        PyBuffer_Release(&pdata);
     1269        PyMem_Free(odata);
     1270        return NULL;
     1271    }
     1272    PyBuffer_Release(&pdata);
     1273    PyMem_Free(odata);
     1274    return rv;
    11511275}
    11521276
     
    11541278to_hex (unsigned char ch, unsigned char *s)
    11551279{
    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;
     1280    unsigned int uvalue = ch;
     1281
     1282    s[1] = "0123456789ABCDEF"[uvalue % 16];
     1283    uvalue = (uvalue / 16);
     1284    s[0] = "0123456789ABCDEF"[uvalue % 16];
     1285    return 0;
    11621286}
    11631287
     
    11761300binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)
    11771301{
    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;
     1302    Py_ssize_t in, out;
     1303    Py_buffer pdata;
     1304    unsigned char *data, *odata;
     1305    Py_ssize_t datalen = 0, odatalen = 0;
     1306    PyObject *rv;
     1307    unsigned int linelen = 0;
     1308    static char *kwlist[] = {"data", "quotetabs", "istext",
     1309                                   "header", NULL};
     1310    int istext = 1;
     1311    int quotetabs = 0;
     1312    int header = 0;
     1313    unsigned char ch;
     1314    int crlf = 0;
     1315    unsigned char *p;
     1316
     1317    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|iii", kwlist, &pdata,
     1318          &quotetabs, &istext, &header))
     1319        return NULL;
     1320    data = pdata.buf;
     1321    datalen = pdata.len;
     1322
     1323    /* See if this string is using CRLF line ends */
     1324    /* XXX: this function has the side effect of converting all of
     1325     * the end of lines to be the same depending on this detection
     1326     * here */
     1327    p = (unsigned char *) memchr(data, '\n', datalen);
     1328    if ((p != NULL) && (p > data) && (*(p-1) == '\r'))
     1329        crlf = 1;
     1330
     1331    /* First, scan to see how many characters need to be encoded */
     1332    in = 0;
     1333    while (in < datalen) {
     1334        if ((data[in] > 126) ||
     1335            (data[in] == '=') ||
     1336            (header && data[in] == '_') ||
     1337            ((data[in] == '.') && (linelen == 0) &&
     1338             (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
     1339            (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
     1340            ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
     1341            ((data[in] < 33) &&
     1342             (data[in] != '\r') && (data[in] != '\n') &&
     1343             (quotetabs ||
     1344            (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
     1345        {
     1346            if ((linelen + 3) >= MAXLINESIZE) {
     1347                linelen = 0;
     1348                if (crlf)
     1349                    odatalen += 3;
     1350                else
     1351                    odatalen += 2;
     1352            }
     1353            linelen += 3;
     1354            odatalen += 3;
     1355            in++;
     1356        }
     1357        else {
     1358            if (istext &&
     1359                ((data[in] == '\n') ||
     1360                 ((in+1 < datalen) && (data[in] == '\r') &&
     1361                 (data[in+1] == '\n'))))
     1362            {
     1363                linelen = 0;
     1364                /* Protect against whitespace on end of line */
     1365                if (in && ((data[in-1] == ' ') || (data[in-1] == '\t')))
     1366                    odatalen += 2;
     1367                if (crlf)
     1368                    odatalen += 2;
     1369                else
     1370                    odatalen += 1;
     1371                if (data[in] == '\r')
     1372                    in += 2;
     1373                else
     1374                    in++;
     1375            }
     1376            else {
     1377                if ((in + 1 != datalen) &&
     1378                    (data[in+1] != '\n') &&
     1379                    (linelen + 1) >= MAXLINESIZE) {
     1380                    linelen = 0;
     1381                    if (crlf)
     1382                        odatalen += 3;
     1383                    else
     1384                        odatalen += 2;
     1385                }
     1386                linelen++;
     1387                odatalen++;
     1388                in++;
     1389            }
     1390        }
     1391    }
     1392
     1393    /* We allocate the output same size as input, this is overkill.
     1394     * The previous implementation used calloc() so we'll zero out the
     1395     * memory here too, since PyMem_Malloc() does not guarantee that.
     1396     */
     1397    odata = (unsigned char *) PyMem_Malloc(odatalen);
     1398    if (odata == NULL) {
     1399        PyBuffer_Release(&pdata);
     1400        PyErr_NoMemory();
     1401        return NULL;
     1402    }
     1403    memset(odata, 0, odatalen);
     1404
     1405    in = out = linelen = 0;
     1406    while (in < datalen) {
     1407        if ((data[in] > 126) ||
     1408            (data[in] == '=') ||
     1409            (header && data[in] == '_') ||
     1410            ((data[in] == '.') && (linelen == 0) &&
     1411             (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||
     1412            (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||
     1413            ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||
     1414            ((data[in] < 33) &&
     1415             (data[in] != '\r') && (data[in] != '\n') &&
     1416             (quotetabs ||
     1417            (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))
     1418        {
     1419            if ((linelen + 3 )>= MAXLINESIZE) {
     1420                odata[out++] = '=';
     1421                if (crlf) odata[out++] = '\r';
     1422                odata[out++] = '\n';
     1423                linelen = 0;
     1424            }
     1425            odata[out++] = '=';
     1426            to_hex(data[in], &odata[out]);
     1427            out += 2;
     1428            in++;
     1429            linelen += 3;
     1430        }
     1431        else {
     1432            if (istext &&
     1433                ((data[in] == '\n') ||
     1434                 ((in+1 < datalen) && (data[in] == '\r') &&
     1435                 (data[in+1] == '\n'))))
     1436            {
     1437                linelen = 0;
     1438                /* Protect against whitespace on end of line */
     1439                if (out && ((odata[out-1] == ' ') || (odata[out-1] == '\t'))) {
     1440                    ch = odata[out-1];
     1441                    odata[out-1] = '=';
     1442                    to_hex(ch, &odata[out]);
     1443                    out += 2;
     1444                }
     1445
     1446                if (crlf) odata[out++] = '\r';
     1447                odata[out++] = '\n';
     1448                if (data[in] == '\r')
     1449                    in += 2;
     1450                else
     1451                    in++;
     1452            }
     1453            else {
     1454                if ((in + 1 != datalen) &&
     1455                    (data[in+1] != '\n') &&
     1456                    (linelen + 1) >= MAXLINESIZE) {
     1457                    odata[out++] = '=';
     1458                    if (crlf) odata[out++] = '\r';
     1459                    odata[out++] = '\n';
     1460                    linelen = 0;
     1461                }
     1462                linelen++;
     1463                if (header && data[in] == ' ') {
     1464                    odata[out++] = '_';
     1465                    in++;
     1466                }
     1467                else {
     1468                    odata[out++] = data[in++];
     1469                }
     1470            }
     1471        }
     1472    }
     1473    if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {
     1474        PyBuffer_Release(&pdata);
     1475        PyMem_Free(odata);
     1476        return NULL;
     1477    }
     1478    PyBuffer_Release(&pdata);
     1479    PyMem_Free(odata);
     1480    return rv;
    13511481}
    13521482
     
    13541484
    13551485static 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 */
     1486    {"a2b_uu",     binascii_a2b_uu,     METH_VARARGS, doc_a2b_uu},
     1487    {"b2a_uu",     binascii_b2a_uu,     METH_VARARGS, doc_b2a_uu},
     1488    {"a2b_base64", binascii_a2b_base64, METH_VARARGS, doc_a2b_base64},
     1489    {"b2a_base64", binascii_b2a_base64, METH_VARARGS, doc_b2a_base64},
     1490    {"a2b_hqx",    binascii_a2b_hqx,    METH_VARARGS, doc_a2b_hqx},
     1491    {"b2a_hqx",    binascii_b2a_hqx,    METH_VARARGS, doc_b2a_hqx},
     1492    {"b2a_hex",    binascii_hexlify,    METH_VARARGS, doc_hexlify},
     1493    {"a2b_hex",    binascii_unhexlify,  METH_VARARGS, doc_unhexlify},
     1494    {"hexlify",    binascii_hexlify,    METH_VARARGS, doc_hexlify},
     1495    {"unhexlify",  binascii_unhexlify,  METH_VARARGS, doc_unhexlify},
     1496    {"rlecode_hqx",   binascii_rlecode_hqx, METH_VARARGS, doc_rlecode_hqx},
     1497    {"rledecode_hqx", binascii_rledecode_hqx, METH_VARARGS,
     1498    doc_rledecode_hqx},
     1499    {"crc_hqx",    binascii_crc_hqx,    METH_VARARGS, doc_crc_hqx},
     1500    {"crc32",      binascii_crc32,      METH_VARARGS, doc_crc32},
     1501    {"a2b_qp", (PyCFunction)binascii_a2b_qp, METH_VARARGS | METH_KEYWORDS,
     1502      doc_a2b_qp},
     1503    {"b2a_qp", (PyCFunction)binascii_b2a_qp, METH_VARARGS | METH_KEYWORDS,
     1504      doc_b2a_qp},
     1505    {NULL, NULL}                             /* sentinel */
    13761506};
    13771507
     
    13831513initbinascii(void)
    13841514{
    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 }
     1515    PyObject *m, *d, *x;
     1516
     1517    /* Create the module and add the functions */
     1518    m = Py_InitModule("binascii", binascii_module_methods);
     1519    if (m == NULL)
     1520        return;
     1521
     1522    d = PyModule_GetDict(m);
     1523    x = PyString_FromString(doc_binascii);
     1524    PyDict_SetItemString(d, "__doc__", x);
     1525    Py_XDECREF(x);
     1526
     1527    Error = PyErr_NewException("binascii.Error", NULL, NULL);
     1528    PyDict_SetItemString(d, "Error", Error);
     1529    Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);
     1530    PyDict_SetItemString(d, "Incomplete", Incomplete);
     1531}
Note: See TracChangeset for help on using the changeset viewer.