xref: /inferno-os/appl/lib/arg.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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