commit aab53ef1972ca149f5e0371539d78d17ec89e3f5
parent 04a32251e413495b9aa1a5a727a17e76ce0d8b13
Author: sin <sin@2f30.org>
Date: Fri, 31 Jan 2014 15:24:38 +0000
Add uuencode(1)
Diffstat:
M | Makefile | | | 1 | + |
A | uuencode.1 | | | 16 | ++++++++++++++++ |
A | uuencode.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", '`');
+}