*(bufout++) = (unsigned char) (DEC(*bufin) << 2 | DEC(bufin[1]) >> 4); *(bufout++) = (unsigned char) (DEC(bufin[1]) << 4 | DEC(bufin[2]) >> 2); *(bufout++) = (unsigned char) (DEC(bufin[2]) << 6 | DEC(bufin[3]));
*(bufout++) = UCH((DEC(bufin[0]) << 2) | (DEC(bufin[1]) >> 4)); *(bufout++) = UCH((DEC(bufin[1]) << 4) | (DEC(bufin[2]) >> 2)); *(bufout++) = UCH((DEC(bufin[2]) << 6) | (DEC(bufin[3])));
PUBLIC int HTUU_decode ARGS3(char *,		bufcoded,			     unsigned char *,	bufplain,			     int,		outbufsize){/* single character decode */#define DEC(c) pr2six[(int)c]#define MAXVAL 63   static int first = 1;   int nbytesdecoded, j;   register char *bufin = bufcoded;   register unsigned char *bufout = bufplain;   register int nprbytes;   /* If this is the first call, initialize the mapping table.    * This code should work even on non-ASCII machines.    */   if(first) {      first = 0;      for(j=0; j<256; j++) pr2six[j] = MAXVAL+1;      for(j=0; j<64; j++) pr2six[(unsigned char)six2pr[j]] = (unsigned char)j;#if 0      pr2six['A']= 0; pr2six['B']= 1; pr2six['C']= 2; pr2six['D']= 3;      pr2six['E']= 4; pr2six['F']= 5; pr2six['G']= 6; pr2six['H']= 7;      pr2six['I']= 8; pr2six['J']= 9; pr2six['K']=10; pr2six['L']=11;      pr2six['M']=12; pr2six['N']=13; pr2six['O']=14; pr2six['P']=15;      pr2six['Q']=16; pr2six['R']=17; pr2six['S']=18; pr2six['T']=19;      pr2six['U']=20; pr2six['V']=21; pr2six['W']=22; pr2six['X']=23;      pr2six['Y']=24; pr2six['Z']=25; pr2six['a']=26; pr2six['b']=27;      pr2six['c']=28; pr2six['d']=29; pr2six['e']=30; pr2six['f']=31;      pr2six['g']=32; pr2six['h']=33; pr2six['i']=34; pr2six['j']=35;      pr2six['k']=36; pr2six['l']=37; pr2six['m']=38; pr2six['n']=39;      pr2six['o']=40; pr2six['p']=41; pr2six['q']=42; pr2six['r']=43;      pr2six['s']=44; pr2six['t']=45; pr2six['u']=46; pr2six['v']=47;      pr2six['w']=48; pr2six['x']=49; pr2six['y']=50; pr2six['z']=51;      pr2six['0']=52; pr2six['1']=53; pr2six['2']=54; pr2six['3']=55;      pr2six['4']=56; pr2six['5']=57; pr2six['6']=58; pr2six['7']=59;      pr2six['8']=60; pr2six['9']=61; pr2six['+']=62; pr2six['/']=63;#endif   }   /* 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[(unsigned char)*(bufin++)] <= MAXVAL);   nprbytes = bufin - bufcoded - 1;   nbytesdecoded = ((nprbytes+3)/4) * 3;   if(nbytesdecoded > outbufsize) {      nprbytes = (outbufsize*4)/3;   }   bufin = bufcoded;   while (nprbytes > 0) {      *(bufout++) = (unsigned char) (DEC(*bufin) << 2 | DEC(bufin[1]) >> 4);      *(bufout++) = (unsigned char) (DEC(bufin[1]) << 4 | DEC(bufin[2]) >> 2);      *(bufout++) = (unsigned char) (DEC(bufin[2]) << 6 | DEC(bufin[3]));      bufin += 4;      nprbytes -= 4;   }   if(nprbytes & 03) {      if(pr2six[(int)bufin[-2]] > MAXVAL) {         nbytesdecoded -= 2;      } else {         nbytesdecoded -= 1;      }   }   return(nbytesdecoded);}