home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / networking / uucp / amigauucpsrc / unix / uuencode.c < prev    next >
C/C++ Source or Header  |  1994-06-29  |  2KB  |  149 lines

  1.  
  2. /*
  3.  *  UUENCODE.C
  4.  *
  5.  *  $Header: Beta:src/uucp/src/compress/RCS/uuencode.c,v 1.1 90/02/02 11:48:04 dillon Exp Locker: dillon $
  6.  *
  7.  * uuencode [input] output
  8.  *
  9.  * Encode a file so it can be mailed to a remote system.
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include "version.h"
  14. #include "config.h"
  15.  
  16. IDENT(".00");
  17.  
  18. #ifdef UNIX
  19. # include <sys/types.h>
  20. # include <sys/stat.h>
  21. #endif
  22.  
  23. #ifdef VMS
  24. # include <types.h>
  25. # include <stat.h>
  26. #endif
  27.  
  28. /* ENC is the basic 1 character encoding function to make a char printing */
  29. #define ENC(c) (((c) & 077) + ' ')
  30.  
  31. void outdec();
  32. void encode();
  33. void xerror();
  34.  
  35. void
  36. main(argc, argv)
  37. char **argv;
  38. {
  39.     FILE *in;
  40. #ifdef UNIX | VMS
  41.     struct stat sbuf;
  42. #endif
  43.     int mode;
  44.  
  45.     /* optional 1st argument */
  46.     if (argc > 2) {
  47.         if ((in = fopen(argv[1], "r")) == NULL) {
  48.             xerror(argv[1]);
  49.             exit(1);
  50.         }
  51.         argv++; argc--;
  52.     } else
  53.         in = stdin;
  54.  
  55.     if (argc != 2) {
  56.         printf("Usage: uuencode [infile] remotefile\n");
  57.         exit(2);
  58.     }
  59.  
  60.     /* figure out the input file mode */
  61. #ifdef UNIX | VMS
  62.     fstat(fileno(in), &sbuf);
  63.     mode = sbuf.st_mode & 0777;
  64. #endif
  65.  
  66. #ifdef AMIGA
  67.     mode = 0777;
  68. #endif
  69.     printf("begin %o %s\n", mode, argv[1]);
  70.  
  71.     encode(in, stdout);
  72.  
  73.     printf("end\n");
  74.     exit(0);
  75. }
  76.  
  77. /*
  78.  * copy from in to out, encoding as you go along.
  79.  */
  80.  
  81. void
  82. encode(in, out)
  83. FILE *in;
  84. FILE *out;
  85. {
  86.     char buf[80];
  87.     int i, n;
  88.  
  89.     for (;;) {
  90.         /* 1 (up to) 45 character line */
  91.         n = fr(in, buf, 45);
  92.         putc(ENC(n), out);
  93.  
  94.         for (i=0; i<n; i += 3)
  95.             outdec(&buf[i], out);
  96.  
  97.         putc('X', out);
  98.         putc('\n', out);
  99.  
  100.         if (n <= 0)
  101.             break;
  102.     }
  103. }
  104.  
  105. /*
  106.  * output one group of 3 bytes, pointed at by p, on file f.
  107.  */
  108. void
  109. outdec(p, f)
  110. char *p;
  111. FILE *f;
  112. {
  113.     int c1, c2, c3, c4;
  114.  
  115.     c1 = *p >> 2;
  116.     c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
  117.     c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
  118.     c4 = p[2] & 077;
  119.     putc(ENC(c1), f);
  120.     putc(ENC(c2), f);
  121.     putc(ENC(c3), f);
  122.     putc(ENC(c4), f);
  123. }
  124.  
  125. /* fr: like read but stdio */
  126. int
  127. fr(fd, buf, cnt)
  128. FILE *fd;
  129. char *buf;
  130. int cnt;
  131. {
  132.     int c, i;
  133.  
  134.     for (i=0; i<cnt; i++) {
  135.         c = getc(fd);
  136.         if (c == EOF)
  137.             return(i);
  138.         buf[i] = c;
  139.     }
  140.     return (cnt);
  141. }
  142.  
  143. void
  144. xerror(err)
  145. char *err;
  146. {
  147.     printf("Can not open file \"%s\"\n", err);
  148. }
  149.