github.com/cilium/ebpf@v0.16.0/cmd/bpf2go/tools.go (about) 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 ) 8 9 func splitCFlagsFromArgs(in []string) (args, cflags []string) { 10 for i, arg := range in { 11 if arg == "--" { 12 return in[:i], in[i+1:] 13 } 14 } 15 16 return in, nil 17 } 18 19 func splitArguments(in string) ([]string, error) { 20 var ( 21 result []string 22 builder strings.Builder 23 escaped bool 24 delim = ' ' 25 ) 26 27 for _, r := range strings.TrimSpace(in) { 28 if escaped { 29 builder.WriteRune(r) 30 escaped = false 31 continue 32 } 33 34 switch r { 35 case '\\': 36 escaped = true 37 38 case delim: 39 current := builder.String() 40 builder.Reset() 41 42 if current != "" || delim != ' ' { 43 // Only append empty words if they are not 44 // delimited by spaces 45 result = append(result, current) 46 } 47 delim = ' ' 48 49 case '"', '\'', ' ': 50 if delim == ' ' { 51 delim = r 52 continue 53 } 54 55 fallthrough 56 57 default: 58 builder.WriteRune(r) 59 } 60 } 61 62 if delim != ' ' { 63 return nil, fmt.Errorf("missing `%c`", delim) 64 } 65 66 if escaped { 67 return nil, errors.New("unfinished escape") 68 } 69 70 // Add the last word 71 if builder.Len() > 0 { 72 result = append(result, builder.String()) 73 } 74 75 return result, nil 76 }