package main
import (
- "bytes"
"os"
"path/filepath"
"reflect"
"unicode/utf8"
"github.com/mattn/go-runewidth"
+ homedir "github.com/mitchellh/go-homedir"
)
// Util.go is a collection of utility functions that are used throughout
return utf8.RuneCountInString(s)
}
+// Convert byte array to rune array
+func toRunes(b []byte) []rune {
+ runes := make([]rune, 0, utf8.RuneCount(b))
+
+ for len(b) > 0 {
+ r, size := utf8.DecodeRune(b)
+ runes = append(runes, r)
+
+ b = b[size:]
+ }
+
+ return runes
+}
+
+func sliceStart(slc []byte, index int) []byte {
+ len := len(slc)
+ i := 0
+ totalSize := 0
+ for totalSize < len {
+ if i >= index {
+ return slc[totalSize:]
+ }
+
+ _, size := utf8.DecodeRune(slc[totalSize:])
+ totalSize += size
+ i++
+ }
+
+ return slc[totalSize:]
+}
+
+func sliceEnd(slc []byte, index int) []byte {
+ len := len(slc)
+ i := 0
+ totalSize := 0
+ for totalSize < len {
+ if i >= index {
+ return slc[:totalSize]
+ }
+
+ _, size := utf8.DecodeRune(slc[totalSize:])
+ totalSize += size
+ i++
+ }
+
+ return slc[:totalSize]
+}
+
// NumOccurrences counts the number of occurrences of a byte in a string
func NumOccurrences(s string, c byte) int {
var n int
return b
}
+// FSize gets the size of a file
func FSize(f *os.File) int64 {
fi, _ := f.Stat()
// get the size
}
// IsSpaces checks if a given string is only spaces
-func IsSpaces(str string) bool {
+func IsSpaces(str []byte) bool {
for _, c := range str {
if c != ' ' {
return false
return lcs
}
+// CommonSubstring gets a common substring among the inputs
func CommonSubstring(arr ...string) string {
commonStr := arr[0]
return strings.TrimPrefix(runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name(), "main.(*View).")
}
-// SplitCommandArgs separates multiple command arguments which may be quoted.
-// The returned slice contains at least one string
-func SplitCommandArgs(input string) []string {
- var result []string
- var curQuote *bytes.Buffer
-
- curArg := new(bytes.Buffer)
- escape := false
-
- finishQuote := func() {
- if curQuote == nil {
- return
- }
- str := curQuote.String()
- if unquoted, err := strconv.Unquote(str); err == nil {
- str = unquoted
- }
- curArg.WriteString(str)
- curQuote = nil
+// ReplaceHome takes a path as input and replaces ~ at the start of the path with the user's
+// home directory. Does nothing if the path does not start with '~'.
+func ReplaceHome(path string) string {
+ if !strings.HasPrefix(path, "~") {
+ return path
}
- appendResult := func() {
- finishQuote()
- escape = false
-
- str := curArg.String()
- result = append(result, str)
- curArg.Reset()
- }
-
- for _, r := range input {
- if r == ' ' && curQuote == nil {
- appendResult()
- } else {
- runeHandled := false
- appendRuneToBuff := func() {
- if curQuote != nil {
- curQuote.WriteRune(r)
- } else {
- curArg.WriteRune(r)
- }
- runeHandled = true
- }
-
- if r == '"' && curQuote == nil {
- curQuote = new(bytes.Buffer)
- appendRuneToBuff()
- } else {
- if curQuote != nil && !escape {
- if r == '"' {
- appendRuneToBuff()
- finishQuote()
- } else if r == '\\' {
- appendRuneToBuff()
- escape = true
- continue
- }
- }
- }
- if !runeHandled {
- appendRuneToBuff()
- }
- }
-
- escape = false
+ home, err := homedir.Dir()
+ if err != nil {
+ messenger.Error("Could not find home directory: ", err)
+ return path
}
- appendResult()
- return result
+ return strings.Replace(path, "~", home, 1)
}
-// JoinCommandArgs joins multiple command arguments and quote the strings if needed.
-func JoinCommandArgs(args ...string) string {
- buf := new(bytes.Buffer)
- first := true
- for _, arg := range args {
- if first {
- first = false
- } else {
- buf.WriteRune(' ')
- }
- quoted := strconv.Quote(arg)
- if quoted[1:len(quoted)-1] != arg || strings.ContainsRune(arg, ' ') {
- buf.WriteString(quoted)
- } else {
- buf.WriteString(arg)
- }
+// GetPath returns a filename without everything following a `:`
+// This is used for opening files like util.go:10:5 to specify a line and column
+func GetPath(path string) string {
+ if strings.Contains(path, ":") {
+ path = strings.Split(path, ":")[0]
}
-
- return buf.String()
+ return path
}