xref: /inferno-os/appl/cmd/xargs.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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