-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy patharguments.tcl
52 lines (49 loc) · 1.59 KB
/
arguments.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# Process command-line arguments.
# Copyright (c) 2014-2016 D. Bohdan.
# License: MIT.
namespace eval ::arguments {
variable version 1.0.0
}
# Return a dict mapping varNames to command-line-argument values.
# mandatoryArguments: a list {-arg varName ...}
# optionalArguments: a dict {-optArg varName defaultValue ...}
proc ::arguments::parse {mandatoryArguments optionalArguments argv} {
set result {}
set error [catch {
foreach {argument key defaultValue} $optionalArguments {
if {[dict exists $argv $argument]} {
lappend result $key [dict get $argv $argument]
} else {
lappend result $key $defaultValue
}
dict unset argv $argument
}
foreach {argument key} $mandatoryArguments {
if {[dict exists $argv $argument]} {
lappend result $key [dict get $argv $argument]
} else {
error "missing argument: $argument"
}
dict unset argv $argument
}
} errorMessage]
if {$error} {
error "cannot parse arguments ($errorMessage)"
}
if {$argv ne ""} {
error "unknown argument(s): $argv"
}
return [dict create {*}$result]
}
# Return a usage message.
proc ::arguments::usage {mandatoryArguments optionalArguments argv0} {
set result {}
append result "usage: $argv0"
foreach {argument key} $mandatoryArguments {
append result " $argument $key"
}
foreach {argument key defaultValue} $optionalArguments {
append result " \[$argument $key\]"
}
return $result
}