xref: /inferno-os/appl/cmd/basename.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Basename;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythinclude "draw.m";
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "names.m";
9*37da2899SCharles.Forsyth	names: Names;
10*37da2899SCharles.Forsyth
11*37da2899SCharles.Forsythinclude "arg.m";
12*37da2899SCharles.Forsyth
13*37da2899SCharles.ForsythBasename: module
14*37da2899SCharles.Forsyth{
15*37da2899SCharles.Forsyth	init:	fn(nil: ref Draw->Context, nil: list of string);
16*37da2899SCharles.Forsyth};
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsythinit(nil: ref Draw->Context, args: list of string)
19*37da2899SCharles.Forsyth{
20*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
21*37da2899SCharles.Forsyth	names = load Names Names->PATH;
22*37da2899SCharles.Forsyth	arg := load Arg Arg->PATH;
23*37da2899SCharles.Forsyth
24*37da2899SCharles.Forsyth	dirname := 0;
25*37da2899SCharles.Forsyth	arg->init(args);
26*37da2899SCharles.Forsyth	arg->setusage("basename [-d] string [suffix]");
27*37da2899SCharles.Forsyth	while((o := arg->opt()) != 0)
28*37da2899SCharles.Forsyth		case o {
29*37da2899SCharles.Forsyth		'd' =>
30*37da2899SCharles.Forsyth			dirname = 1;
31*37da2899SCharles.Forsyth		* =>
32*37da2899SCharles.Forsyth			arg->usage();
33*37da2899SCharles.Forsyth		}
34*37da2899SCharles.Forsyth	args = arg->argv();
35*37da2899SCharles.Forsyth	if(args == nil || tl args != nil && (dirname || tl tl args != nil))
36*37da2899SCharles.Forsyth		arg->usage();
37*37da2899SCharles.Forsyth	arg = nil;
38*37da2899SCharles.Forsyth
39*37da2899SCharles.Forsyth	if(dirname){
40*37da2899SCharles.Forsyth		s := names->dirname(hd args);
41*37da2899SCharles.Forsyth		if(s == nil)
42*37da2899SCharles.Forsyth			s = ".";
43*37da2899SCharles.Forsyth		sys->print("%s\n", s);
44*37da2899SCharles.Forsyth		exit;
45*37da2899SCharles.Forsyth	}
46*37da2899SCharles.Forsyth	suffix: string;
47*37da2899SCharles.Forsyth	if(tl args != nil)
48*37da2899SCharles.Forsyth		suffix = hd tl args;
49*37da2899SCharles.Forsyth	sys->print("%s\n", names->basename(hd args, suffix));
50*37da2899SCharles.Forsyth}
51