summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseh <henesy.dev@gmail.com>2019-03-18 16:15:05 -0500
committerseh <henesy.dev@gmail.com>2019-03-18 16:15:05 -0500
commit169cceaef46664b809cc13f52f9cfaa88275d610 (patch)
tree52c8a0e7adbe7c561412073fc43662ce0d015c31
parent23c8f3f9409d2826a94277464125872319156911 (diff)
work on args.m
-rw-r--r--Args/README.md50
-rw-r--r--Args/args.b54
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;
+}