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  }