diff --git a/shared/src/main/scala/io/kaitai/struct/languages/GoCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/GoCompiler.scala index eb40352eb..5f5cc9074 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/GoCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/GoCompiler.scala @@ -339,7 +339,8 @@ class GoCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) out.puts(s"${privateMemberName(RawIdentifier(id))} = make([][]byte, 0);") if (needRaw.level >= 2) out.puts(s"${privateMemberName(RawIdentifier(RawIdentifier(id)))} = make([][]byte, 0);") - out.puts(s"for i := 1;; i++ {") + out.puts("i := 0") + out.puts("for {") out.inc } @@ -352,6 +353,7 @@ class GoCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) override def condRepeatUntilFooter(id: Identifier, io: String, dataType: DataType, needRaw: NeedRaw, untilExpr: Ast.expr): Unit = { typeProvider._currentIteratorType = Some(dataType) + out.puts("i++") out.puts(s"if ${expression(untilExpr)} {") out.inc out.puts("break") diff --git a/shared/src/main/scala/io/kaitai/struct/languages/LuaCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/LuaCompiler.scala index edefa442f..21adf9c0a 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/LuaCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/LuaCompiler.scala @@ -204,12 +204,12 @@ class LuaCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) } override def condRepeatUntilFooter(id: Identifier, io: String, dataType: DataType, needRaw: NeedRaw, untilExpr: Ast.expr): Unit = { typeProvider._currentIteratorType = Some(dataType) + out.puts("i = i + 1") out.puts(s"if ${expression(untilExpr)} then") out.inc out.puts("break") out.dec out.puts("end") - out.puts("i = i + 1") out.dec out.puts("end") out.dec diff --git a/shared/src/main/scala/io/kaitai/struct/languages/NimCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/NimCompiler.scala index aaa253f57..86cf97d1c 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/NimCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/NimCompiler.scala @@ -168,11 +168,11 @@ class NimCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) } override def condRepeatUntilFooter(id: Identifier, io: String, dataType: DataType, needRaw: NeedRaw, repeatExpr: Ast.expr): Unit = { typeProvider._currentIteratorType = Some(dataType) + out.puts("inc i") out.puts(s"if ${expression(repeatExpr)}:") out.inc out.puts("break") out.dec - out.puts("inc i") out.dec out.dec } diff --git a/shared/src/main/scala/io/kaitai/struct/languages/PerlCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/PerlCompiler.scala index 1e3258d55..5dc5c440a 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/PerlCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/PerlCompiler.scala @@ -270,6 +270,7 @@ class PerlCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) if (needRaw.level >= 2) out.puts(s"${privateMemberName(RawIdentifier(RawIdentifier(id)))} = ();") out.puts(s"${privateMemberName(id)} = ();") + out.puts("my $i = 0;") out.puts("do {") out.inc } @@ -286,6 +287,7 @@ class PerlCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) override def condRepeatUntilFooter(id: Identifier, io: String, dataType: DataType, needRaw: NeedRaw, untilExpr: expr): Unit = { typeProvider._currentIteratorType = Some(dataType) + out.puts("$i++;") out.dec out.puts(s"} until (${expression(untilExpr)});") } diff --git a/shared/src/main/scala/io/kaitai/struct/languages/PythonCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/PythonCompiler.scala index 09180c86f..26d2f6b34 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/PythonCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/PythonCompiler.scala @@ -345,11 +345,11 @@ class PythonCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) override def condRepeatUntilFooter(id: Identifier, io: String, dataType: DataType, needRaw: NeedRaw, untilExpr: expr): Unit = { typeProvider._currentIteratorType = Some(dataType) + out.puts("i += 1") out.puts(s"if ${expression(untilExpr)}:") out.inc out.puts("break") out.dec - out.puts("i += 1") out.dec } diff --git a/shared/src/main/scala/io/kaitai/struct/languages/RustCompiler.scala b/shared/src/main/scala/io/kaitai/struct/languages/RustCompiler.scala index 5325310ef..e090b656a 100644 --- a/shared/src/main/scala/io/kaitai/struct/languages/RustCompiler.scala +++ b/shared/src/main/scala/io/kaitai/struct/languages/RustCompiler.scala @@ -291,6 +291,7 @@ class RustCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) if (needRaw.level >= 2) out.puts(s"${privateMemberName(RawIdentifier(RawIdentifier(id)))} = vec!();") out.puts(s"${privateMemberName(id)} = vec!();") + out.puts("let mut i = 0;") out.puts("while {") out.inc } @@ -307,6 +308,7 @@ class RustCompiler(typeProvider: ClassTypeProvider, config: RuntimeConfig) override def condRepeatUntilFooter(id: Identifier, io: String, dataType: DataType, needRaw: NeedRaw, untilExpr: Ast.expr): Unit = { typeProvider._currentIteratorType = Some(dataType) + out.puts("i += 1;") out.puts(s"!(${expression(untilExpr)})") out.dec out.puts("} { }")