Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!ucla-cs!sdcrdcf!burdvax!bpa!cbmvax!vu-vlsi!pomona.bitnet!7gmadiso Tue Apr 7 01:27:12 1987 From: 7gmadiso@pomona.bitnet.UUCP Newsgroups: comp.sys.tandy Subject: Uuencode/decode utilities for the Model 4! Message-ID: <8704070131.AA03946@psuvax1.UUCP> Date: Mon, 6-Apr-87 13:56:00 EST Article-I.D.: psuvax1.8704070131.AA03946 Posted: Mon Apr 6 13:56:00 1987 Date-Received: Sat, 11-Apr-87 05:09:12 EST Lines: 901 Greetings, fellow Tandy users!! I have discovered the C source code for the UUCODE system of converting binary files to text files!! Unlike HEX/CMD, which produces an output file 200% the size of the original, UUCODE produces an output file only 130% the size of the original binary file -- quite a savings!! This post contains both the C source and a HEXified binary of both UUDECODE and UUENCODE. Note that the HEXified files are for the MODEL 4 ONLY!!!!! ********** UUDECODE ********** /* Only one of the following should be set to TRUE (1); others to 0 */ #define UNIX 0 #define VMS 0 #define TRS80 1 #if TRS80 #define perror(X) fprintf(stderr,"Unable to open file: %s\n", X); /* perror: "Prints a short message to stderr describing the last error encountered during a call to the operating system." */ #endif #ifndef lint static char sccsid | = "@(#)uudecode.c 5.1 (Berkeley) 7/2/83"; #endif /* * uudecode input| * * create the specified file, decoding as you go. * used with uuencode. */ #include #if UNIX | VMS #include /* UNIX password stuff */ #include /* under VMS, only used for time buffer */ #include /* file i/o stats */ #endif #line 29 /* single character decode */ #define DEC(c) (((c) - ' ') & 077) main(argc, argv) char **argv; { FILE *in, *out; #if UNIX | VMS struct stat sbuf; /* not used in this program!? */ #endif int mode; char dest 128|; char buf 80|; /* optional input arg */ if (argc > 1) { if ((in = fopen(argv 1|, "r")) == NULL) { perror(argv 1|); exit(1); } argv++; argc--; } else in = stdin; if (argc != 1) { printf("Usage: uudecode infile|\n"); exit(2); } /* search for header line */ for (;;) { if (fgets(buf, sizeof buf, in) == NULL) { fprintf(stderr, "No begin line\n"); exit(3); } if (strncmp(buf, "begin ", 6) == 0) break; } sscanf(buf, "begin %o %s", &mode, dest); #if UNIX /* handle ~user/file format */ if (dest 0| == '~') { char *sl; struct passwd *getpwnam(); char *index(); struct passwd *user; char dnbuf 100|; sl = index(dest, '/'); if (sl == NULL) { fprintf(stderr, "Illegal ~user\n"); exit(3); } *sl++ = 0; user = getpwnam(dest+1); if (user == NULL) { fprintf(stderr, "No such user as %s\n", dest); exit(4); } strcpy(dnbuf, user->pw_dir); strcat(dnbuf, "/"); strcat(dnbuf, sl); strcpy(dest, dnbuf); } #endif /* create output file */ out = fopen(dest, "w"); if (out == NULL) { perror(dest); exit(4); } #if UNIX chmod(dest, mode); /* changes file protection mode */ #endif decode(in, out); if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) { fprintf(stderr, "No end line\n"); exit(5); } exit(0); } /* * copy from in to out, decoding as you go along. */ decode(in, out) FILE *in; FILE *out; { char buf 80|; char *bp; int n; for (;;) { /* for each input line */ if (fgets(buf, sizeof buf, in) == NULL) { printf("Short file\n"); exit(10); } n = DEC(buf 0|); if (n <= 0) break; bp = &buf 1|; while (n > 0) { outdec(bp, out, n); bp += 4; n -= 3; } } } /* * output a group of 3 bytes (4 input characters). * the input chars are pointed to by p, they are to * be output to file f. n is used to tell us not to * output all of them at the end of the file. */ outdec(p, f, n) char *p; FILE *f; { int c1, c2, c3; c1 = DEC(*p) << 2 | DEC(p 1|) >> 4; c2 = DEC(p 1|) << 4 | DEC(p 2|) >> 2; c3 = DEC(p 2|) << 6 | DEC(p 3|); if (n >= 1) putc(c1, f); if (n >= 2) putc(c2, f); if (n >= 3) putc(c3, f); } /* fr: like read but stdio */ int fr(fd, buf, cnt) FILE *fd; char *buf; int cnt; { int c, i; for (i=0; i #if UNIX | VMS #include #include #endif /* ENC is the basic 1 character encoding function to make a char printing */ #define ENC(c) (((c) & 077) + ' ') main(argc, argv) char **argv; { FILE *in,*out; #if UNIX | VMS struct stat sbuf; #endif int mode; if (argc != 3) { fprintf(stderr,"Usage: uuencode infile outfile\n"); exit(2); } /* set input file */ if ((in = fopen(argv 1|, "r")) == NULL) { perror(argv 1|); exit(1); } /* set output file */ if ((out = fopen(argv 2|, "w")) == NULL) { perror(argv 2|); exit(1); } /* figure out the input file mode */ #if UNIX | VMS fstat(fileno(in), &sbuf); mode = sbuf.st_mode & 0777; #endif #if TRS80 mode = 0644 ; /* the standard value */ #endif fprintf(out,"begin %o %s\n", mode, argv 1|); encode(in, out); fprintf(out,"end\n"); exit(0); } /* * copy from in to out, encoding as you go along. */ encode(in, out) FILE *in; FILE *out; { char buf 80|; int i, n; for (;;) { /* 1 (up to) 45 character line */ n = fr(in, buf, 45); putc(ENC(n), out); for (i=0; i> 2; c2 = (*p << 4) & 060 | (p 1| >> 4) & 017; c3 = (p 1| << 2) & 074 | (p 2| >> 6) & 03; c4 = p 2| & 077; putc(ENC(c1), f); putc(ENC(c2), f); putc(ENC(c3), f); putc(ENC(c4), f); } /* fr: like read but stdio */ int fr(fd, buf, cnt) FILE *fd; char *buf; int cnt; { int c, i; for (i=0; i