152 lines
2.9 KiB
Go
152 lines
2.9 KiB
Go
|
//
|
||
|
// gopsutil is a port of psutil(http://pythonhosted.org/psutil/).
|
||
|
// This covers these architectures.
|
||
|
// - linux (amd64, arm)
|
||
|
// - freebsd (amd64)
|
||
|
// - windows (amd64)
|
||
|
package common
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"errors"
|
||
|
"os"
|
||
|
"reflect"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var NotImplementedError = errors.New("not implemented yet")
|
||
|
|
||
|
// ReadLines reads contents from file and splits them by new line.
|
||
|
// A convenience wrapper to ReadLinesOffsetN(filename, 0, -1).
|
||
|
func ReadLines(filename string) ([]string, error) {
|
||
|
return ReadLinesOffsetN(filename, 0, -1)
|
||
|
}
|
||
|
|
||
|
// ReadLines reads contents from file and splits them by new line.
|
||
|
// The offset tells at which line number to start.
|
||
|
// The count determines the number of lines to read (starting from offset):
|
||
|
// n >= 0: at most n lines
|
||
|
// n < 0: whole file
|
||
|
func ReadLinesOffsetN(filename string, offset uint, n int) ([]string, error) {
|
||
|
f, err := os.Open(filename)
|
||
|
if err != nil {
|
||
|
return []string{""}, err
|
||
|
}
|
||
|
defer f.Close()
|
||
|
|
||
|
var ret []string
|
||
|
|
||
|
r := bufio.NewReader(f)
|
||
|
for i := 0; i < n+int(offset) || n < 0; i++ {
|
||
|
line, err := r.ReadString('\n')
|
||
|
if err != nil {
|
||
|
break
|
||
|
}
|
||
|
if i < int(offset) {
|
||
|
continue
|
||
|
}
|
||
|
ret = append(ret, strings.Trim(line, "\n"))
|
||
|
}
|
||
|
|
||
|
return ret, nil
|
||
|
}
|
||
|
|
||
|
func IntToString(orig []int8) string {
|
||
|
ret := make([]byte, len(orig))
|
||
|
size := -1
|
||
|
for i, o := range orig {
|
||
|
if o == 0 {
|
||
|
size = i
|
||
|
break
|
||
|
}
|
||
|
ret[i] = byte(o)
|
||
|
}
|
||
|
if size == -1 {
|
||
|
size = len(orig)
|
||
|
}
|
||
|
|
||
|
return string(ret[0:size])
|
||
|
}
|
||
|
|
||
|
func ByteToString(orig []byte) string {
|
||
|
n := -1
|
||
|
l := -1
|
||
|
for i, b := range orig {
|
||
|
// skip left side null
|
||
|
if l == -1 && b == 0 {
|
||
|
continue
|
||
|
}
|
||
|
if l == -1 {
|
||
|
l = i
|
||
|
}
|
||
|
|
||
|
if b == 0 {
|
||
|
break
|
||
|
}
|
||
|
n = i + 1
|
||
|
}
|
||
|
if n == -1 {
|
||
|
return string(orig)
|
||
|
}
|
||
|
return string(orig[l:n])
|
||
|
}
|
||
|
|
||
|
// Parse to int32 without error
|
||
|
func mustParseInt32(val string) int32 {
|
||
|
vv, _ := strconv.ParseInt(val, 10, 32)
|
||
|
return int32(vv)
|
||
|
}
|
||
|
|
||
|
// Parse to uint64 without error
|
||
|
func mustParseUint64(val string) uint64 {
|
||
|
vv, _ := strconv.ParseInt(val, 10, 64)
|
||
|
return uint64(vv)
|
||
|
}
|
||
|
|
||
|
// Parse to Float64 without error
|
||
|
func mustParseFloat64(val string) float64 {
|
||
|
vv, _ := strconv.ParseFloat(val, 64)
|
||
|
return vv
|
||
|
}
|
||
|
|
||
|
// Check the target string slice containes src or not
|
||
|
func StringContains(target []string, src string) bool {
|
||
|
for _, t := range target {
|
||
|
if strings.TrimSpace(t) == src {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// get struct attributes.
|
||
|
// This method is used only for debugging platform dependent code.
|
||
|
func attributes(m interface{}) map[string]reflect.Type {
|
||
|
typ := reflect.TypeOf(m)
|
||
|
if typ.Kind() == reflect.Ptr {
|
||
|
typ = typ.Elem()
|
||
|
}
|
||
|
|
||
|
attrs := make(map[string]reflect.Type)
|
||
|
if typ.Kind() != reflect.Struct {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
for i := 0; i < typ.NumField(); i++ {
|
||
|
p := typ.Field(i)
|
||
|
if !p.Anonymous {
|
||
|
attrs[p.Name] = p.Type
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return attrs
|
||
|
}
|
||
|
|
||
|
func PathExists(filename string) bool {
|
||
|
if _, err := os.Stat(filename); err == nil {
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|