# HG changeset patch # User František Kučera # Date 1607012169 -3600 # Node ID 8d2d8f4077af96ccb8b1bfaa5f3b337933ceb48d # Parent 66a45429028632fe437a18b1f53dbf388c525568 OOP wrapper for yaml.h + list event types diff -r 66a454290286 -r 8d2d8f4077af CMakeLists.txt --- a/CMakeLists.txt Tue Dec 01 23:30:00 2020 +0100 +++ b/CMakeLists.txt Thu Dec 03 17:16:09 2020 +0100 @@ -1,5 +1,5 @@ # Relational pipes -# Copyright © 2018 František Kučera (Frantovo.cz, GlobalCode.info) +# 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 diff -r 66a454290286 -r 8d2d8f4077af nbproject/configurations.xml --- a/nbproject/configurations.xml Tue Dec 01 23:30:00 2020 +0100 +++ b/nbproject/configurations.xml Thu Dec 03 17:16:09 2020 +0100 @@ -42,7 +42,6 @@ - XMLDocumentConstructor.h relpipe-in-yaml.cpp @@ -132,8 +131,6 @@ true - - diff -r 66a454290286 -r 8d2d8f4077af src/CMakeLists.txt --- a/src/CMakeLists.txt Tue Dec 01 23:30:00 2020 +0100 +++ b/src/CMakeLists.txt Thu Dec 03 17:16:09 2020 +0100 @@ -1,5 +1,5 @@ # Relational pipes -# Copyright © 2018 František Kučera (Frantovo.cz, GlobalCode.info) +# 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 diff -r 66a454290286 -r 8d2d8f4077af src/YAMLCommand.h --- a/src/YAMLCommand.h Tue Dec 01 23:30:00 2020 +0100 +++ b/src/YAMLCommand.h Thu Dec 03 17:16:09 2020 +0100 @@ -1,6 +1,6 @@ /** * Relational pipes - * Copyright © 2019 František Kučera (Frantovo.cz, GlobalCode.info) + * 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 @@ -21,6 +21,8 @@ #include #include +#include + #include #include @@ -32,12 +34,123 @@ private: std::wstring_convert> convertor; // TODO: support also other encodings. + class YAMLEvent { + private: + yaml_event_t event; + public: + + YAMLEvent(yaml_event_t event) : event(event) { + } + + virtual ~YAMLEvent() { + yaml_event_delete(&event); + } + + const yaml_event_type_t getType() const { + return event.type; + } + + const yaml_event_t* getEvent() const { + return &event; + } + + YAMLEvent(const YAMLEvent&) = delete; + YAMLEvent& operator=(const YAMLEvent&) = delete; + }; + + class YAMLParser { + private: + yaml_parser_t yamlParser; + std::istream* input = nullptr; + + static int readFromInput(void* instance, unsigned char* buffer, size_t size, size_t* length) { + std::istream* input = ((YAMLParser*) instance)->input; + input->read((char*) buffer, size); + *length = input->gcount(); + return (input->good() || input->eof()) ? 1 : 0; + } + public: + + YAMLParser() { + yaml_parser_initialize(&yamlParser); + } + + virtual ~YAMLParser() { + yaml_parser_delete(&yamlParser); + } + + YAMLParser(const YAMLParser&) = delete; + YAMLParser& operator=(const YAMLParser&) = delete; + + void setInput(std::istream* input) { + this->input = input; + yaml_parser_set_input(&yamlParser, readFromInput, (void*) this); + } + + YAMLEvent* next() { + yaml_event_t event; + int result = yaml_parser_parse(&yamlParser, &event); + return result == 1 && event.type != yaml_event_type_e::YAML_NO_EVENT ? new YAMLEvent(event) : nullptr; // 1 = OK in yaml.h; YAML_NO_EVENT = end + } + }; + + YAMLParser parser; + + using YAMLEvent_p = std::shared_ptr; + + enum class Mode { + ROOT, + RELATIONS_SEQUENCE, + MAPPING, + MAP_KEY + }; + + std::vector mode; + + /** + * Both YAML and XML strings are in UTF-8. + */ + const char* y2x(yaml_char_t* value) { + return value ? (const char*) value : ""; + } + public: + YAMLCommand() { + } + + virtual ~YAMLCommand() { + } + void process(std::istream& input, std::shared_ptr writer) { + parser.setInput(&input); + std::vector attributesMetadata; attributesMetadata.push_back(relpipe::writer::AttributeMetadata{L"todo", relpipe::writer::TypeId::STRING}); writer->startRelation(L"YAML", attributesMetadata, true); + + mode.push_back(Mode::ROOT); + std::string itemName; + + writer->writeAttribute(L"before cycle"); + for (YAMLEvent_p event = YAMLEvent_p(parser.next()); event; event = YAMLEvent_p(parser.next())) { + + if (event->getType() == YAML_NO_EVENT) { writer->writeAttribute(L"YAML_NO_EVENT"); + } else if (event->getType() == YAML_STREAM_START_EVENT) { writer->writeAttribute(L"YAML_STREAM_START_EVENT"); + } else if (event->getType() == YAML_STREAM_END_EVENT) { writer->writeAttribute(L"YAML_STREAM_END_EVENT"); + } else if (event->getType() == YAML_DOCUMENT_START_EVENT) { writer->writeAttribute(L"YAML_DOCUMENT_START_EVENT"); + } else if (event->getType() == YAML_DOCUMENT_END_EVENT) { writer->writeAttribute(L"YAML_DOCUMENT_END_EVENT"); + } else if (event->getType() == YAML_ALIAS_EVENT) { writer->writeAttribute(L"YAML_ALIAS_EVENT"); + } else if (event->getType() == YAML_SCALAR_EVENT) { writer->writeAttribute(L"YAML_SCALAR_EVENT"); + } else if (event->getType() == YAML_SEQUENCE_START_EVENT) { writer->writeAttribute(L"YAML_SEQUENCE_START_EVENT"); + } else if (event->getType() == YAML_SEQUENCE_END_EVENT) { writer->writeAttribute(L"YAML_SEQUENCE_END_EVENT"); + } else if (event->getType() == YAML_MAPPING_START_EVENT) { writer->writeAttribute(L"YAML_MAPPING_START_EVENT"); + } else if (event->getType() == YAML_MAPPING_END_EVENT) { writer->writeAttribute(L"YAML_MAPPING_END_EVENT"); + } else { writer->writeAttribute(L"else???"); + // TODO: unsupported type? + } + } + writer->writeAttribute(L"after cycle"); } }; diff -r 66a454290286 -r 8d2d8f4077af src/relpipe-in-yaml.cpp --- a/src/relpipe-in-yaml.cpp Tue Dec 01 23:30:00 2020 +0100 +++ b/src/relpipe-in-yaml.cpp Thu Dec 03 17:16:09 2020 +0100 @@ -1,6 +1,6 @@ /** * Relational pipes - * Copyright © 2019 František Kučera (Frantovo.cz, GlobalCode.info) + * 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