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