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

    Add uuencode(1)

diff --git a/Makefile b/Makefile
index 8a6790e..f8469df 100644
--- 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
new file mode 100644
index 0000000..06ced88
--- /dev/null
+++ 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
new file mode 100644
index 0000000..a400180
--- /dev/null
+++ 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
", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+       FILE *fp;
+
+       ARGBEGIN {
+       case 'm':
+               eprintf("-m not implemented
");
+       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
", 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] = '

Reply via email to