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