github.com/anchore/syft@v1.38.2/syft/internal/parsing/basic_parsing.go (about)

     1  package parsing
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"strings"
     7  	"unicode"
     8  )
     9  
    10  func IsWhitespace(c byte) bool {
    11  	return unicode.IsSpace(rune(c))
    12  }
    13  
    14  func IsLiteral(c byte) bool {
    15  	r := rune(c)
    16  	return unicode.IsNumber(r) || unicode.IsLetter(r) || r == '.' || r == '_'
    17  }
    18  
    19  func SkipWhitespace(data []byte, i *int) {
    20  	for *i < len(data) && IsWhitespace(data[*i]) {
    21  		*i++
    22  	}
    23  }
    24  
    25  func PrintError(data []byte, i int) string {
    26  	line := 1
    27  	char := 1
    28  
    29  	prev := []string{}
    30  	curr := bytes.Buffer{}
    31  
    32  	for idx, c := range data {
    33  		if c == '\n' {
    34  			prev = append(prev, curr.String())
    35  			curr.Reset()
    36  
    37  			if idx >= i {
    38  				break
    39  			}
    40  
    41  			line++
    42  			char = 1
    43  			continue
    44  		}
    45  		if idx < i {
    46  			char++
    47  		}
    48  		curr.WriteByte(c)
    49  	}
    50  
    51  	l1 := fmt.Sprintf("%d", line-1)
    52  	l2 := fmt.Sprintf("%d", line)
    53  
    54  	if len(l1) < len(l2) {
    55  		l1 = " " + l1
    56  	}
    57  
    58  	sep := ": "
    59  
    60  	lines := ""
    61  	if len(prev) > 1 {
    62  		lines += fmt.Sprintf("%s%s%s\n", l1, sep, prev[len(prev)-2])
    63  	}
    64  	if len(prev) > 0 {
    65  		lines += fmt.Sprintf("%s%s%s\n", l2, sep, prev[len(prev)-1])
    66  	}
    67  
    68  	pointer := strings.Repeat(" ", len(l2)+len(sep)+char-1) + "^"
    69  
    70  	return fmt.Sprintf("line: %v, char: %v\n%s%s", line, char, lines, pointer)
    71  }