uucode.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. /* ENC is the basic 1 character encoding function to make a char printing */
  15. /* DEC is single character decode */
  16. #define ENC(c) ((c) ? ((c) & 077) + ' ': '`')
  17. #define DEC(c) (((c) - ' ') & 077)
  18. /*
  19.  * copy from in to out, encoding as you go along.
  20.  */
  21. void
  22. uuencode(const char * data, int dataLen, FILE * out)
  23. {
  24.   int ch, n;
  25.   const char *p = data;
  26.   fprintf(out, "beginn");
  27.   
  28.   while (dataLen > 0){
  29.     n = dataLen > 45 ? 45 : dataLen;
  30.     dataLen -= n;
  31.     ch = ENC(n);
  32.     if (putc(ch, out) == EOF)
  33.       break;
  34.     for (; n > 0; n -= 3, p += 3) {
  35.       char p_0 = * p;
  36.       char p_1 = 0;
  37.       char p_2 = 0;
  38.       if(n >= 2){
  39. p_1 = p[1];
  40.       }
  41.       if(n >= 3){
  42. p_2 = p[2];
  43.       }
  44.       
  45.       ch = p_0 >> 2;
  46.       ch = ENC(ch);
  47.       if (putc(ch, out) == EOF)
  48. break;
  49.       ch = ((p_0 << 4) & 060) | ((p_1 >> 4) & 017);
  50.       ch = ENC(ch);
  51.       if (putc(ch, out) == EOF)
  52. break;
  53.       ch = ((p_1 << 2) & 074) | ((p_2 >> 6) & 03);
  54.       ch = ENC(ch);
  55.       if (putc(ch, out) == EOF)
  56. break;
  57.       ch = p_2 & 077;
  58.       ch = ENC(ch);
  59.       if (putc(ch, out) == EOF)
  60. break;
  61.     }
  62.     if (putc('n', out) == EOF)
  63.       break;
  64.   }
  65.   ch = ENC('');
  66.   putc(ch, out);
  67.   putc('n', out);
  68.   fprintf(out, "endn");
  69. }
  70. int
  71. uudecode(FILE * input, char * outBuf, int bufLen){
  72.   int n;
  73.   char ch, *p, returnCode;
  74.   char buf[255];
  75.   returnCode = 0;
  76.   /* search for header line */
  77.   do {
  78.     if (!fgets(buf, sizeof(buf), input)) {
  79.       return 1;
  80.     }
  81.   } while (strncmp(buf, "begin", 5));
  82.   
  83.   /* for each input line */
  84.   for (;;) {
  85.     if (!fgets(p = buf, sizeof(buf), input)) {
  86.       return 1;
  87.     }
  88.     /*
  89.      * `n' is used to avoid writing out all the characters
  90.      * at the end of the file.
  91.      */
  92.     if ((n = DEC(*p)) <= 0)
  93.       break;
  94.     if(n >= bufLen){
  95.       returnCode = 1;
  96.       break;
  97.     }
  98.     for (++p; n > 0; p += 4, n -= 3)
  99.       if (n >= 3) {
  100. ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;
  101. * outBuf = ch; outBuf++; bufLen--;
  102. ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
  103. * outBuf = ch; outBuf++; bufLen--;
  104. ch = DEC(p[2]) << 6 | DEC(p[3]);
  105. * outBuf = ch; outBuf++; bufLen--;
  106.       } else {
  107. if (n >= 1) {
  108.   ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;
  109.   * outBuf = ch; outBuf++; bufLen--;
  110. }
  111. if (n >= 2) {
  112.   ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
  113.   * outBuf = ch; outBuf++; bufLen--;
  114. }
  115. if (n >= 3) {
  116.   ch = DEC(p[2]) << 6 | DEC(p[3]);
  117.   * outBuf = ch; outBuf++; bufLen--;
  118. }
  119.       }
  120.   }
  121.   if (!fgets(buf, sizeof(buf), input) || strcmp(buf, "endn")) {
  122.     return 1;
  123.   }
  124.   return returnCode;
  125. }
  126. int 
  127. uuencode_mem(char * dst, const char * data, int dataLen)
  128. {
  129.   int sz = 0;
  130.   int ch, n;
  131.   const char *p = data;
  132.   
  133.   while (dataLen > 0){
  134.     n = dataLen > 45 ? 45 : dataLen;
  135.     dataLen -= n;
  136.     ch = ENC(n);
  137.     * dst = ch; dst++; sz++;
  138.     for (; n > 0; n -= 3, p += 3) {
  139.       char p_0 = * p;
  140.       char p_1 = 0;
  141.       char p_2 = 0;
  142.       if(n >= 2){
  143. p_1 = p[1];
  144.       }
  145.       if(n >= 3){
  146. p_2 = p[2];
  147.       }
  148.       
  149.       ch = p_0 >> 2;
  150.       ch = ENC(ch);
  151.       * dst = ch; dst++; sz++;
  152.       ch = ((p_0 << 4) & 060) | ((p_1 >> 4) & 017);
  153.       ch = ENC(ch);
  154.       * dst = ch; dst++; sz++;
  155.       ch = ((p_1 << 2) & 074) | ((p_2 >> 6) & 03);
  156.       ch = ENC(ch);
  157.       * dst = ch; dst++; sz++;
  158.       ch = p_2 & 077;
  159.       ch = ENC(ch);
  160.       * dst = ch; dst++; sz++;
  161.     }
  162.     
  163.     * dst = 'n'; dst++; sz++;
  164.   }
  165.   ch = ENC('');
  166.   * dst = ch; dst++; sz++;
  167.   
  168.   * dst = 'n'; dst++; sz++;
  169.   * dst = 0;    dst++; sz++;
  170.   
  171.   return sz;
  172. }
  173. int
  174. uudecode_mem(char * outBuf, int bufLen, const char * src){
  175.   int n;
  176.   char ch;
  177.   int sz = 0;
  178.   const char * p = src;
  179.   /*
  180.    * `n' is used to avoid writing out all the characters
  181.    * at the end of the file.
  182.    */
  183.   if ((n = DEC(*p)) <= 0)
  184.     return 0;
  185.   if(n >= bufLen){
  186.     return -1;
  187.   }
  188.   for (++p; n > 0; p += 4, n -= 3){
  189.     if (n >= 3) {
  190.       ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;
  191.       * outBuf = ch; outBuf++; bufLen--; sz++;
  192.       ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
  193.       * outBuf = ch; outBuf++; bufLen--; sz++;
  194.       ch = DEC(p[2]) << 6 | DEC(p[3]);
  195.       * outBuf = ch; outBuf++; bufLen--; sz++;
  196.     } else {
  197.       if (n >= 1) {
  198. ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4;
  199. * outBuf = ch; outBuf++; bufLen--; sz++;
  200.       }
  201.       if (n >= 2) {
  202. ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
  203. * outBuf = ch; outBuf++; bufLen--; sz++;
  204.       }
  205.       if (n >= 3) {
  206. ch = DEC(p[2]) << 6 | DEC(p[3]);
  207. * outBuf = ch; outBuf++; bufLen--; sz++;
  208.       }
  209.     }
  210.   }
  211.   return sz;
  212. }