zworld-demo/library/zos/line.go

78 lines
1.4 KiB
Go
Raw Normal View History

2023-12-22 22:04:27 +08:00
package zos
import "strconv"
type FByteView struct {
Line []byte
sign byte
err error
}
func NewByteView(line []byte) *FByteView {
return &FByteView{
Line: line,
sign: ' ',
err: nil,
}
}
func (v *FByteView) Err() error {
return v.err
}
func (v *FByteView) SetSign(sign byte) {
v.sign = sign
}
func (v *FByteView) GetToken() []byte {
if v.sign == ' ' {
return v.ReadTokenBySpace()
}
return v.ReadTokenByChar(v.sign)
}
func (v *FByteView) GetInt() int32 {
if v.err != nil {
return 0
}
token := string(v.GetToken())
num, err := strconv.ParseInt(token, 10, 32)
v.err = err
return int32(num)
}
func (v *FByteView) GetFloat() float32 {
if v.err != nil {
return 0
}
token := string(v.GetToken())
num, err := strconv.ParseFloat(token, 32)
v.err = err
return float32(num)
}
func (v *FByteView) SkipWhitespace() {
r, w := 0, len(v.Line)
for r < w && (v.Line[r] == ' ' || v.Line[r] == '\t') {
r++
}
if r > 0 {
v.Line = v.Line[r:w]
}
}
func (v *FByteView) ReadTokenBySpace() []byte {
v.SkipWhitespace()
r, w := 0, len(v.Line)
for r < w && (v.Line[r] != ' ' && v.Line[r] != '\t') {
r++
}
token := v.Line[0:r]
v.Line = v.Line[r:w]
return token
}
func (v *FByteView) ReadTokenByChar(char byte) []byte {
v.SkipWhitespace()
r, w := 0, len(v.Line)
for r < w && (v.Line[r] != char) {
r++
}
token := v.Line[0:r]
v.Line = v.Line[r:w]
return token
}