Add rev(1)

Signed-off-by: Mattias Andrée <maandree@kth.se>
This commit is contained in:
Mattias Andrée 2016-03-26 17:23:03 +01:00 committed by Laslo Hunhold
parent fb11173926
commit 28129a87c4
4 changed files with 98 additions and 0 deletions

View File

@ -137,6 +137,7 @@ BIN =\
pwd\
readlink\
renice\
rev\
rm\
rmdir\
sed\

1
README
View File

@ -66,6 +66,7 @@ The following tools are implemented:
0=*|o pwd .
0=*|x readlink .
0=*|o renice .
0#* x rev .
0=*|o rm (-i)
0=*|o rmdir .
# sed .

22
rev.1 Normal file
View File

@ -0,0 +1,22 @@
.Dd 2016-03-26
.Dt REV 1
.Os sbase
.Sh NAME
.Nm rev
.Nd reverse each line
.Sh SYNOPSIS
.Nm
.Op Ar file ...
.Sh DESCRIPTION
.Nm
reads each
.Ar file
in sequence and writes it to stdout, but
with all characters in each line in reverse
order. If no
.Ar file
is given
.Nm
reads from stdin.
.Sh SEE ALSO
.Xr tac 1

74
rev.c Normal file
View File

@ -0,0 +1,74 @@
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "text.h"
#include "util.h"
static void
usage(void)
{
eprintf("usage: %s [file ...]\n", argv0);
}
static void
rev(FILE *fp)
{
static char *line = NULL;
static size_t size = 0;
size_t i;
ssize_t n;
int lf;
while ((n = getline(&line, &size, fp)) > 0) {
lf = n && line[n - 1] == '\n';
i = n -= lf;
for (n = 0; i--;) {
if ((line[i] & 0xC0) == 0x80) {
n++;
} else {
fwrite(line + i, 1, n + 1, stdout);
n = 0;
}
}
if (n)
fwrite(line, 1, n, stdout);
if (lf)
fputc('\n', stdout);
}
}
int
main(int argc, char *argv[])
{
FILE *fp;
int ret = 0;
ARGBEGIN {
default:
usage();
} ARGEND
if (!argc) {
rev(stdin);
} else {
for (; *argv; argc--, argv++) {
if (!strcmp(*argv, "-")) {
*argv = "<stdin>";
fp = stdin;
} else if (!(fp = fopen(*argv, "r"))) {
weprintf("fopen %s:", *argv);
ret = 1;
continue;
}
rev(fp);
if (fp != stdin && fshut(fp, *argv))
ret = 1;
}
}
ret |= fshut(stdin, "<stdin>") | fshut(stdout, "<stdout>");
return ret;
}