[net.sources] UUDECODE C source, if you need UUDECODE - here it is!!!!

jrm@cblpe.UUCP (John Miller) (11/04/86)

I have had trouble returning mail to some of you (no I didn't ignore your
request) and there have been too many requests to handle. Therefore,
here is the UUdecode source file.


Here is the C source for uudecode.c.

John Miller, Columbus Bell Labs
ihnp4!cblpe!jrm



================================cut here=======================================
#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 <stdio.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>

/* single character decode */
#define DEC(c)	(((c) - ' ') & 077)

main(argc, argv)
char **argv;
{
	FILE *in, *out;
	struct stat sbuf;
	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);

	/* 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);
	}

	/* create output file */
	out = fopen(dest, "w");
	if (out == NULL) {
		perror(dest);
		exit(4);
	}
	chmod(dest, mode);

	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<cnt; i++) {
		c = getc(fd);
		if (c == EOF)
			return(i);
		buf[i] = c;
	}
	return (cnt);
}

/*
 * Return the ptr in sp at which the character c appears;
 * NULL if not found
 */

#define	NULL	0

char *
index(sp, c)
register char *sp, c;
{
	do {
		if (*sp == c)
			return(sp);
	} while (*sp++);
	return(NULL);
}
-- 


             ___
            (o o)
             -v-       j.r. miller, at&t bell labs, columbus, oh
             |||    		(614) 860-4314

mac@esl.UUCP (Mike McNamara) (11/07/86)

In article <282@cblpe.UUCP> jrm@cblpe.UUCP (John Miller) writes:
>I have had trouble returning mail to some of you (no I didn't ignore your
>request) and there have been too many requests to handle. Therefore,
>here is the UUdecode source file.
>
>
>Here is the C source for uudecode.c.
>
>John Miller, Columbus Bell Labs
>ihnp4!cblpe!jrm
>
>
>
>================================cut here=======================================
>#ifndef lint
>static char sccsid[] = "@(#)uudecode.c	5.1 (Berkeley) 7/2/83";
>#endif
>

	Hmm, did you ask berkeley if you could distribute this to the
	world? seems like I'd need an ATT Version 7 & BSD 4.2 license
	to use this code...(legally)


-- 
------------------------------------+
| Michael Mc Namara                 |
| ESL Incorporated                  |
| ARPA: mac%esl.UUCP@ames.ARPA      |
------------------------------------+----------------------->[]

simon@einode.UUCP (Simon Kenyon) (11/07/86)

> I have had trouble returning mail to some of you (no I didn't ignore your
> request) and there have been too many requests to handle. Therefore,
> here is the UUdecode source file.
> Here is the C source for uudecode.c.
> John Miller, Columbus Bell Labs
> ihnp4!cblpe!jrm
> ================================cut here=======================================
> #ifndef lint
> static char sccsid[] = "@(#)uudecode.c	5.1 (Berkeley) 7/2/83";
> #endif
did you get permission from Berkeley to publish licenced source code?
-- 
Simon Kenyon
EUnet: simon@einode.UUCP
Smail: The National Software Centre, Dublin, IRELAND
Phone: +353-1-716255
EUnet is a registered trademark of the EUUG

cire@hpisoa1.HP.COM (Eric B. Decker) (11/11/86)

> / hpisoa1:net.sources / mac@esl.UUCP (Mike McNamara) /  4:43 pm  Nov  6, 1986 /
> In article <282@cblpe.UUCP> jrm@cblpe.UUCP (John Miller) writes:
> >I have had trouble returning mail to some of you (no I didn't ignore your
> >request) and there have been too many requests to handle. Therefore,
> >here is the UUdecode source file.
> >
> >
> >Here is the C source for uudecode.c.
> >static char sccsid[] = "@(#)uudecode.c	5.1 (Berkeley) 7/2/83";
> >#endif
> >
> 
> 	Hmm, did you ask berkeley if you could distribute this to the
> 	world? seems like I'd need an ATT Version 7 & BSD 4.2 license
> 	to use this code...(legally)
> 

I believe that is not necessary.  Uuencode and uudecode are in the
public domain per the folks who wrote it.  Namely, Horton or
one of those folks when they were at Berkeley.  I am not totally
(like to the max) positive this is correct but almost certain.

> 
> -- 
> ------------------------------------+
> | Michael Mc Namara                 |
> | ESL Incorporated                  |
> | ARPA: mac%esl.UUCP@ames.ARPA      |
> ------------------------------------+----------------------->[]
> ----------


eric

Eric B. Decker
Hewlett-Packard (ITG/IHO)
Cupertino, California

Unix Mail: {ucbvax | hpfcla | hplabs}!hpda!cire
uSnail:    Bldg 44UF, 19447 Pruneridge Ave., Cupertino, CA.  95014
Phone :    outside (408) 447-6294, telnet 125-6294

rbj@icst-cmr.arpa (Root Boy Jim) (11/14/86)

uu{en,de}code are in my understanding Public Domain.
It would be nice if Berkeley said so.

	(Root Boy) Jim Cottrell		<rbj@icst-cmr.arpa>
I left my WALLET in the BATHROOM!!