sys

A set of unix utils in hare!
Log | Files | Refs | README

mc.ha (1265B)


      1 use fmt;
      2 use os;
      3 use io;
      4 use bufio;
      5 use unix::tty;
      6 use strings;
      7 use strconv;
      8 use getopt;
      9 
     10 use util;
     11 
     12 let target = 8z;
     13 
     14 export fn main() void = {
     15 	const cmd = getopt::parse(os::args,
     16 		"Multi column output",
     17 		('c', "count", "Target count (default 8)")
     18 		);
     19 	for (let opt .. cmd.opts) {
     20 		switch (opt.0) {
     21 		case 'c' =>
     22 			target = match (strconv::stou(opt.1)) {
     23 			case let i: uint => yield i: size;
     24 			case strconv::invalid => util::die("value must be an integer");
     25 			case strconv::overflow => util::die("value too large");
     26 			};
     27 		case => abort();
     28 		};
     29 	};
     30 
     31 	let tty = tty::open()!;
     32 	let sz = tty::winsize(tty)!;
     33 	let sc = bufio::newscanner(os::stdin);
     34 	defer io::close(&sc)!;
     35 
     36 	let lines: []str = [];
     37 	defer free(lines);
     38 
     39 	let longest = 0z;
     40 
     41 	for (true) {
     42 		match (bufio::scan_line(&sc)) {
     43 		case let s: str =>
     44 			append(lines, strings::dup(s)!)!;
     45 			if (len(s) > longest) longest = len(s);
     46 		case io::EOF => break;
     47 		case => abort();	// TODO change
     48 		};
     49 	};
     50 
     51 	let colcount = sz.columns / (longest + 3);
     52 	if (target < colcount) colcount = target;
     53 	let colwidth = longest + 3;
     54 
     55 	for (let i = 0z; i < len(lines); i += 1) {
     56 		if (i != 0 && i % colcount == 0) fmt::println()!;
     57 		fmt::print(
     58 			strings::rpad(lines[i], ' ', colwidth)!
     59 		)!;
     60 	};
     61 	fmt::println()!;
     62 };