summaryrefslogtreecommitdiff
path: root/libgo/go/flag
diff options
context:
space:
mode:
authorbstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-28 13:43:33 +0000
committerbstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-28 13:43:33 +0000
commitbab85b65e545231656361b997a81fb8a44b266b4 (patch)
tree25b3da36ffb0e65619ba42780e8707ba0937daea /libgo/go/flag
parent739016b56c81a76c269a10fec5844a608b97c09c (diff)
downloadgcc-bab85b65e545231656361b997a81fb8a44b266b4.tar.gz
2011-10-28 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 180613 using svnmerge git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@180615 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgo/go/flag')
-rw-r--r--libgo/go/flag/flag.go41
-rw-r--r--libgo/go/flag/flag_test.go9
2 files changed, 45 insertions, 5 deletions
diff --git a/libgo/go/flag/flag.go b/libgo/go/flag/flag.go
index 01bbc377008..f13f7a45cd3 100644
--- a/libgo/go/flag/flag.go
+++ b/libgo/go/flag/flag.go
@@ -204,6 +204,7 @@ type FlagSet struct {
Usage func()
name string
+ parsed bool
actual map[string]*Flag
formal map[string]*Flag
args []string // arguments after flags
@@ -285,6 +286,9 @@ func (f *FlagSet) Set(name, value string) bool {
if !ok {
return false
}
+ if f.actual == nil {
+ f.actual = make(map[string]*Flag)
+ }
f.actual[name] = flag
return true
}
@@ -318,10 +322,15 @@ func defaultUsage(f *FlagSet) {
f.PrintDefaults()
}
+// NOTE: Usage is not just defaultUsage(commandLine)
+// because it serves (via godoc flag Usage) as the example
+// for how to write your own usage function.
+
// Usage prints to standard error a usage message documenting all defined command-line flags.
// The function is a variable that may be changed to point to a custom function.
var Usage = func() {
- defaultUsage(commandLine)
+ fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
+ PrintDefaults()
}
// NFlag returns the number of flags that have been set.
@@ -553,6 +562,9 @@ func (f *FlagSet) Var(value Value, name string, usage string) {
fmt.Fprintf(os.Stderr, "%s flag redefined: %s\n", f.name, name)
panic("flag redefinition") // Happens only if flags are declared with identical names
}
+ if f.formal == nil {
+ f.formal = make(map[string]*Flag)
+ }
f.formal[name] = flag
}
@@ -580,6 +592,8 @@ func (f *FlagSet) failf(format string, a ...interface{}) os.Error {
func (f *FlagSet) usage() {
if f == commandLine {
Usage()
+ } else if f.Usage == nil {
+ defaultUsage(f)
} else {
f.Usage()
}
@@ -651,6 +665,9 @@ func (f *FlagSet) parseOne() (bool, os.Error) {
return false, f.failf("invalid value %q for flag: -%s", value, name)
}
}
+ if f.actual == nil {
+ f.actual = make(map[string]*Flag)
+ }
f.actual[name] = flag
return true, nil
}
@@ -660,6 +677,7 @@ func (f *FlagSet) parseOne() (bool, os.Error) {
// are defined and before flags are accessed by the program.
// The return value will be ErrHelp if -help was set but not defined.
func (f *FlagSet) Parse(arguments []string) os.Error {
+ f.parsed = true
f.args = arguments
for {
seen, err := f.parseOne()
@@ -681,6 +699,11 @@ func (f *FlagSet) Parse(arguments []string) os.Error {
return nil
}
+// Parsed reports whether f.Parse has been called.
+func (f *FlagSet) Parsed() bool {
+ return f.parsed
+}
+
// Parse parses the command-line flags from os.Args[1:]. Must be called
// after all flags are defined and before flags are accessed by the program.
func Parse() {
@@ -688,6 +711,11 @@ func Parse() {
commandLine.Parse(os.Args[1:])
}
+// Parsed returns true if the command-line flags have been parsed.
+func Parsed() bool {
+ return commandLine.Parsed()
+}
+
// The default set of command-line flags, parsed from os.Args.
var commandLine = NewFlagSet(os.Args[0], ExitOnError)
@@ -696,10 +724,15 @@ var commandLine = NewFlagSet(os.Args[0], ExitOnError)
func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
f := &FlagSet{
name: name,
- actual: make(map[string]*Flag),
- formal: make(map[string]*Flag),
errorHandling: errorHandling,
}
- f.Usage = func() { defaultUsage(f) }
return f
}
+
+// Init sets the name and error handling property for a flag set.
+// By default, the zero FlagSet uses an empty name and the
+// ContinueOnError error handling policy.
+func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
+ f.name = name
+ f.errorHandling = errorHandling
+}
diff --git a/libgo/go/flag/flag_test.go b/libgo/go/flag/flag_test.go
index 63d0a9fc894..f13531669c1 100644
--- a/libgo/go/flag/flag_test.go
+++ b/libgo/go/flag/flag_test.go
@@ -98,6 +98,9 @@ func TestUsage(t *testing.T) {
}
func testParse(f *FlagSet, t *testing.T) {
+ if f.Parsed() {
+ t.Error("f.Parse() = true before Parse")
+ }
boolFlag := f.Bool("bool", false, "bool value")
bool2Flag := f.Bool("bool2", false, "bool2 value")
intFlag := f.Int("int", 0, "int value")
@@ -121,6 +124,9 @@ func testParse(f *FlagSet, t *testing.T) {
if err := f.Parse(args); err != nil {
t.Fatal(err)
}
+ if !f.Parsed() {
+ t.Error("f.Parse() = false after Parse")
+ }
if *boolFlag != true {
t.Error("bool flag should be true, is ", *boolFlag)
}
@@ -174,7 +180,8 @@ func (f *flagVar) Set(value string) bool {
}
func TestUserDefined(t *testing.T) {
- flags := NewFlagSet("test", ContinueOnError)
+ var flags FlagSet
+ flags.Init("test", ContinueOnError)
var v flagVar
flags.Var(&v, "v", "usage")
if err := flags.Parse([]string{"-v", "1", "-v", "2", "-v=3"}); err != nil {