Add uuencode(1)

This commit is contained in:
sin 2014-01-31 15:24:38 +00:00
parent 04a32251e4
commit aab53ef197
3 changed files with 94 additions and 0 deletions

View File

@ -85,6 +85,7 @@ SRC = \
tr.c \ tr.c \
true.c \ true.c \
tty.c \ tty.c \
uuencode.c \
uname.c \ uname.c \
uniq.c \ uniq.c \
unlink.c \ unlink.c \

16
uuencode.1 Normal file
View File

@ -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.

77
uuencode.c Normal file
View File

@ -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", '`');
}