1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package eu.simuline.octave.io.impl;
17
18 import java.io.BufferedReader;
19
20 import eu.simuline.octave.exception.OctaveParseException;
21 import eu.simuline.octave.io.OctaveIO;
22 import eu.simuline.octave.io.spi.OctaveDataReader;
23 import eu.simuline.octave.type.OctaveString;
24
25
26
27
28
29
30
31 public abstract class AbstractOctaveStringReader extends OctaveDataReader {
32
33
34 private static final String H_ELEMENTS1 = "# elements: 1";
35 private static final String H_ELEMENTS0 = "# elements: 0";
36
37 private static final String LENGTH = "# length: ";
38
39
40
41
42
43
44 protected final OctaveString readImpl(final BufferedReader reader) {
45 final String elements = OctaveIO.readerReadLine(reader);
46 final StringBuilder builder = new StringBuilder();
47
48 if (H_ELEMENTS1.equals(elements)) {
49 final String lengthString = OctaveIO.readerReadLine(reader);
50 if (!lengthString.startsWith(LENGTH)) {
51 throw new OctaveParseException
52 ("Parse error in String, line='" + lengthString + "'");
53 }
54 final int length = Integer
55 .parseInt(lengthString.substring(LENGTH.length()));
56
57 boolean first = true;
58 while (builder.length() < length) {
59 if (!first) {
60 builder.append('\n');
61 }
62 builder.append(OctaveIO.readerReadLine(reader));
63 first = false;
64 }
65
66 if (builder.length() != length) {
67 throw new OctaveParseException
68 ("Unexpected length of string read. expected=" +
69 length + ", actual=" + builder.length());
70 }
71 } else if (!H_ELEMENTS0.equals(elements)) {
72 throw new OctaveParseException
73 ("Expected elements to be 0 or 1, '" + elements + "'");
74 }
75 return new OctaveString(builder.toString());
76 }
77 }