/****************************************************************************
* ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, *
* Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. *
* ------------------------------------------------------------------------ *
* Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, *
* Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. *
****************************************************************************/
/*
* Base64 Decoder, for the webserver basic authentication
* stuff, not mine found it kicking about at
* http://local.15seconds.com/faq/pg00934.htm
* All credit to John Ludeman for this code :)
*
* Only change made is to cast the data access to pr2six
* to type (int) to prevent gcc from moaning its head off
* while using -Wall
*/
/* Thanks to John Ludeman for this code...
* Define translation matrix for Base64 decode.
* it's fast and const should make it shared text page.
*/
const int pr2six[256] = {
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
};
/*
* Decode a base64 encoded string
*/
void Base64Decode( char *bufcoded, unsigned char *bufplain, int outbufsize )
{
int nbytesdecoded;
int nprbytes;
char *bufin = bufcoded;
unsigned char *bufout = bufplain;
/*
* Strip leading whitespace
*/
while( *bufcoded == ' ' || *bufcoded == '\t' )
++bufcoded;
/*
* Figure out how many characters are in the input buffer.
* If this would decode into more bytes than would fit into
* the output buffer, adjust the number of input bytes downwards.
*/
bufin = bufcoded;
while( pr2six[( int )*( bufin++ )] <= 63 )
;
nprbytes = bufin - bufcoded - 1;
nbytesdecoded = ( ( nprbytes + 3 ) / 4 ) * 3;
if( nbytesdecoded > outbufsize )
nprbytes = ( outbufsize * 4 ) / 3;
bufin = bufcoded;
while( nprbytes > 0 )
{
*( bufout++ ) = ( unsigned char )( pr2six[( int )*bufin] << 2 | pr2six[( int )bufin[1]] >> 4 );
*( bufout++ ) = ( unsigned char )( pr2six[( int )bufin[1]] << 4 | pr2six[( int )bufin[2]] >> 2 );
*( bufout++ ) = ( unsigned char )( pr2six[( int )bufin[2]] << 6 | pr2six[( int )bufin[3]] );
bufin += 4;
nprbytes -= 4;
}
if( nprbytes & 03 )
{
if( pr2six[( int )bufin[-2]] > 63 )
nbytesdecoded -= 2;
else
nbytesdecoded -= 1;
}
bufplain[nbytesdecoded] = '\0';
}