diff --git a/src/main/java/com/moandjiezana/toml/LiteralStringConverter.java b/src/main/java/com/moandjiezana/toml/LiteralStringConverter.java index 0724734..79c1eff 100644 --- a/src/main/java/com/moandjiezana/toml/LiteralStringConverter.java +++ b/src/main/java/com/moandjiezana/toml/LiteralStringConverter.java @@ -1,9 +1,7 @@ package com.moandjiezana.toml; -import static com.moandjiezana.toml.ValueConverterUtils.parse; -import static com.moandjiezana.toml.ValueConverterUtils.parser; +import static com.moandjiezana.toml.ValueConverterUtils.INVALID; -import java.util.List; class LiteralStringConverter implements ValueConverter { @@ -16,13 +14,36 @@ class LiteralStringConverter implements ValueConverter { @Override public Object convert(String s) { - List resultValue = parse(parser().LiteralString(), s); + char[] chars = s.toCharArray(); + boolean terminated = false; + StringBuilder sb = new StringBuilder(s.length()); - if (resultValue == null) { - return ValueConverterUtils.INVALID; + for (int i = 1; i < chars.length; i++) { + char c = chars[i]; + + if (c == '\'') { + terminated = true; + continue; + } + + if (!terminated) { + sb.append(c); + } + + if (terminated && c == '#') { + break; + } + + if (terminated && !Character.isWhitespace(c)) { + return INVALID; + } } - return resultValue.get(0); + if (!terminated) { + return INVALID; + } + + return sb.toString(); } private LiteralStringConverter() {} diff --git a/src/main/java/com/moandjiezana/toml/ValueParser.java b/src/main/java/com/moandjiezana/toml/ValueParser.java index 4030fe6..90fa2f7 100644 --- a/src/main/java/com/moandjiezana/toml/ValueParser.java +++ b/src/main/java/com/moandjiezana/toml/ValueParser.java @@ -14,10 +14,6 @@ class ValueParser extends BaseParser> { return FirstOf(EmptyArray(), Sequence('[', startList(), OneOrMore(FirstOf(NonEmptyArray(), ' ', ',')), ']', endList())); } - public Rule LiteralString() { - return FirstOf(EmptyLiteralString(), Sequence('\'', OneOrMore(TestNot("'"), ANY), startList(), pushToken(match()) , '\'', endList(), Comment())); - } - public Rule MultilineLiteralString() { return FirstOf(EmptyMultilineLiteralString(), Sequence("'''", startList(), Sequence(OneOrMore(TestNot("'''"), ANY), pushToken(match())), "'''", endList(), Comment())); }