Re: [hackers] [sbase][PATCH] Add rev(1)

2016-12-27 Thread Laslo Hunhold
On Sat, 26 Mar 2016 17:23:03 +0100
Mattias Andrée  wrote:

Hey Mattias,

> Signed-off-by: Mattias Andrée 
> ---
>  Makefile |  1 +
>  README   |  1 +
>  rev.1| 22 +++
>  rev.c| 74 +++
> + 4 files changed, 98 insertions(+) create mode 100644 rev.1
>  create mode 100644 rev.c

nice and clean, it works! At first I thought you didn't support UTF-8,
but I gotta admit that your method to handle it is pretty elegant.
In the future, when we go forward and actually handle grapheme
clusters, we will have to act upon grapheme cluster boundaries instead,
but that requires minimal modification.

Applied.

Cheers

Laslo

-- 
Laslo Hunhold 



[hackers] [sbase][PATCH] Add rev(1)

2016-03-26 Thread Mattias Andrée
Signed-off-by: Mattias Andrée 
---
 Makefile |  1 +
 README   |  1 +
 rev.1| 22 +++
 rev.c| 74 
 4 files changed, 98 insertions(+)
 create mode 100644 rev.1
 create mode 100644 rev.c

diff --git a/Makefile b/Makefile
index 6b2bfdf..d572e22 100644
--- a/Makefile
+++ b/Makefile
@@ -137,6 +137,7 @@ BIN =\
pwd\
readlink\
renice\
+   rev\
rm\
rmdir\
sed\
diff --git a/README b/README
index d60d8fc..da2e500 100644
--- a/README
+++ b/README
@@ -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 .
diff --git a/rev.1 b/rev.1
new file mode 100644
index 000..d30c850
--- /dev/null
+++ b/rev.1
@@ -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
diff --git a/rev.c b/rev.c
new file mode 100644
index 000..2d89df1
--- /dev/null
+++ b/rev.c
@@ -0,0 +1,74 @@
+/* See LICENSE file for copyright and license details. */
+#include 
+#include 
+#include 
+
+#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 = "";
+   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, "") | fshut(stdout, "");
+
+   return ret;
+}
-- 
2.7.3