home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / comp / os / vms / 17876 < prev    next >
Encoding:
Text File  |  1992-11-12  |  7.8 KB  |  349 lines

  1. Path: sparky!uunet!stanford.edu!agate!ucbvax!mcimail.com!0005066432
  2. From: 0005066432@mcimail.com ("Tansin A. Darcos & Company")
  3. Newsgroups: comp.os.vms
  4. Subject: UUENCODE and UUDECODE
  5. Message-ID: <20921112185302.0005066432ND3EM@mcimail.com>
  6. Date: 12 Nov 92 18:53:00 GMT
  7. Sender: daemon@ucbvax.BERKELEY.EDU
  8. Distribution: world
  9. Organization: The Internet
  10. Lines: 337
  11.  
  12. I have used the UUDECODE portion of these two to decode files I've gotten
  13. in the mail, so I know that works; I've not had to use the ENCODE part,
  14. so I don't know if it does, but here it is.  
  15.  
  16. Paul Robinson.
  17.  
  18. ---- Cut here -----
  19. /*
  20.  * uuencode [input]
  21.  *
  22.  * Encode a file so it can be mailed to a remote system.
  23.  * 
  24.  * Instructions for use are really quite simple. Type 
  25.  * uuencode foo.exe >bar.txt
  26.  * 
  27.  * bar.txt can then be read by uudecode to generate foo.exe by typing
  28.  * uudecode bar.txt
  29.  *
  30.  * Compiles under Turbo C v2.0 NO PROBLEM..
  31.  *
  32.  * If you have a problem, contact me IMMEDIATELY..I want this to work.
  33.  */
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <fcntl.h>
  37. #include <io.h>
  38. #include <sys/types.h>
  39. #include <sys/stat.h>
  40.  
  41. void encode(FILE *, FILE *);
  42. int fr(FILE *, char *, int);
  43. void outdec(char *, FILE *);
  44.  
  45. /* ENC is the basic 1 character encoding function to make a char printing */
  46. #define ENC(c) (char) (((c) & 077) + ' ')
  47.  
  48. void main(argc, argv)
  49. char **argv;
  50. {
  51.         FILE *in;
  52.         struct stat sbuf;
  53.         int mode;
  54.  
  55.         /* optional 1st argument */
  56.         if (argc > 1) {
  57.                 if ((in = fopen(argv[1], "r")) == NULL) {
  58.                         perror(argv[1]);
  59.                         exit(1);
  60.                 }
  61.                 argv++; argc--;
  62.         } else
  63.                 in = stdin;
  64.  
  65.         if (setmode(fileno(in), (int) O_BINARY) == -1)
  66.           {
  67.            perror(argv[1]);
  68.            exit(1);
  69.           }
  70.  
  71.         if (argc != 1) {
  72.                 printf("Usage: uuencode [infile] >remotefile\n");
  73.                 exit(2);
  74.         }
  75.  
  76.         /* figure out the input file mode */
  77.         fstat(fileno(in), &sbuf);
  78.         mode = sbuf.st_mode & 0777;
  79.         printf("begin %o %s\n", mode, argv[0]);
  80.  
  81.         encode(in, stdout);
  82.  
  83.         printf("end\n");
  84.         exit(0);
  85. }
  86.  
  87. /*
  88.  * copy from in to out, encoding as you go along.
  89.  */
  90. void encode(in, out)
  91. FILE *in;
  92. FILE *out;
  93. {
  94.         char buf[80];
  95.         int i, n;
  96.  
  97.         for (;;) {
  98.                 /* 1 (up to) 45 character line */
  99.                 n = fr(in, buf, 45);
  100.                 putc(ENC(n), out);
  101.  
  102.                 for (i=0; i<n; i += 3)
  103.                         outdec(&buf[i], out);
  104.  
  105.                 putc('\n', out);
  106.                 if (n <= 0)
  107.                         break;
  108.         }
  109. }
  110.  
  111. /*
  112.  * output one group of 3 bytes, pointed at by p, on file f.
  113.  */
  114. void outdec(p, f)
  115. char *p;
  116. FILE *f;
  117. {
  118.         int c1, c2, c3, c4;
  119.  
  120.         c1 = *p >> 2;
  121.         c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
  122.         c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
  123.         c4 = p[2] & 077;
  124.         putc(ENC(c1), f);
  125.         putc(ENC(c2), f);
  126.         putc(ENC(c3), f);
  127.         putc(ENC(c4), f);
  128. }
  129.  
  130. /* fr: like read but stdio */
  131. int
  132. fr(fd, buf, cnt)
  133. FILE *fd;
  134. char *buf;
  135. int cnt;
  136. {
  137.         int c, i;
  138.  
  139.         for (i=0; i<cnt; i++) {
  140.                 c = getc(fd);
  141.                 if (c == EOF)
  142.                         return(i);
  143.                 buf[i] = (char) c;
  144.         }
  145.         return (cnt);
  146. }
  147.  
  148. --- Cut Here ---
  149. Decode Follows 
  150. --- Cut Here ---
  151. /*
  152.  * uudecode input
  153.  *
  154.  * create the specified file, decoding as you go.
  155.  * used with uuencode.
  156.  */
  157. #include <stdio.h>
  158. #include <stdlib.h>
  159. #include <io.h>
  160. #include <fcntl.h>
  161. #include <string.h>
  162.  
  163. #ifndef MSDOS
  164. #include <pwd.h>
  165. #endif
  166.  
  167. #include <sys/types.h>
  168. #include <sys/stat.h>
  169.  
  170. void decode(FILE *, FILE *);
  171. void outdec(char *, FILE *, int);
  172. char *index(char *, char);
  173. int fr(FILE *, char *, int);
  174.  
  175. /* single character decode */
  176. #define DEC(c)  (((c) - ' ') & 077)
  177.  
  178. void main(argc, argv)
  179. char **argv;
  180. {
  181.         FILE *in, *out;
  182.         struct stat sbuf;
  183.         int mode;
  184.         char dest[128];
  185.         char buf[80];
  186.  
  187.         /* optional input arg */
  188.         if (argc > 1) {
  189.                 if ((in = fopen(argv[1], "r")) == NULL) {
  190.                         perror(argv[1]);
  191.                         exit(1);
  192.                 }
  193.                 argv++; argc--;
  194.         } else
  195.                 in = stdin;
  196.  
  197.         if (argc != 1) {
  198.                 printf("Usage: uudecode [infile]\n");
  199.                 exit(2);
  200.         }
  201.  
  202.         /* search for header line */
  203.         for (;;) {
  204.                 if (fgets(buf, sizeof buf, in) == NULL) {
  205.                         fprintf(stderr, "No begin line\n");
  206.                         exit(3);
  207.                 }
  208.                 if (strncmp(buf, "begin ", 6) == 0)
  209.                         break;
  210.         }
  211.         sscanf(buf, "begin %o %s", &mode, dest);
  212.  
  213. #ifndef MSDOS
  214.         /* handle ~user/file format */
  215.         if (dest[0] == '~') {
  216.                 char *sl;
  217.                 struct passwd *getpwnam();
  218.                 char *index();
  219.                 struct passwd *user;
  220.                 char dnbuf[100];
  221.  
  222.                 sl = index(dest, '/');
  223.                 if (sl == NULL) {
  224.                         fprintf(stderr, "Illegal ~user\n");
  225.                         exit(3);
  226.                 }
  227.                 *sl++ = 0;
  228.                 user = getpwnam(dest+1);
  229.                 if (user == NULL) {
  230.                         fprintf(stderr, "No such user as %s\n", dest);
  231.                         exit(4);
  232.                 }
  233.                 strcpy(dnbuf, user->pw_dir);
  234.                 strcat(dnbuf, "/");
  235.                 strcat(dnbuf, sl);
  236.                 strcpy(dest, dnbuf);
  237.         }
  238. #endif
  239.  
  240.         /* create output file */
  241.         out = fopen(dest, "w");
  242.         if (out == NULL) {
  243.                 perror(dest);
  244.                 exit(4);
  245.         }
  246.         setmode(fileno(out), (int) O_BINARY);
  247.         chmod(dest, mode);
  248.  
  249.         decode(in, out);
  250.  
  251.         if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) {
  252.                 fprintf(stderr, "No end line\n");
  253.                 exit(5);
  254.         }
  255.         exit(0);
  256. }
  257.  
  258. /*
  259.  * copy from in to out, decoding as you go along.
  260.  */
  261. void decode(in, out)
  262. FILE *in;
  263. FILE *out;
  264. {
  265.         char buf[80];
  266.         char *bp;
  267.         int n;
  268.  
  269.         for (;;) {
  270.                 /* for each input line */
  271.                 if (fgets(buf, sizeof buf, in) == NULL) {
  272.                         printf("Short file\n");
  273.                         exit(10);
  274.                 }
  275.                 n = DEC(buf[0]);
  276.                 if (n <= 0)
  277.                         break;
  278.  
  279.                 bp = &buf[1];
  280.                 while (n > 0) {
  281.                         outdec(bp, out, n);
  282.                         bp += 4;
  283.                         n -= 3;
  284.                 }
  285.         }
  286. }
  287.  
  288. /*
  289.  * output a group of 3 bytes (4 input characters).
  290.  * the input chars are pointed to by p, they are to
  291.  * be output to file f.  n is used to tell us not to
  292.  * output all of them at the end of the file.
  293.  */
  294. void outdec(p, f, n)
  295. char *p;
  296. FILE *f;
  297. {
  298.         int c1, c2, c3;
  299.  
  300.         c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
  301.         c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
  302.         c3 = DEC(p[2]) << 6 | DEC(p[3]);
  303.         if (n >= 1)
  304.                 putc((char) c1, f);
  305.         if (n >= 2)
  306.                 putc((char) c2, f);
  307.         if (n >= 3)
  308.                 putc((char) c3, f);
  309. }
  310.  
  311.  
  312. /* fr: like read but stdio */
  313. int
  314. fr(fd, buf, cnt)
  315. FILE *fd;
  316. char *buf;
  317. int cnt;
  318. {
  319.         int c, i;
  320.  
  321.         for (i=0; i<cnt; i++) {
  322.                 c = getc(fd);
  323.                 if (c == EOF)
  324.                         return(i);
  325.                 buf[i] = (char) c;
  326.         }
  327.         return (cnt);
  328. }
  329.  
  330. /*
  331.  * Return the ptr in sp at which the character c appears;
  332.  * NULL if not found
  333.  */
  334.  
  335. char *
  336. index(sp, c)
  337. register char *sp, c;
  338. {
  339.         do {
  340.                 if (*sp == c)
  341.                         return(sp);
  342.         } while (*sp++);
  343.         return(NULL);
  344.  
  345. ---cut here---
  346. Paul Robinson -- TDARCOS@MCIMAIL.COM
  347.  
  348.