pete@wlbr.EATON.COM (Pete Lyall) (07/30/87)
These are the sources for 'uuencode' and 'uudecode' that I recently
posted to this group. - PWL
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# uudecode.c
# uuencode.c
# This archive created: Thu Jul 30 11:21:39 1987
export PATH; PATH=/bin:$PATH
if test -f 'uudecode.c'
then
echo shar: will not over-write existing file "'uudecode.c'"
else
sed 's/^X//' << \SHAR_EOF > 'uudecode.c'
X/*
X** uudecode [input]
X**
X** create the specified file, decoding as you go.
X** used with uuencode.
X*/
X
X#include <stdio.h>
X
X#define DEC(c) (((c) - ' ')&077) /* single character decode */
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X {
X FILE *in, *out;
X char dest[128], buf[80];
X
X if (argc > 1)
X {
X if ((in = fopen(argv[1], "r")) == NULL)
X {
X fprintf(stderr, "can't open %s\n", argv[1]);
X exit(1);
X }
X argv++;
X argc--;
X }
X else
X in = stdin;
X if (argc != 1)
X {
X fprintf(stderr, "Usage: uudecode [infile]\n");
X exit(2);
X }
X for (; ; ) /* search for header line */
X {
X if (fgets(buf, sizeof buf, in) == NULL)
X {
X fprintf(stderr, "No begin line\n");
X exit(3);
X }
X if (strncmp(buf, "begin ", 6) == 0)
X break;
X }
X sscanf(buf, "begin %s", dest);
X if ((out = fopen(dest, "w")) == NULL) /* create output file */
X {
X fprintf(stderr, "can't open %s\n", dest);
X exit(4);
X }
X
X decode(in, out);
X if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n"))
X {
X fprintf(stderr, "No end line\n");
X exit(5);
X }
X exit(0);
X }
X/*page*/
X/*
X** copy from in to out, decoding as you go along.
X*/
X
Xdecode(in, out)
XFILE *in;
XFILE *out;
X {
X char buf[80];
X char *bp;
X int n;
X
X for (; ; ) /* for each input line */
X {
X if (fgets(buf, sizeof buf, in) == NULL)
X {
X printf("Short file\n");
X exit(10);
X }
X n = DEC(buf[0]);
X if (n <= 0)
X break;
X
X bp = &buf[1];
X while (n > 0)
X {
X outdec(bp, out, n);
X bp += 4;
X n -= 3;
X }
X }
X }
X
X
X/*
X** output a group of 3 bytes (4 input characters).
X** the input chars are pointed to by p, they are to
X** be output to file f. n is used to tell us not to
X** output all of them at the end of the file.
X*/
X
Xoutdec(p, f, n)
Xchar *p;
XFILE *f;
Xint n;
X {
X int c1, c2, c3;
X
X c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
X c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
X c3 = DEC(p[2]) << 6 | DEC(p[3]);
X if (n >= 1)
X putc(c1, f);
X if (n >= 2)
X putc(c2, f);
X if (n >= 3)
X putc(c3, f);
X }
SHAR_EOF
fi # end of overwriting check
if test -f 'uuencode.c'
then
echo shar: will not over-write existing file "'uuencode.c'"
else
sed 's/^X//' << \SHAR_EOF > 'uuencode.c'
X/*
X** uuencode input >output
X**
X** Encode a file so it can be mailed to a remote system.
X*/
X
X#include <stdio.h>
X
X/* ENC is the basic 1 character encoding function to make a char printing
X*/
X#define ENC(c) (((c)&077) + ' ')
X
Xmain(argc, argv)
Xchar **argv;
X {
X FILE *in;
X char sbuf[32], *mod = argv[0];
X
X if (argc != 2)
X {
X fprintf(stderr, "%s: Usage: uuencode infile\n", mod);
X exit(2);
X }
X
X if ((in = fopen(argv[1], "r")) == NULL)
X {
X fprintf(stderr, "%s: Can't open %s\n", mod, argv[1]);
X exit(1);
X }
X
X printf("begin %s\n", argv[1]);
X
X encode(in, stdout);
X
X printf("end\n");
X exit(0);
X }
X/*page*/
X/*
X** copy from in to out, encoding as you go along.
X*/
Xencode(in, out)
XFILE *in;
XFILE *out;
X {
X char buf[80];
X int i, n;
X
X for (; ; )
X {
X /* 1 (up to) 45 character line */
X n = fr(in, buf, 45);
X putc(ENC(n), out);
X
X for (i = 0; i < n; i += 3)
X outdec(&buf[i], out);
X
X putc('\n', out);
X if (n <= 0)
X break;
X }
X }
X
X/*
X** output one group of 3 bytes, pointed at by p, on file f.
X*/
Xoutdec(p, f)char *p;
XFILE *f;
X {
X int c1, c2, c3, c4;
X
X c1 = *p >> 2;
X c2 = (*p << 4)&060 | (p[1] >> 4)&017;
X c3 = (p[1] << 2)&074 | (p[2] >> 6)&03;
X c4 = p[2] & 077;
X putc(ENC(c1), f);
X putc(ENC(c2), f);
X putc(ENC(c3), f);
X putc(ENC(c4), f);
X }
X
X/* fr: like read but stdio */
Xfr(fd, buf, cnt)
XFILE *fd;
Xchar *buf;
Xint cnt;
X {
X int c, i;
X
X for (i = 0; i < cnt; i++)
X {
X c = getc(fd);
X if (c == EOF)
X return (i);
X buf[i] = c;
X }
X return (cnt);
X }
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
--
Pete Lyall
Usenet: {trwrb, scgvaxd, ihnp4, voder, vortex}!wlbr!pete
Compuserve: 76703,4230 (OS9 Sysop) OS9 (home): (805)-985-0632 (24hr./1200 baud)