1// Copyright 2013 Google Inc. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package getopt 6 7import ( 8 "bytes" 9 "fmt" 10 "path" 11 "reflect" 12 "runtime" 13 "strings" 14) 15 16var errorString string 17 18func reset() { 19 CommandLine.shortOptions = make(map[rune]*option) 20 CommandLine.longOptions = make(map[string]*option) 21 CommandLine.options = nil 22 CommandLine.args = nil 23 CommandLine.program = "" 24 errorString = "" 25} 26 27func parse(args []string) { 28 err := CommandLine.Getopt(args, nil) 29 if err != nil { 30 b := &bytes.Buffer{} 31 32 fmt.Fprintln(b, CommandLine.program+": "+err.Error()) 33 CommandLine.PrintUsage(b) 34 errorString = b.String() 35 } 36} 37 38func badSlice(a, b []string) bool { 39 if len(a) != len(b) { 40 return true 41 } 42 for x, v := range a { 43 if b[x] != v { 44 return true 45 } 46 } 47 return false 48} 49 50func loc() string { 51 _, file, line, _ := runtime.Caller(1) 52 return fmt.Sprintf("%s:%d", path.Base(file), line) 53} 54 55func (o *option) Equal(opt *option) bool { 56 if o.value != nil && opt.value == nil { 57 return false 58 } 59 if o.value == nil && opt.value != nil { 60 return false 61 } 62 if o.value != nil && o.value.String() != opt.value.String() { 63 return false 64 } 65 66 oc := *o 67 optc := *opt 68 oc.value = nil 69 optc.value = nil 70 return reflect.DeepEqual(&oc, &optc) 71} 72 73func newStringValue(s string) *stringValue { return (*stringValue)(&s) } 74 75func checkError(err string) string { 76 switch { 77 case err == errorString: 78 return "" 79 case err == "": 80 return fmt.Sprintf("unexpected error %q", errorString) 81 case errorString == "": 82 return fmt.Sprintf("did not get expected error %q", err) 83 case !strings.HasPrefix(errorString, err): 84 return fmt.Sprintf("got error %q, want %q", errorString, err) 85 } 86 return "" 87} 88