sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit aab53ef1972ca149f5e0371539d78d17ec89e3f5
parent 04a32251e413495b9aa1a5a727a17e76ce0d8b13
Author: sin <sin@2f30.org>
Date:   Fri, 31 Jan 2014 15:24:38 +0000

Add uuencode(1)

Diffstat:
MMakefile | 1+
Auuencode.1 | 16++++++++++++++++
Auuencode.c | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 94 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile @@ -85,6 +85,7 @@ SRC = \ tr.c \ true.c \ tty.c \ + uuencode.c \ uname.c \ uniq.c \ unlink.c \ diff --git a/uuencode.1 b/uuencode.1 @@ -0,0 +1,16 @@ +.TH UUENCODE 1 sbase\-VERSION +.SH NAME +uuencode \- encode a binary file +.SH SYNOPSIS +.B uuencode +.RI [file] +.RB name +.SH DESCRIPTION +.B uuencode +reads file (or by default, the standard input) and writes an encoded +version to the standard output. The encoding uses only printing ASCII +characters and includes the mode of the file and the operand name +for use by uudecode. +.SH NOTES +This version of uuencode does not currently support the base64 +encoding algorithm. diff --git a/uuencode.c b/uuencode.c @@ -0,0 +1,77 @@ +/* See LICENSE file for copyright and license details. */ +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include "util.h" + +static void uuencode(FILE *, const char *, const char *); + +static void +usage(void) +{ + eprintf("usage: %s [file] name\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + FILE *fp; + + ARGBEGIN { + case 'm': + eprintf("-m not implemented\n"); + default: + usage(); + } ARGEND; + + if (argc == 0 || argc > 2) + usage(); + + if (argc == 1) { + uuencode(stdin, argv[0], "<stdin>"); + } else { + if (!(fp = fopen(argv[0], "r"))) + eprintf("fopen %s:", argv[0]); + uuencode(fp, argv[1], argv[0]); + fclose(fp); + } + return EXIT_SUCCESS; +} + +static void +uuencode(FILE *fp, const char *name, const char *s) +{ + struct stat st; + unsigned char buf[80], *p; + ssize_t n; + int ch; + + if (fstat(fileno(fp), &st) < 0) + eprintf("fstat %s:", s); + fprintf(stdout, "begin %o %s\n", st.st_mode & 0777, name); + while ((n = fread(buf, 1, 45, fp))) { + ch = ' ' + (n & 0x3f); + fputc(ch == ' ' ? '`' : ch, stdout); + for (p = buf; n > 0; n -= 3, p += 3) { + if (n < 3) { + p[2] = '\0'; + if (n < 2) + p[1] = '\0'; + } + ch = ' ' + ((p[0] >> 2) & 0x3f); + fputc(ch == ' ' ? '`' : ch, stdout); + ch = ' ' + (((p[0] << 4) | ((p[1] >> 4) & 0xf)) & 0x3f); + fputc(ch == ' ' ? '`' : ch, stdout); + ch = ' ' + (((p[1] << 2) | ((p[2] >> 6) & 0x3)) & 0x3f); + fputc(ch == ' ' ? '`' : ch, stdout); + ch = ' ' + (p[2] & 0x3f); + fputc(ch == ' ' ? '`' : ch, stdout); + } + fputc('\n', stdout); + } + if (ferror(fp)) + eprintf("'%s' read error:", s); + fprintf(stdout, "%c\nend\n", '`'); +}