From f2fa9543a11fd5551aa619160d5a02b886fb1bbb Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 25 Jul 2018 21:24:38 +0200 Subject: Rewrite MidiMapParser to use pugixml. --- src/audioinputenginemidi.cc | 2 +- src/configparser.cc | 2 -- src/midimapparser.cc | 28 +++++++++++++++++++++++----- src/midimapparser.h | 5 ++--- 4 files changed, 26 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/audioinputenginemidi.cc b/src/audioinputenginemidi.cc index 3ac2a96..6e76f19 100644 --- a/src/audioinputenginemidi.cc +++ b/src/audioinputenginemidi.cc @@ -67,7 +67,7 @@ bool AudioInputEngineMidi::loadMidiMap(const std::string& file, } MidiMapParser midimap_parser; - if(midimap_parser.parseFile(f)) + if(!midimap_parser.parseFile(f)) { return false; } diff --git a/src/configparser.cc b/src/configparser.cc index 0227d15..30b981f 100644 --- a/src/configparser.cc +++ b/src/configparser.cc @@ -39,8 +39,6 @@ bool ConfigParser::parseString(const std::string& xml) return false; } - //TODO: handle xml version - pugi::xml_node config_node = doc.child("config"); for(pugi::xml_node value_node : config_node.children("value")) { diff --git a/src/midimapparser.cc b/src/midimapparser.cc index cc97280..059dfec 100644 --- a/src/midimapparser.cc +++ b/src/midimapparser.cc @@ -26,14 +26,32 @@ */ #include "midimapparser.h" -void MidiMapParser::startTag(const std::string& name, const attr_t& attr) +#include +#include + +bool MidiMapParser::parseFile(const std::string& filename) { - if(name == "map") + pugi::xml_document doc; + pugi::xml_parse_result result = doc.load_file(filename.data()); + if(result.status) + { + ERR(midimapparser, "XML parse error: %d", (int)result.offset); + return false; + } + + pugi::xml_node midimap_node = doc.child("midimap"); + for(pugi::xml_node map_node : midimap_node.children("map")) { - if((attr.find("note") != attr.end()) && - (attr.find("instr") != attr.end())) + constexpr int bad_value = 10000; + auto note = map_node.attribute("note").as_int(bad_value); + auto instr = map_node.attribute("instr").as_string(); + if(std::string(instr) == "" || note == bad_value) { - midimap[std::stoi(attr.at("note"))] = attr.at("instr"); + continue; } + + midimap[note] = instr; } + + return true; } diff --git a/src/midimapparser.h b/src/midimapparser.h index 8ec76c0..d2f2ddd 100644 --- a/src/midimapparser.h +++ b/src/midimapparser.h @@ -26,14 +26,13 @@ */ #pragma once -#include "saxparser.h" #include "midimapper.h" class MidiMapParser - : public SAXParser { public: - void startTag(const std::string& name, const attr_t& attr) override; + //! Returns false on error, true on success. + bool parseFile(const std::string& filename); midimap_t midimap; }; -- cgit v1.2.3