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 }