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