summaryrefslogtreecommitdiff
path: root/rrdformat/rrdbinary/cdef.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2020-02-02 23:11:21 -0500
committerLuke Shumaker <lukeshu@lukeshu.com>2020-02-02 23:11:21 -0500
commit1e253b011f916544879ab3a2d3060c2e982a0c9d (patch)
treec96b1de5d159b9b4a29ba22e00e6f45d2fd1a037 /rrdformat/rrdbinary/cdef.go
parentb3d7493f5e8b20378ec2e41a10459e4339d538e9 (diff)
rrdbinary: Decode CDEF RPN tokens crammed in to Unival parameters
Diffstat (limited to 'rrdformat/rrdbinary/cdef.go')
-rw-r--r--rrdformat/rrdbinary/cdef.go29
1 files changed, 29 insertions, 0 deletions
diff --git a/rrdformat/rrdbinary/cdef.go b/rrdformat/rrdbinary/cdef.go
new file mode 100644
index 0000000..5fbea4c
--- /dev/null
+++ b/rrdformat/rrdbinary/cdef.go
@@ -0,0 +1,29 @@
+package rrdbinary
+
+// RPNToken is one of the things that can be stored in a Unival; used
+// by DST_CDEF.
+type RPNToken struct {
+ Op uint8 // rpn operator type
+ Val int32 // used by OP_NUMBER (0), OP_VARIABLE (1), and OP_PREV_OTHER (36)
+}
+
+// AsRPNTokens returns 1 or 2 RPNTokens (depending on the
+// Architecture.ShortSize).
+func (u Unival) AsRPNTokens() []RPNToken {
+ var ret []RPNToken
+ data := u.data
+ for len(data) > 0 {
+ rpnpData := data[:u.arch.ShortAlign+u.arch.ShortWidth]
+ var rpnp RPNToken
+ rpnp.Op = rpnpData[0]
+ switch u.arch.ShortWidth {
+ case 2:
+ rpnp.Val = int32(int16(u.arch.ByteOrder.Uint16(rpnpData[u.arch.ShortAlign:])))
+ case 4:
+ rpnp.Val = int32(u.arch.ByteOrder.Uint32(rpnpData[u.arch.ShortAlign:]))
+ }
+ ret = append(ret, rpnp)
+ data = data[len(rpnpData):]
+ }
+ return ret
+}