Introduction
Introduction Statistics Contact Development Disclaimer Help
implemented 'tac' in a suckless way remove mtime binary from the repository - 9…
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
commit 942791ab23de64d2580e3143ba3866ad85fa8ab3
parent 3bdea00b978d1f91addcee5a8afd01acd7db3ea4
Author: pancake <nopcode.org>
Date: Thu, 1 Apr 2010 16:03:15 +0200
implemented 'tac' in a suckless way
remove mtime binary from the repository
Diffstat:
M Makefile | 4 ++--
D mtime/mtime | 0
A tac/Makefile | 10 ++++++++++
A tac/tac.1 | 28 ++++++++++++++++++++++++++++
A tac/tac.c | 60 +++++++++++++++++++++++++++++…
5 files changed, 100 insertions(+), 2 deletions(-)
---
diff --git a/Makefile b/Makefile
@@ -3,8 +3,8 @@
include config.mk
SUBDIRS = lib9 yacc awk basename bc cal cat cleanname date dc du echo \
- fortune freq getflags grep hoc ls mk mkdir mtime \
- rc read sed seq sleep sort tee test touch tr troff uniq
+ fortune freq getflags grep hoc ls mk mkdir mtime rc read \
+ sed seq sleep sort tac tee test touch tr troff uniq
# factor primes
diff --git a/mtime/mtime b/mtime/mtime
Binary files differ.
diff --git a/tac/Makefile b/tac/Makefile
@@ -0,0 +1,10 @@
+# tac - reverse line order cat
+# Depends on ../lib9
+
+TARG = tac
+
+include ../std.mk
+
+pre-uninstall:
+
+post-install:
diff --git a/tac/tac.1 b/tac/tac.1
@@ -0,0 +1,28 @@
+.TH TAC 1
+.SH NAME
+tac \- reverse concatenate files
+.SH SYNOPSIS
+.B tac
+[
+.I file ...
+]
+.SH DESCRIPTION
+.I Tac
+reads each
+.I file
+in sequence and writes it on the standard output in reverse line order.
+.IP
+.L
+tac file
+.LP
+prints a file in reverse line order
+.IP
+.L
+tac file1 file2 >file3
+.LP
+Concatenate reversed file1 and file2 into file3
+.LP
+.SH SEE ALSO
+.IR cat (1)
+.SH BUGS
+Same as in cat
diff --git a/tac/tac.c b/tac/tac.c
@@ -0,0 +1,60 @@
+/* author: pancake<nopcode.org> */
+#include <u.h>
+#include <libc.h>
+
+static vlong bsize = 0;
+static char *buf;
+#define LINES 4096
+
+void
+tac()
+{
+ int i, j;
+ char *ptr, **nls;
+ nls = malloc(LINES*sizeof(nls));
+ for(i=1, ptr=buf; ptr;) {
+ assert(nls != NULL);
+ for(j=0; j<LINES && (ptr=strchr(ptr+1, '\n')); j++)
+ nls[i++] = ptr+1;
+ nls = realloc(nls, (i+LINES)*sizeof(nls));
+ }
+ *nls = buf;
+ while(i--)
+ write(1, nls[i], nls[i+1]-nls[i]);
+ free(nls);
+}
+
+void
+load(int f)
+{
+ vlong nsize, size = seek(f, 0, 2);
+ if (size>0) {
+ nsize = bsize + size;
+ buf = realloc(buf, nsize);
+ seek(f, 0, 0);
+ read(f, buf+bsize, size);
+ bsize = nsize;
+ } else
+ while ((size = read(f, buf+bsize, LINES))>0)
+ bsize+=size;
+}
+
+void
+main(int argc, char *argv[])
+{
+ int i, f;
+ buf = malloc(1);
+ assert(buf != NULL);
+ if (argc == 1)
+ load(0);
+ else for(i=1; i<argc; i++){
+ f = open(argv[i], OREAD);
+ if(f >= 0){
+ load(f);
+ close(f);
+ }else sysfatal("can't open %s: %r", argv[i]);
+ }
+ tac();
+ free(buf);
+ exits(0);
+}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.