94
package main
import (
"encoding/json"
"fmt"
"os"
)
type MEM struct {
Total Bytes
Free Bytes
Avail Bytes
Buffer Bytes
}
type numSeeker struct {
i int
b []byte
}
func (n *numSeeker) Init(b []byte) {
n.b = b
n.i = 0
}
func (n *numSeeker) End() bool {
return n.i >= len(n.b)
}
func (n *numSeeker) Seek() {
n.i++
}
func (n *numSeeker) GetByte() uint8 {
return uint8(n.b[n.i])
}
func (n *numSeeker) IsNum() bool {
e := n.GetByte()
return e >= 48 && e <= 57
}
func (n *numSeeker) SeekToNum() {
for n.Seek(); !n.End(); n.Seek() {
if n.IsNum() {
break
}
}
}
func (n *numSeeker) GetNum() uint64 {
var num uint64 = 0
for n.SeekToNum(); !n.End(); n.Seek() {
if n.IsNum() {
num = num*uint64(10) + uint64(uint8(n.GetByte())-48)
} else {
return num
}
}
return num
}
func (n *numSeeker) GetNums() []uint64 {
nums := make([]uint64, 0)
for ; !n.End(); n.Seek() {
nums = append(nums, n.GetNum())
}
return nums
}
func (m *MEM) update() {
b := make([]byte, 140)
f, _ := os.Open("/proc/meminfo")
_, err := f.Read(b)
if err != nil {
return
}
f.Close()
var seeker numSeeker
seeker.Init(b)
m.Total = Bytes(seeker.GetNum())
m.Free = Bytes(seeker.GetNum())
m.Avail = Bytes(seeker.GetNum())
m.Buffer = Bytes(seeker.GetNum() + seeker.GetNum())
}
func (m *MEM) Percent() *MEM {
var m2 MEM
fac := Bytes(10000)
m2.Avail = m.Avail * fac / m.Total
m2.Free = m.Free * fac / m.Total
m2.Buffer = m.Buffer * fac / m.Total
m2.Total = m.Total * fac / m.Total
return &m2
}
func (m *MEM) String() string {
if CONFIG.Json {
b, _ := json.Marshal(m)
return string(b)
}
return fmt.Sprintf("%s USED %s BUFF %s FREE", Bytes(m.Total-m.Avail), m.Buffer, m.Free)
}