1# apply cmd to args list read from stdin 2# obc 3implement Xargs; 4 5include "sys.m"; 6 sys: Sys; 7include "draw.m"; 8include "sh.m"; 9include "bufio.m"; 10 bufio: Bufio; 11 Iobuf: import bufio; 12 13Xargs: module 14{ 15 init: fn(ctxt: ref Draw->Context, argv: list of string); 16}; 17 18stderr: ref Sys->FD; 19 20usage() 21{ 22 sys->fprint(stderr, "Usage: xargs command [command args] <[list of last command arg]\n"); 23} 24 25init(ctxt: ref Draw->Context, args: list of string) 26{ 27 sys = load Sys Sys->PATH; 28 stderr = sys->fildes(2); 29 bufio = load Bufio Bufio->PATH; 30 if(bufio == nil){ 31 sys->fprint(stderr, "xargs: can't load Bufio: %r\n"); 32 exit; 33 } 34 if(args != nil) 35 args = tl args; 36 if (args == nil) { 37 usage(); 38 return; 39 } 40 cmd := hd args; 41 args = tl args; 42 if(len cmd < 4 || cmd[len cmd -4:]!=".dis") 43 cmd += ".dis"; 44 sh := load Command cmd; 45 if (sh == nil){ 46 cmd = "/dis/"+cmd; 47 sh = load Command cmd; 48 } 49 if (sh == nil){ 50 sys->fprint(stderr, "xargs: can't load %s: %r\n", cmd); 51 exit; 52 } 53 54 stdin := sys->fildes(0); 55 if(stdin == nil){ 56 sys->fprint(stderr, "xargs: no standard input\n"); 57 exit; 58 } 59 b := bufio->fopen(stdin, Bufio->OREAD); 60 while((t := b.gets('\n')) != nil){ 61 (nil, rargs) := sys->tokenize(t, " \t\n"); 62 if (rargs == nil) 63 continue; 64 if (args == nil) 65 rargs = cmd :: rargs; 66 else 67 rargs = append(cmd :: args, rargs); 68 sh->init(ctxt, rargs); # BUG: process environment? 69 } 70} 71 72reverse[T](l: list of T): list of T 73{ 74 t: list of T; 75 for(; l != nil; l = tl l) 76 t = hd l :: t; 77 return t; 78} 79 80append(h, t: list of string) : list of string 81{ 82 r := reverse(h); 83 for(; r != nil; r = tl r) 84 t = hd r :: t; 85 return t; 86} 87