diff --git a/generate/generate.go b/generate/generate.go index eba0885..bd3d68a 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -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" + 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) + 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() }