From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/uuencode.c | 146 ++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/uuencode.c (limited to 'reference/C/CONTRIB/SNIP/uuencode.c') diff --git a/reference/C/CONTRIB/SNIP/uuencode.c b/reference/C/CONTRIB/SNIP/uuencode.c new file mode 100755 index 0000000..d634134 --- /dev/null +++ b/reference/C/CONTRIB/SNIP/uuencode.c @@ -0,0 +1,146 @@ +/* uuencode.c */ + +/* +uudecode and uuencode are easily implemented under MSDOS as well. Here +are the sources for Microsoft C v3.0, but if you have another kind of C +compiler, there should be perhaps only 1 change -- the output file of +uudecode and the input file of uuencode must be in binary format. +(ie. binary files, like .EXE files may have byte patterns that are the +same as ^Z, which signals end-of-file in non-binary (text) mode). + + Don Kneller +UUCP: ...ucbvax!ucsfcgl!kneller +ARPA: kneller@ucsf-cgl.ARPA +BITNET: kneller@ucsfcgl.BITNET + + patched up for BC++ 3.1 by Alan Eldridge 10/12/92 + (UUCP: alane@wozzle.linet.org, FIDO: 1:272/38.473) + +*/ + +#ifndef lint +#ifndef MSDOS +static char sccsid[] = "@(#)uuencode.c 5.1 (Berkeley) 7/2/83"; +#endif +#endif + +/* + * uuencode [input] output + * + * Encode a file so it can be mailed to a remote system. + */ + +#include +#include +#include +#include + +/* ENC is the basic 1 character encoding function to make a char printing */ + +#define ENC(c) (((c) & 077) + ' ') + +void encode(FILE *in, FILE *out); +void outdec(char *p, FILE *f); +int fr(FILE *fd, char *buf, int cnt); + +main(int argc, char *argv[]) +{ + FILE *in; + struct stat sbuf; + int mode; + + /* optional 1st argument */ + + if (argc > 2) + { +#ifdef MSDOS + /* Use binary mode */ + if ((in = fopen(argv[1], "rb")) == NULL) + { +#else + if ((in = fopen(argv[1], "r")) == NULL) + { +#endif + perror(argv[1]); + exit(1); + } + argv++; argc--; + } + else in = stdin; + + if (argc != 2) + { + printf("Usage: uuencode [infile] remotefile\n"); + exit(2); + } + + /* figure out the input file mode */ + + fstat(fileno(in), &sbuf); + mode = sbuf.st_mode & 0777; + printf("begin %o %s\n", mode, argv[1]); + + encode(in, stdout); + + printf("end\n"); + return 0; +} + +/* + * copy from in to out, encoding as you go along. + */ + +void encode(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 < n; i += 3) + outdec(&buf[i], out); + + putc('\n', out); + if (n <= 0) + break; + } +} + +/* + * output one group of 3 bytes, pointed at by p, on file f. + */ + +void outdec(char *p, FILE *f) +{ + int c1, c2, c3, c4; + + c1 = *p >> 2; + c2 = ((p[0] << 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(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] = (char)c; + } + return (cnt); +} -- cgit v1.2.3-54-g00ecf