summaryrefslogtreecommitdiff
path: root/appl/cmd/lc.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/cmd/lc.b')
-rw-r--r--appl/cmd/lc.b156
1 files changed, 0 insertions, 156 deletions
diff --git a/appl/cmd/lc.b b/appl/cmd/lc.b
deleted file mode 100644
index de5ec579..00000000
--- a/appl/cmd/lc.b
+++ /dev/null
@@ -1,156 +0,0 @@
-implement Lc;
-
-include "sys.m";
- sys: Sys;
-include "draw.m";
-include "readdir.m";
- readdir: Readdir;
-include "bufio.m";
- bufio: Bufio;
- Iobuf: import bufio;
-
-Lc: module {
- init: fn(nil: ref Draw->Context, argv: list of string);
-};
-
-t_FILE, t_DIR, t_NUMTYPES: con iota;
-columns := 65;
-stderr: ref Sys->FD;
-stdout: ref Iobuf;
-
-usage()
-{
- sys->fprint(stderr, "usage: lc [-df] [-c columns] [file ...]\n");
- raise "fail:usage";
-}
-
-init(nil: ref Draw->Context, argv: list of string)
-{
- sys = load Sys Sys->PATH;
- stderr = sys->fildes(2);
- readdir = load Readdir Readdir->PATH;
- if (readdir == nil) {
- sys->fprint(stderr, "lc: cannot load %s: %r\n", Readdir->PATH);
- raise "fail:bad module";
- }
- bufio = load Bufio Bufio->PATH;
- stdout = bufio->fopen(sys->fildes(1), Sys->OWRITE);
- if (bufio == nil) {
- sys->fprint(stderr, "lc: cannot load %s: %r\n", Bufio->PATH);
- raise "fail:bad module";
- }
- if (argv == nil)
- return;
- argv = tl argv;
- flags := 0;
-loop: while (argv != nil && hd argv != nil && (hd argv)[0] == '-') {
- s := (hd argv)[1:];
- argv = tl argv;
- flagloop: for (; s != nil; s = s[1:]) {
- case s[0] {
- '-' =>
- break loop;
- 'd' =>
- flags |= 1 << t_DIR;
- 'f' =>
- flags |= 1 << t_FILE;
- 'c' =>
- if (len s > 1) {
- columns = int s[1:];
- break flagloop;
- }
- if (argv == nil)
- usage();
- columns = int hd argv;
- argv = tl argv;
- * =>
- usage();
- }
- }
- }
-
- headings := 0;
- if (flags == 0) {
- flags = (1<<t_DIR)|(1<<t_FILE);
- headings = 1;
- }
- if (argv == nil)
- argv = "." :: nil;
- multi := tl argv != nil;
- nondir: list of string;
- for (; argv != nil; argv = tl argv) {
- dname := hd argv;
- (ok, dir) := sys->stat(dname);
- if(ok < 0) {
- sys->fprint(stderr, "lc: can't stat %s: %r\n", hd argv);
- continue;
- }
- if (dir.mode & Sys->DMDIR) {
- (d, n) := readdir->init(hd argv, Readdir->NAME | Readdir->COMPACT);
- if (n < 0)
- sys->fprint(stderr, "lc: cannot read %s: %r\n", hd argv);
- else {
- indent := 0;
- if (multi && headings) {
- stdout.puts(hd argv + "/\n");
- indent = 2;
- }
- l: list of string = nil;
- for (i := 0; i < n; i++) {
- s := d[i].name;
- if (!headings && dname != ".")
- s = dname + "/" + s;
- if (d[i].mode & Sys->DMDIR) {
- if (flags & (1<<t_DIR))
- l = s + "/" :: l;
- } else if (flags & (1<<t_FILE))
- l = s :: l;
- }
- d = nil;
- lc(l, indent);
- }
- } else if (flags & (1 << t_FILE))
- nondir = dname :: nondir;
- }
- lc(nondir, 0);
- stdout.close();
-}
-
-lc(dl: list of string, indent: int)
-{
- a := array[len dl] of string;
- j := len a - 1;
- maxwidth := 0;
- for (; dl != nil; dl = tl dl) {
- s := hd dl;
- a[j--] = s;
- if (len s > maxwidth)
- maxwidth = len s;
- }
- outcols(a, maxwidth, indent);
-}
-
-outcols(stuff: array of string, maxwidth, indent: int)
-{
- num := len stuff;
- cols := columns - indent;
- numcols := cols / (maxwidth + 1);
- colwidth: int;
- if (numcols == 0) {
- numcols = 1;
- colwidth = maxwidth;
- } else
- colwidth = cols / numcols;
- numrows := (num + numcols - 1) / numcols;
-
- for (i := 0; i < numrows; i++) {
- if (indent)
- stdout.puts(sys->sprint("%*s", indent, ""));
- for (j := i; j < num; j += numrows) {
- if (j + numrows < num)
- stdout.puts(sys->sprint("%*.*s", -colwidth, colwidth, stuff[j]));
- else
- stdout.puts(sys->sprint("%.*s\n", colwidth, stuff[j]));
- }
- }
-}