# HG changeset patch # User František Kučera # Date 1632869695 -7200 # Node ID 930f17f16fd70004963e0ee0709067b52b6c483a # Parent 7eb3dcacba7b7be5aadb5145e517bd8a6339d84a partially implement --parser-option allow-line-continuation-with-space and java-manifest-mf dialect (MANIFEST.MF) diff -r 7eb3dcacba7b -r 930f17f16fd7 src/INICommand.cpp --- a/src/INICommand.cpp Tue Sep 21 21:02:43 2021 +0200 +++ b/src/INICommand.cpp Wed Sep 29 00:54:55 2021 +0200 @@ -33,6 +33,7 @@ #include "lib/BackspaceUnescapingProcessor.h" #include "lib/JavaPropertiesUnescapingProcessor.h" #include "lib/JavaPropertiesDialect.h" +#include "lib/JavaManifestMFDialect.h" using namespace std; using namespace relpipe::writer; @@ -177,7 +178,7 @@ reader->addUnescapingProcessor(std::make_shared(), unescaping::JavaProperties, false); reader->addUnescapingProcessor(std::make_shared(), unescaping::Backspace, true); reader->addDialect(std::make_shared(), dialect::JavaProperties, false); - reader->addDialect(std::make_shared(), dialect::JavaManifestMF, false); + reader->addDialect(std::make_shared(), dialect::JavaManifestMF, false); reader->addHandler(&handler); // TODO: smart pointers vs. references: are we going to call addUnescapingProcessor() dynamically/conditionally or share instances? Then pointers will be better. for (ParserOptionRecipe option : configuration.parserOptions) reader->setOption(convertor.to_bytes(option.uri), convertor.to_bytes(option.value)); diff -r 7eb3dcacba7b -r 930f17f16fd7 src/lib/INIReader.cpp --- a/src/lib/INIReader.cpp Tue Sep 21 21:02:43 2021 +0200 +++ b/src/lib/INIReader.cpp Wed Sep 29 00:54:55 2021 +0200 @@ -202,8 +202,19 @@ std::string readUntil(const std::string& until, bool* found = nullptr) { std::stringstream result; - for (char ch = peek(); input.good() && !oneOf(ch, until); ch = peek()) { - if (allowLineContinuationsWithEscaping && ch == '\\') { + for (char ch = peek(); input.good(); ch = peek()) { + if (allowLineContinuationsWithSpace && ch == '\n') { + get(); + ch = peek(); + if (ch == ' ') get(); + else if (ch == std::istream::traits_type::eof()) break; + else { + if (found) *found = true; + return result.str(); + } + } else if (oneOf(ch, until)) { + break; + } else if (allowLineContinuationsWithEscaping && ch == '\\') { get(); ch = get(); if (oneOf(ch, until) && ch == '\n') processContinuingLine(result); diff -r 7eb3dcacba7b -r 930f17f16fd7 src/lib/JavaManifestMFDialect.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/JavaManifestMFDialect.h Wed Sep 29 00:54:55 2021 +0200 @@ -0,0 +1,51 @@ +/** + * Relational pipes + * Copyright © 2020 František Kučera (Frantovo.cz, GlobalCode.info) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +#include "Dialect.h" +#include "uri.h" + +using namespace std; + +namespace relpipe { +namespace in { +namespace ini { +namespace lib { + +class JavaManifestMFDialect : public Dialect { +public: + + void apply(INIReader& reader) override { + reader.setOption(option::TrimContinuingLines, "true"); + reader.setOption(option::AllowSections, "false"); + reader.setOption(option::AllowSectionTags, "false"); + reader.setOption(option::AllowSubKeys, "false"); + reader.setOption(option::CommentSeparators, "#"); + reader.setOption(option::KeyValueSeparators, ":"); + reader.setOption(option::Quotes, ""); + reader.setOption(option::AllowLineContinuationWithEscaping, "false"); + reader.setOption(option::AllowLineContinuationWithSpace, "true"); + // reader.setOption(unescaping::Basic, "false"); // TODO: maybe disable basic escaping and do exactly what is specified in JavaPropertiesUnescapingProcessor + reader.setOption(unescaping::JavaProperties, "true"); + } + +}; + +} +} +} +} diff -r 7eb3dcacba7b -r 930f17f16fd7 src/lib/JavaPropertiesDialect.h --- a/src/lib/JavaPropertiesDialect.h Tue Sep 21 21:02:43 2021 +0200 +++ b/src/lib/JavaPropertiesDialect.h Wed Sep 29 00:54:55 2021 +0200 @@ -35,8 +35,10 @@ reader.setOption(option::AllowSectionTags, "false"); reader.setOption(option::AllowSubKeys, "false"); reader.setOption(option::CommentSeparators, "#"); - reader.setOption(option::KeyValueSeparators, "=:"); + reader.setOption(option::KeyValueSeparators, "="); reader.setOption(option::Quotes, ""); + reader.setOption(option::AllowLineContinuationWithEscaping, "true"); + reader.setOption(option::AllowLineContinuationWithSpace, "false"); // reader.setOption(unescaping::Basic, "false"); // TODO: maybe disable basic escaping and do exactly what is specified in JavaPropertiesUnescapingProcessor reader.setOption(unescaping::JavaProperties, "true"); }