79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
// Copyright (c) quickfixengine.org All rights reserved.
|
|
//
|
|
// This file may be distributed under the terms of the quickfixengine.org
|
|
// license as defined by quickfixengine.org and appearing in the file
|
|
// LICENSE included in the packaging of this file.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
|
|
// THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// See http://www.quickfixengine.org/LICENSE for licensing information.
|
|
//
|
|
// Contact ask@quickfixengine.org if any conditions of this licensing
|
|
// are not clear to you.
|
|
|
|
package quickfix
|
|
|
|
import (
|
|
"errors"
|
|
"strconv"
|
|
)
|
|
|
|
const (
|
|
// ASCII - char.
|
|
asciiMinus = 45
|
|
|
|
// ASCII numbers 0-9.
|
|
ascii0 = 48
|
|
ascii9 = 57
|
|
)
|
|
|
|
// atoi is similar to the function in strconv, but is tuned for ints appearing in FIX field types.
|
|
func atoi(d []byte) (int, error) {
|
|
if d[0] == asciiMinus {
|
|
n, err := parseUInt(d[1:])
|
|
return (-1) * n, err
|
|
}
|
|
|
|
return parseUInt(d)
|
|
}
|
|
|
|
// parseUInt is similar to the function in strconv, but is tuned for ints appearing in FIX field types.
|
|
func parseUInt(d []byte) (n int, err error) {
|
|
if len(d) == 0 {
|
|
err = errors.New("empty bytes")
|
|
return
|
|
}
|
|
|
|
for _, dec := range d {
|
|
if dec < ascii0 || dec > ascii9 {
|
|
err = errors.New("invalid format")
|
|
return
|
|
}
|
|
|
|
n = n*10 + (int(dec) - ascii0)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// FIXInt is a FIX Int Value, implements FieldValue.
|
|
type FIXInt int
|
|
|
|
// Int converts the FIXInt value to int.
|
|
func (f FIXInt) Int() int { return int(f) }
|
|
|
|
func (f *FIXInt) Read(bytes []byte) error {
|
|
i, err := atoi(bytes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*f = FIXInt(i)
|
|
return nil
|
|
}
|
|
|
|
func (f FIXInt) Write() []byte {
|
|
return strconv.AppendInt(nil, int64(f), 10)
|
|
}
|