71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
|
package ndr
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"reflect"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
subStringArrayTag = `ndr:"varying,X-subStringArray"`
|
||
|
subStringArrayValue = "X-subStringArray"
|
||
|
)
|
||
|
|
||
|
func uint16SliceToString(a []uint16) string {
|
||
|
s := make([]rune, len(a), len(a))
|
||
|
for i := range s {
|
||
|
s[i] = rune(a[i])
|
||
|
}
|
||
|
if len(s) > 0 {
|
||
|
// Remove any null terminator
|
||
|
if s[len(s)-1] == rune(0) {
|
||
|
s = s[:len(s)-1]
|
||
|
}
|
||
|
}
|
||
|
return string(s)
|
||
|
}
|
||
|
|
||
|
func (dec *Decoder) readVaryingString(def *[]deferedPtr) (string, error) {
|
||
|
a := new([]uint16)
|
||
|
v := reflect.ValueOf(a)
|
||
|
var t reflect.StructTag
|
||
|
err := dec.fillUniDimensionalVaryingArray(v.Elem(), t, def)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
s := uint16SliceToString(*a)
|
||
|
return s, nil
|
||
|
}
|
||
|
|
||
|
func (dec *Decoder) readConformantVaryingString(def *[]deferedPtr) (string, error) {
|
||
|
a := new([]uint16)
|
||
|
v := reflect.ValueOf(a)
|
||
|
var t reflect.StructTag
|
||
|
err := dec.fillUniDimensionalConformantVaryingArray(v.Elem(), t, def)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
s := uint16SliceToString(*a)
|
||
|
return s, nil
|
||
|
}
|
||
|
|
||
|
func (dec *Decoder) readStringsArray(v reflect.Value, tag reflect.StructTag, def *[]deferedPtr) error {
|
||
|
d, _ := sliceDimensions(v.Type())
|
||
|
ndrTag := parseTags(tag)
|
||
|
var m []int
|
||
|
//var ms int
|
||
|
if ndrTag.HasValue(TagConformant) {
|
||
|
for i := 0; i < d; i++ {
|
||
|
m = append(m, int(dec.precedingMax()))
|
||
|
}
|
||
|
//common max size
|
||
|
_ = dec.precedingMax()
|
||
|
//ms = int(n)
|
||
|
}
|
||
|
tag = reflect.StructTag(subStringArrayTag)
|
||
|
err := dec.fillVaryingArray(v, tag, def)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("could not read string array: %v", err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|