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); | |
+} |