diff options
Diffstat (limited to 'appl/cmd/limbo/arg.m')
| -rw-r--r-- | appl/cmd/limbo/arg.m | 50 |
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; +} |
