diff options
Diffstat (limited to 'src/pkg/flag')
| -rw-r--r-- | src/pkg/flag/flag.go | 312 | ||||
| -rw-r--r-- | src/pkg/flag/flag_test.go | 64 |
2 files changed, 188 insertions, 188 deletions
diff --git a/src/pkg/flag/flag.go b/src/pkg/flag/flag.go index 86a3b3dc1..d57a59c03 100644 --- a/src/pkg/flag/flag.go +++ b/src/pkg/flag/flag.go @@ -48,9 +48,9 @@ package flag import ( - "fmt"; - "os"; - "strconv"; + "fmt" + "os" + "strconv" ) // TODO(r): BUG: atob belongs elsewhere @@ -61,171 +61,171 @@ func atob(str string) (value bool, ok bool) { case "0", "f", "F", "false", "FALSE", "False": return false, true } - return false, false; + return false, false } // -- Bool Value type boolValue struct { - p *bool; + p *bool } func newBoolValue(val bool, p *bool) *boolValue { - *p = val; - return &boolValue{p}; + *p = val + return &boolValue{p} } func (b *boolValue) set(s string) bool { - v, ok := atob(s); - *b.p = v; - return ok; + v, ok := atob(s) + *b.p = v + return ok } -func (b *boolValue) String() string { return fmt.Sprintf("%v", *b.p) } +func (b *boolValue) String() string { return fmt.Sprintf("%v", *b.p) } // -- Int Value type intValue struct { - p *int; + p *int } func newIntValue(val int, p *int) *intValue { - *p = val; - return &intValue{p}; + *p = val + return &intValue{p} } func (i *intValue) set(s string) bool { - v, err := strconv.Atoi(s); - *i.p = int(v); - return err == nil; + v, err := strconv.Atoi(s) + *i.p = int(v) + return err == nil } -func (i *intValue) String() string { return fmt.Sprintf("%v", *i.p) } +func (i *intValue) String() string { return fmt.Sprintf("%v", *i.p) } // -- Int64 Value type int64Value struct { - p *int64; + p *int64 } func newInt64Value(val int64, p *int64) *int64Value { - *p = val; - return &int64Value{p}; + *p = val + return &int64Value{p} } func (i *int64Value) set(s string) bool { - v, err := strconv.Atoi64(s); - *i.p = v; - return err == nil; + v, err := strconv.Atoi64(s) + *i.p = v + return err == nil } -func (i *int64Value) String() string { return fmt.Sprintf("%v", *i.p) } +func (i *int64Value) String() string { return fmt.Sprintf("%v", *i.p) } // -- Uint Value type uintValue struct { - p *uint; + p *uint } func newUintValue(val uint, p *uint) *uintValue { - *p = val; - return &uintValue{p}; + *p = val + return &uintValue{p} } func (i *uintValue) set(s string) bool { - v, err := strconv.Atoui(s); - *i.p = uint(v); - return err == nil; + v, err := strconv.Atoui(s) + *i.p = uint(v) + return err == nil } -func (i *uintValue) String() string { return fmt.Sprintf("%v", *i.p) } +func (i *uintValue) String() string { return fmt.Sprintf("%v", *i.p) } // -- uint64 Value type uint64Value struct { - p *uint64; + p *uint64 } func newUint64Value(val uint64, p *uint64) *uint64Value { - *p = val; - return &uint64Value{p}; + *p = val + return &uint64Value{p} } func (i *uint64Value) set(s string) bool { - v, err := strconv.Atoui64(s); - *i.p = uint64(v); - return err == nil; + v, err := strconv.Atoui64(s) + *i.p = uint64(v) + return err == nil } -func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i.p) } +func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i.p) } // -- string Value type stringValue struct { - p *string; + p *string } func newStringValue(val string, p *string) *stringValue { - *p = val; - return &stringValue{p}; + *p = val + return &stringValue{p} } func (s *stringValue) set(val string) bool { - *s.p = val; - return true; + *s.p = val + return true } -func (s *stringValue) String() string { return fmt.Sprintf("%s", *s.p) } +func (s *stringValue) String() string { return fmt.Sprintf("%s", *s.p) } // -- Float Value type floatValue struct { - p *float; + p *float } func newFloatValue(val float, p *float) *floatValue { - *p = val; - return &floatValue{p}; + *p = val + return &floatValue{p} } func (f *floatValue) set(s string) bool { - v, err := strconv.Atof(s); - *f.p = v; - return err == nil; + v, err := strconv.Atof(s) + *f.p = v + return err == nil } -func (f *floatValue) String() string { return fmt.Sprintf("%v", *f.p) } +func (f *floatValue) String() string { return fmt.Sprintf("%v", *f.p) } // -- Float64 Value type float64Value struct { - p *float64; + p *float64 } func newFloat64Value(val float64, p *float64) *float64Value { - *p = val; - return &float64Value{p}; + *p = val + return &float64Value{p} } func (f *float64Value) set(s string) bool { - v, err := strconv.Atof64(s); - *f.p = v; - return err == nil; + v, err := strconv.Atof64(s) + *f.p = v + return err == nil } -func (f *float64Value) String() string { return fmt.Sprintf("%v", *f.p) } +func (f *float64Value) String() string { return fmt.Sprintf("%v", *f.p) } // FlagValue is the interface to the dynamic value stored in a flag. // (The default value is represented as a string.) type FlagValue interface { - String() string; - set(string) bool; + String() string + set(string) bool } // A Flag represents the state of a flag. type Flag struct { - Name string; // name as it appears on command line - Usage string; // help message - Value FlagValue; // value as set - DefValue string; // default value (as text); for usage message + Name string // name as it appears on command line + Usage string // help message + Value FlagValue // value as set + DefValue string // default value (as text); for usage message } type allFlags struct { - actual map[string]*Flag; - formal map[string]*Flag; - first_arg int; // 0 is the program name, 1 is first arg + actual map[string]*Flag + formal map[string]*Flag + first_arg int // 0 is the program name, 1 is first arg } var flags *allFlags = &allFlags{make(map[string]*Flag), make(map[string]*Flag), 1} @@ -246,74 +246,74 @@ func Visit(fn func(*Flag)) { // Lookup returns the Flag structure of the named flag, returning nil if none exists. func Lookup(name string) *Flag { - f, ok := flags.formal[name]; + f, ok := flags.formal[name] if !ok { return nil } - return f; + return f } // Set sets the value of the named flag. It returns true if the set succeeded; false if // there is no such flag defined. func Set(name, value string) bool { - f, ok := flags.formal[name]; + f, ok := flags.formal[name] if !ok { return false } - ok = f.Value.set(value); + ok = f.Value.set(value) if !ok { return false } - flags.actual[name] = f; - return true; + flags.actual[name] = f + return true } // PrintDefaults prints to standard error the default values of all defined flags. func PrintDefaults() { VisitAll(func(f *Flag) { - format := " -%s=%s: %s\n"; + format := " -%s=%s: %s\n" if _, ok := f.Value.(*stringValue); ok { // put quotes on the value format = " -%s=%q: %s\n" } - fmt.Fprintf(os.Stderr, format, f.Name, f.DefValue, f.Usage); + fmt.Fprintf(os.Stderr, format, f.Name, f.DefValue, f.Usage) }) } // Usage prints to standard error a default usage message documenting all defined flags. // The function is a variable that may be changed to point to a custom function. var Usage = func() { - fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]); - PrintDefaults(); + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + PrintDefaults() } -func NFlag() int { return len(flags.actual) } +func NFlag() int { return len(flags.actual) } // Arg returns the i'th command-line argument. Arg(0) is the first remaining argument // after flags have been processed. func Arg(i int) string { - i += flags.first_arg; + i += flags.first_arg if i < 0 || i >= len(os.Args) { return "" } - return os.Args[i]; + return os.Args[i] } // NArg is the number of arguments remaining after flags have been processed. -func NArg() int { return len(os.Args) - flags.first_arg } +func NArg() int { return len(os.Args) - flags.first_arg } // Args returns the non-flag command-line arguments. -func Args() []string { return os.Args[flags.first_arg:] } +func Args() []string { return os.Args[flags.first_arg:] } func add(name string, value FlagValue, usage string) { // Remember the default value as a string; it won't change. - f := &Flag{name, usage, value, value.String()}; - _, alreadythere := flags.formal[name]; + f := &Flag{name, usage, value, value.String()} + _, alreadythere := flags.formal[name] if alreadythere { - fmt.Fprintln(os.Stderr, "flag redefined:", name); - panic("flag redefinition"); // Happens only if flags are declared with identical names + fmt.Fprintln(os.Stderr, "flag redefined:", name) + panic("flag redefinition") // Happens only if flags are declared with identical names } - flags.formal[name] = f; + flags.formal[name] = f } // BoolVar defines a bool flag with specified name, default value, and usage string. @@ -325,9 +325,9 @@ func BoolVar(p *bool, name string, value bool, usage string) { // Bool defines a bool flag with specified name, default value, and usage string. // The return value is the address of a bool variable that stores the value of the flag. func Bool(name string, value bool, usage string) *bool { - p := new(bool); - BoolVar(p, name, value, usage); - return p; + p := new(bool) + BoolVar(p, name, value, usage) + return p } // IntVar defines an int flag with specified name, default value, and usage string. @@ -339,9 +339,9 @@ func IntVar(p *int, name string, value int, usage string) { // Int defines an int flag with specified name, default value, and usage string. // The return value is the address of an int variable that stores the value of the flag. func Int(name string, value int, usage string) *int { - p := new(int); - IntVar(p, name, value, usage); - return p; + p := new(int) + IntVar(p, name, value, usage) + return p } // Int64Var defines an int64 flag with specified name, default value, and usage string. @@ -353,9 +353,9 @@ func Int64Var(p *int64, name string, value int64, usage string) { // Int64 defines an int64 flag with specified name, default value, and usage string. // The return value is the address of an int64 variable that stores the value of the flag. func Int64(name string, value int64, usage string) *int64 { - p := new(int64); - Int64Var(p, name, value, usage); - return p; + p := new(int64) + Int64Var(p, name, value, usage) + return p } // UintVar defines a uint flag with specified name, default value, and usage string. @@ -367,9 +367,9 @@ func UintVar(p *uint, name string, value uint, usage string) { // Uint defines a uint flag with specified name, default value, and usage string. // The return value is the address of a uint variable that stores the value of the flag. func Uint(name string, value uint, usage string) *uint { - p := new(uint); - UintVar(p, name, value, usage); - return p; + p := new(uint) + UintVar(p, name, value, usage) + return p } // Uint64Var defines a uint64 flag with specified name, default value, and usage string. @@ -381,9 +381,9 @@ func Uint64Var(p *uint64, name string, value uint64, usage string) { // Uint64 defines a uint64 flag with specified name, default value, and usage string. // The return value is the address of a uint64 variable that stores the value of the flag. func Uint64(name string, value uint64, usage string) *uint64 { - p := new(uint64); - Uint64Var(p, name, value, usage); - return p; + p := new(uint64) + Uint64Var(p, name, value, usage) + return p } // StringVar defines a string flag with specified name, default value, and usage string. @@ -395,9 +395,9 @@ func StringVar(p *string, name, value string, usage string) { // String defines a string flag with specified name, default value, and usage string. // The return value is the address of a string variable that stores the value of the flag. func String(name, value string, usage string) *string { - p := new(string); - StringVar(p, name, value, usage); - return p; + p := new(string) + StringVar(p, name, value, usage) + return p } // FloatVar defines a float flag with specified name, default value, and usage string. @@ -409,9 +409,9 @@ func FloatVar(p *float, name string, value float, usage string) { // Float defines a float flag with specified name, default value, and usage string. // The return value is the address of a float variable that stores the value of the flag. func Float(name string, value float, usage string) *float { - p := new(float); - FloatVar(p, name, value, usage); - return p; + p := new(float) + FloatVar(p, name, value, usage) + return p } // Float64Var defines a float64 flag with specified name, default value, and usage string. @@ -423,68 +423,68 @@ func Float64Var(p *float64, name string, value float64, usage string) { // Float64 defines a float64 flag with specified name, default value, and usage string. // The return value is the address of a float64 variable that stores the value of the flag. func Float64(name string, value float64, usage string) *float64 { - p := new(float64); - Float64Var(p, name, value, usage); - return p; + p := new(float64) + Float64Var(p, name, value, usage) + return p } func (f *allFlags) parseOne(index int) (ok bool, next int) { - s := os.Args[index]; - f.first_arg = index; // until proven otherwise + s := os.Args[index] + f.first_arg = index // until proven otherwise if len(s) == 0 { return false, -1 } if s[0] != '-' { return false, -1 } - num_minuses := 1; + num_minuses := 1 if len(s) == 1 { return false, index } if s[1] == '-' { - num_minuses++; - if len(s) == 2 { // "--" terminates the flags + num_minuses++ + if len(s) == 2 { // "--" terminates the flags return false, index + 1 } } - name := s[num_minuses:]; + name := s[num_minuses:] if len(name) == 0 || name[0] == '-' || name[0] == '=' { - fmt.Fprintln(os.Stderr, "bad flag syntax:", s); - Usage(); - os.Exit(2); + fmt.Fprintln(os.Stderr, "bad flag syntax:", s) + Usage() + os.Exit(2) } // it's a flag. does it have an argument? - has_value := false; - value := ""; - for i := 1; i < len(name); i++ { // equals cannot be first + has_value := false + value := "" + for i := 1; i < len(name); i++ { // equals cannot be first if name[i] == '=' { - value = name[i+1:]; - has_value = true; - name = name[0:i]; - break; + value = name[i+1:] + has_value = true + name = name[0:i] + break } } - flag, alreadythere := flags.actual[name]; + flag, alreadythere := flags.actual[name] if alreadythere { - fmt.Fprintf(os.Stderr, "flag specified twice: -%s\n", name); - Usage(); - os.Exit(2); + fmt.Fprintf(os.Stderr, "flag specified twice: -%s\n", name) + Usage() + os.Exit(2) } - m := flags.formal; - flag, alreadythere = m[name]; // BUG + m := flags.formal + flag, alreadythere = m[name] // BUG if !alreadythere { - fmt.Fprintf(os.Stderr, "flag provided but not defined: -%s\n", name); - Usage(); - os.Exit(2); + fmt.Fprintf(os.Stderr, "flag provided but not defined: -%s\n", name) + Usage() + os.Exit(2) } - if f, ok := flag.Value.(*boolValue); ok { // special case: doesn't need an arg + if f, ok := flag.Value.(*boolValue); ok { // special case: doesn't need an arg if has_value { if !f.set(value) { - fmt.Fprintf(os.Stderr, "invalid boolean value %t for flag: -%s\n", value, name); - Usage(); - os.Exit(2); + fmt.Fprintf(os.Stderr, "invalid boolean value %t for flag: -%s\n", value, name) + Usage() + os.Exit(2) } } else { f.set("true") @@ -493,34 +493,34 @@ func (f *allFlags) parseOne(index int) (ok bool, next int) { // It must have a value, which might be the next argument. if !has_value && index < len(os.Args)-1 { // value is the next arg - has_value = true; - index++; - value = os.Args[index]; + has_value = true + index++ + value = os.Args[index] } if !has_value { - fmt.Fprintf(os.Stderr, "flag needs an argument: -%s\n", name); - Usage(); - os.Exit(2); + fmt.Fprintf(os.Stderr, "flag needs an argument: -%s\n", name) + Usage() + os.Exit(2) } - ok = flag.Value.set(value); + ok = flag.Value.set(value) if !ok { - fmt.Fprintf(os.Stderr, "invalid value %s for flag: -%s\n", value, name); - Usage(); - os.Exit(2); + fmt.Fprintf(os.Stderr, "invalid value %s for flag: -%s\n", value, name) + Usage() + os.Exit(2) } } - flags.actual[name] = flag; - return true, index + 1; + flags.actual[name] = flag + return true, index + 1 } // Parse parses the command-line flags. Must be called after all flags are defined // and before any are accessed by the program. func Parse() { for i := 1; i < len(os.Args); { - ok, next := flags.parseOne(i); + ok, next := flags.parseOne(i) if next > 0 { - flags.first_arg = next; - i = next; + flags.first_arg = next + i = next } if !ok { break diff --git a/src/pkg/flag/flag_test.go b/src/pkg/flag/flag_test.go index 0acfc2f96..d6e642b2b 100644 --- a/src/pkg/flag/flag_test.go +++ b/src/pkg/flag/flag_test.go @@ -5,35 +5,35 @@ package flag_test import ( - . "flag"; - "testing"; + . "flag" + "testing" ) var ( - test_bool = Bool("test_bool", false, "bool value"); - test_int = Int("test_int", 0, "int value"); - test_int64 = Int64("test_int64", 0, "int64 value"); - test_uint = Uint("test_uint", 0, "uint value"); - test_uint64 = Uint64("test_uint64", 0, "uint64 value"); - test_string = String("test_string", "0", "string value"); - test_float = Float("test_float", 0, "float value"); - test_float64 = Float("test_float64", 0, "float64 value"); + test_bool = Bool("test_bool", false, "bool value") + test_int = Int("test_int", 0, "int value") + test_int64 = Int64("test_int64", 0, "int64 value") + test_uint = Uint("test_uint", 0, "uint value") + test_uint64 = Uint64("test_uint64", 0, "uint64 value") + test_string = String("test_string", "0", "string value") + test_float = Float("test_float", 0, "float value") + test_float64 = Float("test_float64", 0, "float64 value") ) func boolString(s string) string { if s == "0" { return "false" } - return "true"; + return "true" } func TestEverything(t *testing.T) { - m := make(map[string]*Flag); - desired := "0"; + m := make(map[string]*Flag) + desired := "0" visitor := func(f *Flag) { if len(f.Name) > 5 && f.Name[0:5] == "test_" { - m[f.Name] = f; - ok := false; + m[f.Name] = f + ok := false switch { case f.Value.String() == desired: ok = true @@ -44,35 +44,35 @@ func TestEverything(t *testing.T) { t.Error("Visit: bad value", f.Value.String(), "for", f.Name) } } - }; - VisitAll(visitor); + } + VisitAll(visitor) if len(m) != 8 { - t.Error("VisitAll misses some flags"); + t.Error("VisitAll misses some flags") for k, v := range m { t.Log(k, *v) } } - m = make(map[string]*Flag); - Visit(visitor); + m = make(map[string]*Flag) + Visit(visitor) if len(m) != 0 { - t.Errorf("Visit sees unset flags"); + t.Errorf("Visit sees unset flags") for k, v := range m { t.Log(k, *v) } } // Now set all flags - Set("test_bool", "true"); - Set("test_int", "1"); - Set("test_int64", "1"); - Set("test_uint", "1"); - Set("test_uint64", "1"); - Set("test_string", "1"); - Set("test_float", "1"); - Set("test_float64", "1"); - desired = "1"; - Visit(visitor); + Set("test_bool", "true") + Set("test_int", "1") + Set("test_int64", "1") + Set("test_uint", "1") + Set("test_uint64", "1") + Set("test_string", "1") + Set("test_float", "1") + Set("test_float64", "1") + desired = "1" + Visit(visitor) if len(m) != 8 { - t.Error("Visit fails after set"); + t.Error("Visit fails after set") for k, v := range m { t.Log(k, *v) } |
