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