From 33a314f9008ac50c777e99b7cd082bbac2129d5c Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Fri, 29 Mar 2019 11:15:36 +0100 Subject: [PATCH] Add tac utility --- nimbase.nimble | 2 +- nl.nim | 21 ++++++++++++++++++--- tac.nim | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/nimbase.nimble b/nimbase.nimble index bcb9826..aab2915 100644 --- a/nimbase.nimble +++ b/nimbase.nimble @@ -8,6 +8,6 @@ requires "nim >= 0.19.0" requires "cligen >= 0.9.19" requires "stint >= 0.0.1" -bin = @["add", "cat", "cp", "div", "echo", "factor", "false", "head", "mkdir", "mul", "nl", "pwd", "rm", "seq", "shuf", "sleep", "sub", "tee", "touch", "true", "yes"] +bin = @["add", "cat", "cp", "div", "echo", "factor", "false", "head", "mkdir", "mul", "nl", "pwd", "rm", "seq", "shuf", "sleep", "sub", "tac", "tee", "touch", "true", "yes"] binDir = "bin" diff --git a/nl.nim b/nl.nim index 1e5a68c..af281d5 100644 --- a/nl.nim +++ b/nl.nim @@ -1,11 +1,26 @@ import cligen import common -proc main(files:seq[string], lineIncrement=1) = +proc digits(num:int): int = + result = 1 + var x = num + while x div 10 >= 1: + inc result + x = x div 10 + +proc spaces(num:int): string = + for i in 1..num: + result &= " " + +proc formatNumber(num:int, width:int): string = + result = if digits(num) > width: $num + else: spaces(width - digits(num)) & $num + +proc main(files:seq[string], lineIncrement=1, numberSeparator="\t", numberWidth=6) = + var lineNr = 0 for file in files: - var lineNr = 0 for line in lines(file): lineNr += lineIncrement - writeLine(stdout, $(lineNr) & line) + writeLine(stdout, formatNumber(lineNr, numberWidth) & numberSeparator & line) dispatch(main, version=("version", nimbaseVersion)) diff --git a/tac.nim b/tac.nim index e69de29..c71c26c 100644 --- a/tac.nim +++ b/tac.nim @@ -0,0 +1,34 @@ +import cligen, os, streams +import common + +proc catFile(file:string) = + if not existsFile(file): + err "tac: " & file & ": No such file or directory" + system.quit 1 + var + f = open(file, fmRead) + reverseLines: seq[string] + for line in lines(f): + reverseLines = line & reverseLines + for line in reverseLines: + writeLine(stdout, line) + +proc catStdin() = + var + line = "" + reverseLines: seq[string] + while stdin.readLine(line): + reverseLines = line & reverseLines + for line in reverseLines: + writeLine(stdout, line) + +proc main(files:seq[string]) = + if files.len == 0: + catStdin() + for file in files: + if file == "-": + catStdin() + else: + catFile(file) + +dispatch(main, version=("version", nimbaseVersion))