summaryrefslogtreecommitdiff
path: root/appl/cmd/limbo/arg.m
diff options
context:
space:
mode:
Diffstat (limited to 'appl/cmd/limbo/arg.m')
-rw-r--r--appl/cmd/limbo/arg.m50
1 files changed, 50 insertions, 0 deletions
diff --git a/appl/cmd/limbo/arg.m b/appl/cmd/limbo/arg.m
new file mode 100644
index 00000000..212752c1
--- /dev/null
+++ b/appl/cmd/limbo/arg.m
@@ -0,0 +1,50 @@
+Arg: adt
+{
+ argv: list of string;
+ c: int;
+ opts: string;
+
+ init: fn(argv: list of string): ref Arg;
+ opt: fn(arg: self ref Arg): int;
+ arg: fn(arg: self ref Arg): string;
+};
+
+Arg.init(argv: list of string): ref Arg
+{
+ if(argv != nil)
+ argv = tl argv;
+ return ref Arg(argv, 0, nil);
+}
+
+Arg.opt(arg: self ref Arg): int
+{
+ if(arg.opts != ""){
+ arg.c = arg.opts[0];
+ arg.opts = arg.opts[1:];
+ return arg.c;
+ }
+ if(arg.argv == nil)
+ return arg.c = 0;
+ arg.opts = hd arg.argv;
+ if(len arg.opts < 2 || arg.opts[0] != '-')
+ return arg.c = 0;
+ arg.argv = tl arg.argv;
+ if(arg.opts == "--")
+ return arg.c = 0;
+ arg.c = arg.opts[1];
+ arg.opts = arg.opts[2:];
+ return arg.c;
+}
+
+Arg.arg(arg: self ref Arg): string
+{
+ s := arg.opts;
+ arg.opts = "";
+ if(s != "")
+ return s;
+ if(arg.argv == nil)
+ return "";
+ s = hd arg.argv;
+ arg.argv = tl arg.argv;
+ return s;
+}