1*37da2899SCharles.Forsythimplement Arg; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsyth# 4*37da2899SCharles.Forsyth# Copyright © 1997 Roger Peppe 5*37da2899SCharles.Forsyth# 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsythinclude "sys.m"; 8*37da2899SCharles.Forsythinclude "arg.m"; 9*37da2899SCharles.Forsyth 10*37da2899SCharles.Forsythname:= ""; 11*37da2899SCharles.Forsythargs: list of string; 12*37da2899SCharles.Forsythusagemsg:=""; 13*37da2899SCharles.Forsythprintusage := 1; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsythcurropt: string; 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsythinit(argv: list of string) 18*37da2899SCharles.Forsyth{ 19*37da2899SCharles.Forsyth (curropt, args, name) = (nil, nil, nil); 20*37da2899SCharles.Forsyth if (argv == nil) 21*37da2899SCharles.Forsyth return; 22*37da2899SCharles.Forsyth name = hd argv; 23*37da2899SCharles.Forsyth args = tl argv; 24*37da2899SCharles.Forsyth} 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsythsetusage(u: string) 27*37da2899SCharles.Forsyth{ 28*37da2899SCharles.Forsyth usagemsg = u; 29*37da2899SCharles.Forsyth printusage = u != nil; 30*37da2899SCharles.Forsyth} 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsythprogname(): string 33*37da2899SCharles.Forsyth{ 34*37da2899SCharles.Forsyth return name; 35*37da2899SCharles.Forsyth} 36*37da2899SCharles.Forsyth 37*37da2899SCharles.Forsyth# don't allow any more options after this function is invoked 38*37da2899SCharles.Forsythargv(): list of string 39*37da2899SCharles.Forsyth{ 40*37da2899SCharles.Forsyth ret := args; 41*37da2899SCharles.Forsyth args = nil; 42*37da2899SCharles.Forsyth return ret; 43*37da2899SCharles.Forsyth} 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsythearg(): string 46*37da2899SCharles.Forsyth{ 47*37da2899SCharles.Forsyth if (curropt != nil) { 48*37da2899SCharles.Forsyth ret := curropt; 49*37da2899SCharles.Forsyth curropt = nil; 50*37da2899SCharles.Forsyth return ret; 51*37da2899SCharles.Forsyth } 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsyth if (args == nil) 54*37da2899SCharles.Forsyth usage(); 55*37da2899SCharles.Forsyth 56*37da2899SCharles.Forsyth ret := hd args; 57*37da2899SCharles.Forsyth args = tl args; 58*37da2899SCharles.Forsyth return ret; 59*37da2899SCharles.Forsyth} 60*37da2899SCharles.Forsyth 61*37da2899SCharles.Forsyth# get next option argument 62*37da2899SCharles.Forsytharg(): string 63*37da2899SCharles.Forsyth{ 64*37da2899SCharles.Forsyth if (curropt != nil) { 65*37da2899SCharles.Forsyth ret := curropt; 66*37da2899SCharles.Forsyth curropt = nil; 67*37da2899SCharles.Forsyth return ret; 68*37da2899SCharles.Forsyth } 69*37da2899SCharles.Forsyth 70*37da2899SCharles.Forsyth if (args == nil) 71*37da2899SCharles.Forsyth return nil; 72*37da2899SCharles.Forsyth 73*37da2899SCharles.Forsyth ret := hd args; 74*37da2899SCharles.Forsyth args = tl args; 75*37da2899SCharles.Forsyth return ret; 76*37da2899SCharles.Forsyth} 77*37da2899SCharles.Forsyth 78*37da2899SCharles.Forsyth# get next option letter 79*37da2899SCharles.Forsyth# return 0 at end of options 80*37da2899SCharles.Forsythopt(): int 81*37da2899SCharles.Forsyth{ 82*37da2899SCharles.Forsyth if (curropt != nil) { 83*37da2899SCharles.Forsyth opt := curropt[0]; 84*37da2899SCharles.Forsyth curropt = curropt[1:]; 85*37da2899SCharles.Forsyth return opt; 86*37da2899SCharles.Forsyth } 87*37da2899SCharles.Forsyth 88*37da2899SCharles.Forsyth if (args == nil) 89*37da2899SCharles.Forsyth return 0; 90*37da2899SCharles.Forsyth 91*37da2899SCharles.Forsyth nextarg := hd args; 92*37da2899SCharles.Forsyth if (len nextarg < 2 || nextarg[0] != '-') 93*37da2899SCharles.Forsyth return 0; 94*37da2899SCharles.Forsyth 95*37da2899SCharles.Forsyth if (nextarg == "--") { 96*37da2899SCharles.Forsyth args = tl args; 97*37da2899SCharles.Forsyth return 0; 98*37da2899SCharles.Forsyth } 99*37da2899SCharles.Forsyth 100*37da2899SCharles.Forsyth opt := nextarg[1]; 101*37da2899SCharles.Forsyth if (len nextarg > 2) 102*37da2899SCharles.Forsyth curropt = nextarg[2:]; 103*37da2899SCharles.Forsyth args = tl args; 104*37da2899SCharles.Forsyth return opt; 105*37da2899SCharles.Forsyth} 106*37da2899SCharles.Forsyth 107*37da2899SCharles.Forsythusage() 108*37da2899SCharles.Forsyth{ 109*37da2899SCharles.Forsyth if(printusage){ 110*37da2899SCharles.Forsyth if(usagemsg != nil) 111*37da2899SCharles.Forsyth u := "usage: "+usagemsg; 112*37da2899SCharles.Forsyth else 113*37da2899SCharles.Forsyth u = name + ": argument expected"; 114*37da2899SCharles.Forsyth sys := load Sys Sys->PATH; 115*37da2899SCharles.Forsyth sys->fprint(sys->fildes(2), "%s\n", u); 116*37da2899SCharles.Forsyth } 117*37da2899SCharles.Forsyth raise "fail:usage"; 118*37da2899SCharles.Forsyth} 119