Compare commits
3 Commits
6ecc33a46b
...
40444ee2f4
| Author | SHA1 | Date | |
|---|---|---|---|
| 40444ee2f4 | |||
| 59cc90166f | |||
| f222fb02b7 |
@ -146,7 +146,7 @@ func (this *Generator) generateTypedef(name string, typ Type) (n int, err error)
|
||||
this.push()
|
||||
nn, err = this.iprintf("var nn int\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateDecodeValue(typ, "this", "tag")
|
||||
nn, err = this.generateDecodeValue(typ, "this", "tag", "return n, nil")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf("return n, nil\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
@ -217,7 +217,20 @@ func (this *Generator) generateMessage(method uint16, message Message) (n int, e
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateErrorCheck()
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateDecodeValue(message.Type, "this", "tag")
|
||||
abort := "return n, nil" // TODO: skip value somehow
|
||||
nn, err = this.iprintf("if !tag.Is(")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateTN(message.Type)
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.printf(") {\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.push()
|
||||
nn, err = this.iprintf("%s\n", abort)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.pop()
|
||||
nn, err = this.iprintf("}\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateDecodeValue(message.Type, "this", "tag", abort)
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf("return n, nil\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
@ -406,7 +419,7 @@ func (this *Generator) generateEncodeValue(typ Type, valueSource, tagSource stri
|
||||
// - n int
|
||||
// - err error
|
||||
// - nn int
|
||||
func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource string) (n int, err error) {
|
||||
func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource, abort string) (n int, err error) {
|
||||
switch typ := typ.(type) {
|
||||
case TypeInt:
|
||||
// SI: (none)
|
||||
@ -493,13 +506,25 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateErrorCheck()
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf("if !itemTag.Is(")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateTN(typ.Element)
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf(") {\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.push()
|
||||
nn, err = this.iprintf("%s\n", abort)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.pop()
|
||||
nn, err = this.iprintf("}\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf("for index := range %s {\n", lengthVar)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.push()
|
||||
nn, err = this.generateDecodeValue(
|
||||
typ.Element,
|
||||
fmt.Sprintf("(&(*%s)[index])", valueSource),
|
||||
"itemTag")
|
||||
"itemTag", abort)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.pop()
|
||||
nn, err = this.iprintf("}\n")
|
||||
@ -547,10 +572,32 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
|
||||
nn, err = this.iprintf("case 0x%04X:\n", key)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.push()
|
||||
nn, err = this.generateDecodeValue(
|
||||
field.Type,
|
||||
fmt.Sprintf("(&%s.%s)", valueSource, field.Name),
|
||||
"itemTag")
|
||||
labelVar := this.newTemporaryVar("label")
|
||||
fieldAbort := fmt.Sprintf("goto %s", labelVar) // TODO: skip value somehow
|
||||
nn, err = this.iprintf("if !itemTag.Is(")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.generateTN(field.Type)
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.printf(") {\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.push()
|
||||
nn, err = this.iprintf("%s\n", fieldAbort)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.pop()
|
||||
nn, err = this.iprintf("}\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf("{\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.push()
|
||||
nn, err = this.generateDecodeValue(
|
||||
field.Type,
|
||||
fmt.Sprintf("(&%s.%s)", valueSource, field.Name),
|
||||
"itemTag", fieldAbort)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.pop()
|
||||
nn, err = this.iprintf("}\n")
|
||||
n += nn; if err != nil { return n, err }
|
||||
nn, err = this.iprintf("%s:;\n", labelVar)
|
||||
n += nn; if err != nil { return n, err }
|
||||
this.pop()
|
||||
}
|
||||
|
||||
@ -226,6 +226,10 @@ func TestGenerateRun(test *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
protocol.Messages[0x0003] = Message {
|
||||
Name: "NestedArray",
|
||||
Type: TypeArray { Element: TypeArray { Element: TypeInt { Bits: 8 } } },
|
||||
}
|
||||
protocol.Types["User"] = TypeTableDefined {
|
||||
Fields: map[uint16] Field {
|
||||
0x0000: Field { Name: "Name", Type: TypeString { } },
|
||||
@ -303,5 +307,21 @@ func TestGenerateRun(test *testing.T) {
|
||||
[]byte { 0x00, 0x03, 0x43, 0x43, 0x93, 0x0C, 0xCD },
|
||||
[]byte { 0x00, 0x04, 0x47, 0x41, 0xB6, 0xEE, 0x81, 0x28, 0x3C, 0x21, 0xE2 },
|
||||
))
|
||||
log.Println("MessageNestedArray")
|
||||
uint8s := func(n int) []uint8 {
|
||||
array := make([]uint8, n)
|
||||
for index := range array {
|
||||
array[index] = uint8(index + 1) | 0xF0
|
||||
}
|
||||
return array
|
||||
}
|
||||
messageNestedArray := MessageNestedArray {
|
||||
uint8s(6),
|
||||
uint8s(35),
|
||||
}
|
||||
testEncode(
|
||||
&messageNestedArray,
|
||||
tu.S(0xA1, // TODO
|
||||
))
|
||||
`)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user