uudecode.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:2k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: uudecode.c,v 1.9 1998/09/23 17:16:13 wessels Exp $
  3.  */
  4. #include "config.h"
  5. #include "util.h"
  6. extern char **environ;
  7. /* aaaack but it's fast and const should make it shared text page. */
  8. const int pr2six[256] =
  9. {
  10.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  11.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
  12.     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,
  13.     10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27,
  14.     28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
  15.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  16.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  17.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  18.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  19.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
  20.     64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  21. };
  22. char *
  23. uudecode(const char *bufcoded)
  24. {
  25.     int nbytesdecoded;
  26.     const unsigned char *bufin;
  27.     char *bufplain;
  28.     unsigned char *bufout;
  29.     int nprbytes;
  30.     /* Strip leading whitespace. */
  31.     while (*bufcoded == ' ' || *bufcoded == 't')
  32. bufcoded++;
  33.     /* Figure out how many characters are in the input buffer.
  34.      * Allocate this many from the per-transaction pool for the result.
  35.      */
  36.     bufin = (const unsigned char *) bufcoded;
  37.     while (pr2six[*(bufin++)] <= 63);
  38.     nprbytes = (char *) bufin - bufcoded - 1;
  39.     nbytesdecoded = ((nprbytes + 3) / 4) * 3;
  40.     bufplain = xmalloc(nbytesdecoded + 1);
  41.     bufout = (unsigned char *) bufplain;
  42.     bufin = (const unsigned char *) bufcoded;
  43.     while (nprbytes > 0) {
  44. *(bufout++) =
  45.     (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  46. *(bufout++) =
  47.     (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  48. *(bufout++) =
  49.     (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  50. bufin += 4;
  51. nprbytes -= 4;
  52.     }
  53.     if (nprbytes & 03) {
  54. if (pr2six[bufin[-2]] > 63)
  55.     nbytesdecoded -= 2;
  56. else
  57.     nbytesdecoded -= 1;
  58.     }
  59.     bufplain[nbytesdecoded] = '';
  60.     return bufplain;
  61. }