diff options
| author | seh <henesy.dev@gmail.com> | 2019-03-18 16:15:05 -0500 |
|---|---|---|
| committer | seh <henesy.dev@gmail.com> | 2019-03-18 16:15:05 -0500 |
| commit | 169cceaef46664b809cc13f52f9cfaa88275d610 (patch) | |
| tree | 52c8a0e7adbe7c561412073fc43662ce0d015c31 | |
| parent | 23c8f3f9409d2826a94277464125872319156911 (diff) | |
work on args.m
| -rw-r--r-- | Args/README.md | 50 | ||||
| -rw-r--r-- | Args/args.b | 54 |
2 files changed, 104 insertions, 0 deletions
diff --git a/Args/README.md b/Args/README.md new file mode 100644 index 0000000..3085784 --- /dev/null +++ b/Args/README.md @@ -0,0 +1,50 @@ +# Command-Line Arguments + +Inferno has a dedicated module for processing commandline flags and arguments, arg(2). + +## Source + +### args.b:17,22 + + + +### args.b:24,37 + + + +Note: After the processing of all flags, `argv` is re-set from the value contained within `arg` to remove the elements (if any) utilized by flags and their arguments. + +### args.b:41,51 + + + +## Demo + + ; limbo args.b + ; args -h + usage: args [-r] [-c mark] words... + ; args a b c d + Argc after flags: 4 + → a + → b + → c + → d + ; args -r a b c d + Argc after flags: 4 + → d + → c + → b + → a + ; args -c 'quack: ' a b c d + Argc after flags: 4 + quack: a + quack: b + quack: c + quack: d + ; args -r -c '-> ' d c b a + Argc after flags: 4 + -> a + -> b + -> c + -> d + ; diff --git a/Args/args.b b/Args/args.b new file mode 100644 index 0000000..392f371 --- /dev/null +++ b/Args/args.b @@ -0,0 +1,54 @@ +implement Args; + +include "sys.m"; +include "draw.m"; + +include "arg.m"; + +sys: Sys; +print: import sys; + +Args: module { + init: fn(nil: ref Draw->Context, argv: list of string); +}; + +init(nil: ref Draw->Context, argv: list of string) { + sys = load Sys Sys->PATH; + arg := load Arg Arg->PATH; + if(arg == nil) + raise "bad module load"; + + arg->init(argv); + arg->setusage(arg->progname() + " [-r] [-c mark] words..."); + + rev := 0; + mark := "→ "; + + while((opt := arg->opt()) != 0) + case opt { + 'r' => + rev = 1; + 'c' => + mark = arg->earg(); + * => + arg->usage(); + } + + argv = arg->argv(); + + print("Argc after flags: %d\n", len argv); + + if(rev) { + argl: list of string; + + for(; argv != nil; argv = tl argv) + argl = hd argv :: argl; + + argv = argl; + } + + for(; argv != nil; argv = tl argv) + sys->print("%s %s\n", mark, hd argv); + + exit; +} |
