xref: /inferno-os/appl/cmd/src.b (revision 6fe7bebd2f2f6637660b1b20674622b1eeaf6180)
137da2899SCharles.Forsythimplement Src;
237da2899SCharles.Forsyth
337da2899SCharles.Forsythinclude "sys.m";
437da2899SCharles.Forsyth	sys: Sys;
537da2899SCharles.Forsythinclude "draw.m";
637da2899SCharles.Forsythinclude "dis.m";
737da2899SCharles.Forsyth	dis: Dis;
837da2899SCharles.Forsyth
937da2899SCharles.ForsythSrc: module
1037da2899SCharles.Forsyth{
1137da2899SCharles.Forsyth	init: fn(nil: ref Draw->Context, argv: list of string);
1237da2899SCharles.Forsyth};
1337da2899SCharles.Forsyth
1437da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
1537da2899SCharles.Forsyth{
1637da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
1737da2899SCharles.Forsyth	dis = load Dis Dis->PATH;
1837da2899SCharles.Forsyth
1937da2899SCharles.Forsyth	if(dis != nil){
2037da2899SCharles.Forsyth		dis->init();
2137da2899SCharles.Forsyth		for(argv = tl argv; argv != nil; argv = tl argv){
22*6fe7bebdSCharles.Forsyth			s := src(hd argv);
23*6fe7bebdSCharles.Forsyth			if(s == nil)
24*6fe7bebdSCharles.Forsyth				s = "?";
25*6fe7bebdSCharles.Forsyth			sys->print("%s:	%s\n", hd argv, s);
2637da2899SCharles.Forsyth		}
2737da2899SCharles.Forsyth	}
2837da2899SCharles.Forsyth}
29*6fe7bebdSCharles.Forsyth
30*6fe7bebdSCharles.Forsythsrc(progname: string): string
31*6fe7bebdSCharles.Forsyth{
32*6fe7bebdSCharles.Forsyth	disfile := 0;
33*6fe7bebdSCharles.Forsyth	if (len progname >= 4 && progname[len progname-4:] == ".dis")
34*6fe7bebdSCharles.Forsyth		disfile = 1;
35*6fe7bebdSCharles.Forsyth	pathlist: list of string;
36*6fe7bebdSCharles.Forsyth	if (absolute(progname))
37*6fe7bebdSCharles.Forsyth		pathlist = list of {""};
38*6fe7bebdSCharles.Forsyth	else
39*6fe7bebdSCharles.Forsyth		pathlist = list of {"/dis", "."};
40*6fe7bebdSCharles.Forsyth
41*6fe7bebdSCharles.Forsyth	err := "";
42*6fe7bebdSCharles.Forsyth	do {
43*6fe7bebdSCharles.Forsyth		path: string;
44*6fe7bebdSCharles.Forsyth		if (hd pathlist != "")
45*6fe7bebdSCharles.Forsyth			path = hd pathlist + "/" + progname;
46*6fe7bebdSCharles.Forsyth		else
47*6fe7bebdSCharles.Forsyth			path = progname;
48*6fe7bebdSCharles.Forsyth
49*6fe7bebdSCharles.Forsyth		npath := path;
50*6fe7bebdSCharles.Forsyth		if (!disfile)
51*6fe7bebdSCharles.Forsyth			npath += ".dis";
52*6fe7bebdSCharles.Forsyth		src := dis->src(npath);
53*6fe7bebdSCharles.Forsyth		if(src != nil)
54*6fe7bebdSCharles.Forsyth			return src;
55*6fe7bebdSCharles.Forsyth		err = sys->sprint("%r");
56*6fe7bebdSCharles.Forsyth		if (nonexistent(err)) {
57*6fe7bebdSCharles.Forsyth			# try and find it as a shell script
58*6fe7bebdSCharles.Forsyth			if (!disfile) {
59*6fe7bebdSCharles.Forsyth				(ok, info) := sys->stat(path);
60*6fe7bebdSCharles.Forsyth				if (ok == 0 && (info.mode & Sys->DMDIR) == 0
61*6fe7bebdSCharles.Forsyth						&& (info.mode & 8r111) != 0)
62*6fe7bebdSCharles.Forsyth					return path;
63*6fe7bebdSCharles.Forsyth				else
64*6fe7bebdSCharles.Forsyth					err = sys->sprint("%r");
65*6fe7bebdSCharles.Forsyth			}
66*6fe7bebdSCharles.Forsyth		}
67*6fe7bebdSCharles.Forsyth		pathlist = tl pathlist;
68*6fe7bebdSCharles.Forsyth	} while (pathlist != nil && nonexistent(err));
69*6fe7bebdSCharles.Forsyth	return nil;
70*6fe7bebdSCharles.Forsyth}
71*6fe7bebdSCharles.Forsyth
72*6fe7bebdSCharles.Forsythabsolute(p: string): int
73*6fe7bebdSCharles.Forsyth{
74*6fe7bebdSCharles.Forsyth	if (len p < 2)
75*6fe7bebdSCharles.Forsyth		return 0;
76*6fe7bebdSCharles.Forsyth	if (p[0] == '/' || p[0] == '#')
77*6fe7bebdSCharles.Forsyth		return 1;
78*6fe7bebdSCharles.Forsyth	if (len p < 3 || p[0] != '.')
79*6fe7bebdSCharles.Forsyth		return 0;
80*6fe7bebdSCharles.Forsyth	if (p[1] == '/')
81*6fe7bebdSCharles.Forsyth		return 1;
82*6fe7bebdSCharles.Forsyth	if (p[1] == '.' && p[2] == '/')
83*6fe7bebdSCharles.Forsyth		return 1;
84*6fe7bebdSCharles.Forsyth	return 0;
85*6fe7bebdSCharles.Forsyth}
86*6fe7bebdSCharles.Forsyth
87*6fe7bebdSCharles.Forsythnonexistent(e: string): int
88*6fe7bebdSCharles.Forsyth{
89*6fe7bebdSCharles.Forsyth	errs := array[] of {"does not exist", "directory entry not found"};
90*6fe7bebdSCharles.Forsyth	for (i := 0; i < len errs; i++){
91*6fe7bebdSCharles.Forsyth		j := len errs[i];
92*6fe7bebdSCharles.Forsyth		if (j <= len e && e[len e-j:] == errs[i])
93*6fe7bebdSCharles.Forsyth			return 1;
94*6fe7bebdSCharles.Forsyth	}
95*6fe7bebdSCharles.Forsyth	return 0;
96*6fe7bebdSCharles.Forsyth}
97