diff options
Diffstat (limited to 'appl/cmd/uniq.b')
| -rw-r--r-- | appl/cmd/uniq.b | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/appl/cmd/uniq.b b/appl/cmd/uniq.b new file mode 100644 index 00000000..4442c22f --- /dev/null +++ b/appl/cmd/uniq.b @@ -0,0 +1,79 @@ +implement Uniq; + +include "sys.m"; + sys: Sys; +include "bufio.m"; +include "draw.m"; +include "arg.m"; + +Uniq: module +{ + init: fn(nil: ref Draw->Context, args: list of string); +}; + +usage() +{ + fail("usage", sys->sprint("usage: uniq [-ud] [file]")); +} + +init(nil : ref Draw->Context, args : list of string) +{ + bio : ref Bufio->Iobuf; + + sys = load Sys Sys->PATH; + bufio := load Bufio Bufio->PATH; + if (bufio == nil) + fail("bad module", sys->sprint("uniq: cannot load %s: %r", Bufio->PATH)); + Iobuf: import bufio; + arg := load Arg Arg->PATH; + if (arg == nil) + fail("bad module", sys->sprint("uniq: cannot load %s: %r", Arg->PATH)); + + uflag := 0; + dflag := 0; + arg->init(args); + while ((opt := arg->opt()) != 0) { + case opt { + 'u' => + uflag = 1; + 'd' => + dflag = 1; + * => + usage(); + } + } + args = arg->argv(); + if (len args > 1) + usage(); + if (args != nil) { + bio = bufio->open(hd args, Bufio->OREAD); + if (bio == nil) + fail("open file", sys->sprint("uniq: cannot open %s: %r\n", hd args)); + } else + bio = bufio->fopen(sys->fildes(0), Bufio->OREAD); + + stdout := bufio->fopen(sys->fildes(1), Bufio->OWRITE); + if (!(uflag || dflag)) + uflag = dflag = 1; + prev := ""; + n := 0; + while ((s := bio.gets('\n')) != nil) { + if (s == prev) + n++; + else { + if ((uflag && n == 1) || (dflag && n > 1)) + stdout.puts(prev); + n = 1; + prev = s; + } + } + if ((uflag && n == 1) || (dflag && n > 1)) + stdout.puts(prev); + stdout.close(); +} + +fail(ex, msg: string) +{ + sys->fprint(sys->fildes(2), "%s\n", msg); + raise "fail:"+ex; +} |
