diff --git a/src/main/java/de/neemann/digital/core/memory/importer/LogisimReader.java b/src/main/java/de/neemann/digital/core/memory/importer/LogisimReader.java index 511256ab6..faa4a4b19 100644 --- a/src/main/java/de/neemann/digital/core/memory/importer/LogisimReader.java +++ b/src/main/java/de/neemann/digital/core/memory/importer/LogisimReader.java @@ -9,12 +9,13 @@ import de.neemann.digital.core.Bits; import de.neemann.digital.lang.Lang; import java.io.*; +import java.util.StringTokenizer; /** * Reader to read the original Logisim hex file format */ public class LogisimReader implements ValueArrayReader { - private Reader reader; + private final Reader reader; /** * Creates a new instance @@ -51,23 +52,28 @@ public class LogisimReader implements ValueArrayReader { else line = line.trim(); - int rle = 1; - p = line.indexOf('*'); - if (p > 0) { - rle = Integer.parseInt(line.substring(0, p)); - line = line.substring(p + 1).trim(); - } + StringTokenizer tc = new StringTokenizer(line, " \t"); + while (tc.hasMoreTokens()) { + String num = tc.nextToken(); + int rle = 1; + p = num.indexOf('*'); + if (p > 0) { + rle = Integer.parseInt(num.substring(0, p)); + num = num.substring(p + 1).trim(); + } - if (line.length() > 2 && line.charAt(0) == '0' && (line.charAt(1) == 'x' || line.charAt(1) == 'X')) - line = line.substring(2); + if (num.length() > 2 && num.charAt(0) == '0' && (num.charAt(1) == 'x' || num.charAt(1) == 'X')) + num = num.substring(2); - if (line.length() > 0) { - long v = Bits.decode(line, 0, 16); - for (int i = 0; i < rle; i++) { - valueArray.set(pos, v); - pos++; + if (num.length() > 0) { + long v = Bits.decode(num, 0, 16); + for (int i = 0; i < rle; i++) { + valueArray.set(pos, v); + pos++; + } } } + } catch (Bits.NumberFormatException e) { throw new IOException(e); } @@ -75,5 +81,4 @@ public class LogisimReader implements ValueArrayReader { } } - } diff --git a/src/test/java/de/neemann/digital/core/memory/importer/LogisimReaderTest.java b/src/test/java/de/neemann/digital/core/memory/importer/LogisimReaderTest.java index 3892d1c49..444b126cb 100644 --- a/src/test/java/de/neemann/digital/core/memory/importer/LogisimReaderTest.java +++ b/src/test/java/de/neemann/digital/core/memory/importer/LogisimReaderTest.java @@ -98,5 +98,31 @@ public class LogisimReaderTest extends TestCase { assertEquals(0xFF, df.getDataWord(16)); } + public void testLoadRLEMultiline() throws Exception { + String data = "v2.0 raw\n#test1 \n 5*0x0 10*0x10 0xAA 0XFF #test"; + + DataField df = new DataField(1024); + new LogisimReader(new StringReader(data)).read(new DataFieldValueArray(df, 0)); + + assertEquals(17, df.trim()); + assertEquals(0x00, df.getDataWord(0)); + assertEquals(0x00, df.getDataWord(1)); + assertEquals(0x00, df.getDataWord(2)); + assertEquals(0x00, df.getDataWord(3)); + assertEquals(0x00, df.getDataWord(4)); + assertEquals(0x10, df.getDataWord(5)); + assertEquals(0x10, df.getDataWord(6)); + assertEquals(0x10, df.getDataWord(7)); + assertEquals(0x10, df.getDataWord(8)); + assertEquals(0x10, df.getDataWord(9)); + assertEquals(0x10, df.getDataWord(10)); + assertEquals(0x10, df.getDataWord(11)); + assertEquals(0x10, df.getDataWord(12)); + assertEquals(0x10, df.getDataWord(13)); + assertEquals(0x10, df.getDataWord(14)); + assertEquals(0xAA, df.getDataWord(15)); + assertEquals(0xFF, df.getDataWord(16)); + } + } \ No newline at end of file