diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-28 13:43:33 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-28 13:43:33 +0000 |
commit | bab85b65e545231656361b997a81fb8a44b266b4 (patch) | |
tree | 25b3da36ffb0e65619ba42780e8707ba0937daea /libgo/go/flag | |
parent | 739016b56c81a76c269a10fec5844a608b97c09c (diff) | |
download | gcc-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.go | 41 | ||||
-rw-r--r-- | libgo/go/flag/flag_test.go | 9 |
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 { |