From 0930fdc014bf36fb9e2715b3d14bff5fedf354a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Tue, 22 Mar 2016 00:40:15 +0100 Subject: Parser refactoring. * Use new style * Update to C++11 * Use more std::string than char* --- src/drumkitparser.cc | 413 ++++++++++++++++++++++++--------------------------- 1 file changed, 193 insertions(+), 220 deletions(-) (limited to 'src/drumkitparser.cc') diff --git a/src/drumkitparser.cc b/src/drumkitparser.cc index f0fddf8..b3f3b99 100644 --- a/src/drumkitparser.cc +++ b/src/drumkitparser.cc @@ -34,244 +34,217 @@ #include "path.h" #include "drumgizmo.h" -DrumKitParser::DrumKitParser(const std::string &file, DrumKit &k) - : kit(k) - , refs(REFSFILE) +DrumKitParser::DrumKitParser(const std::string& file, DrumKit& k) + : kit(k) + , refs(REFSFILE) { - std::string kitfile = file; + std::string kitfile = file; - if(refs.load()) { - if(file.size() > 1 && file[0] == '@') { - kitfile = refs.getValue(file.substr(1)); - } - } else { - ERR(drumkitparser, "Error reading refs.conf"); - } + if(refs.load()) + { + if(file.size() > 1 && file[0] == '@') + { + kitfile = refs.getValue(file.substr(1)); + } + } + else + { + ERR(drumkitparser, "Error reading refs.conf"); + } - // instr = NULL; - path = getPath(kitfile); + // instr = NULL; + path = getPath(kitfile); - fd = fopen(kitfile.c_str(), "r"); + fd = fopen(kitfile.c_str(), "r"); - // DEBUG(kitparser, "Parsing drumkit in %s\n", kitfile.c_str()); + // DEBUG(kitparser, "Parsing drumkit in %s\n", kitfile.c_str()); - if(!fd) return; + if(!fd) + { + return; + } - kit._file = file; + kit._file = file; } DrumKitParser::~DrumKitParser() { - if(fd) fclose(fd); + if(fd) + { + fclose(fd); + } + } -void DrumKitParser::startTag(std::string name, - std::map attr) +void DrumKitParser::startTag(const std::string& name, + attr_t& attr) { - if(name == "drumkit") { - if(attr.find("name") != attr.end()) - kit._name = attr["name"]; - - if(attr.find("samplerate") != attr.end()) { - kit._samplerate = atoi(attr["samplerate"].c_str()); - } else { - // If 'samplerate' attribute is missing, assume 44k1Hz - // TODO: Ask instrument what samplerate is in the audiofiles... - kit._samplerate = 44100; - } - - if(attr.find("description") != attr.end()) - kit._description = attr["description"]; - - if(attr.find("version") != attr.end()) { - try { - kit._version = VersionStr(attr["version"]); - } catch(const char *err) { - ERR(kitparser, "Error parsing version number: %s, using 1.0\n", err); - kit._version = VersionStr(1,0,0); - } - } else { - WARN(kitparser, "Missing version number, assuming 1.0\n"); - kit._version = VersionStr(1,0,0); - } - } - - if(name == "channels") {} - - if(name == "channel") { - if(attr.find("name") == attr.end()) { - DEBUG(kitparser, "Missing channel name.\n"); - return; - } - Channel c(attr["name"]); - c.num = kit.channels.size(); - kit.channels.push_back(c); - } - - if(name == "instruments") { - } - - if(name == "instrument") { - if(attr.find("name") == attr.end()) { - DEBUG(kitparser, "Missing name in instrument tag.\n"); - return; - } - if(attr.find("file") == attr.end()) { - DEBUG(kitparser, "Missing file in instrument tag.\n"); - return; - } - - instr_name = attr["name"]; - instr_file = attr["file"]; - if(attr.find("group") != attr.end()) instr_group = attr["group"]; - else instr_group = ""; - } - - if(name == "channelmap") { - if(attr.find("in") == attr.end()) { - DEBUG(kitparser, "Missing 'in' in channelmap tag.\n"); - return; - } - - if(attr.find("out") == attr.end()) { - DEBUG(kitparser, "Missing 'out' in channelmap tag.\n"); - return; - } - - channelmap[attr["in"]] = attr["out"]; - } + if(name == "drumkit") + { + if(attr.find("name") != attr.end()) + { + kit._name = attr["name"]; + } + + if(attr.find("samplerate") != attr.end()) + { + kit._samplerate = std::stoi(attr["samplerate"]); + } + else + { + // If 'samplerate' attribute is missing, assume 44k1Hz + // TODO: Ask instrument what samplerate is in the audiofiles... + kit._samplerate = 44100; + } + + if(attr.find("description") != attr.end()) + { + kit._description = attr["description"]; + } + + if(attr.find("version") != attr.end()) + { + try + { + kit._version = VersionStr(attr["version"]); + } + catch(const char *err) + { + ERR(kitparser, "Error parsing version number: %s, using 1.0\n", err); + kit._version = VersionStr(1,0,0); + } + } + else + { + WARN(kitparser, "Missing version number, assuming 1.0\n"); + kit._version = VersionStr(1,0,0); + } + } + + if(name == "channels") + { + + } + + if(name == "channel") + { + if(attr.find("name") == attr.end()) + { + ERR(kitparser, "Missing channel name.\n"); + return; + } + + Channel c(attr["name"]); + c.num = kit.channels.size(); + kit.channels.push_back(c); + } + + if(name == "instruments") + { + + } + + if(name == "instrument") + { + if(attr.find("name") == attr.end()) + { + ERR(kitparser, "Missing name in instrument tag.\n"); + return; + } + if(attr.find("file") == attr.end()) + { + ERR(kitparser, "Missing file in instrument tag.\n"); + return; + } + + instr_name = attr["name"]; + instr_file = attr["file"]; + if(attr.find("group") != attr.end()) + { + instr_group = attr["group"]; + } + else + { + instr_group = ""; + } + } + + if(name == "channelmap") + { + if(attr.find("in") == attr.end()) + { + ERR(kitparser, "Missing 'in' in channelmap tag.\n"); + return; + } + + if(attr.find("out") == attr.end()) + { + ERR(kitparser, "Missing 'out' in channelmap tag.\n"); + return; + } + + channelmap[attr["in"]] = attr["out"]; + } } -void DrumKitParser::endTag(std::string name) +void DrumKitParser::endTag(const std::string& name) { - if(name == "instrument") { - Instrument *i = new Instrument(); - i->setGroup(instr_group); - // Instrument &i = kit.instruments[kit.instruments.size() - 1]; - InstrumentParser parser(path + "/" + instr_file, *i); - parser.parse(); - kit.instruments.push_back(i); - - // Assign kit channel numbers to instruments channels. - std::vector::iterator ic = parser.channellist.begin(); - while(ic != parser.channellist.end()) { - InstrumentChannel *c = *ic; - - std::string cname = c->name; - if(channelmap.find(cname) != channelmap.end()) cname = channelmap[cname]; - - for(size_t cnt = 0; cnt < kit.channels.size(); cnt++) { - if(kit.channels[cnt].name == cname) c->num = kit.channels[cnt].num; - } - if(c->num == NO_CHANNEL) { - DEBUG(kitparser, "Missing channel '%s' in instrument '%s'\n", - c->name.c_str(), i->name().c_str()); - } else { - /* - DEBUG(kitparser, "Assigned channel '%s' to number %d in instrument '%s'\n", - c->name.c_str(), c->num, i.name().c_str()); - */ - } - ic++; - } - - channelmap.clear(); - - } + if(name == "instrument") + { + Instrument* i = new Instrument(); + i->setGroup(instr_group); + // Instrument &i = kit.instruments[kit.instruments.size() - 1]; + InstrumentParser parser(path + "/" + instr_file, *i); + parser.parse(); + kit.instruments.push_back(i); + + // Assign kit channel numbers to instruments channels. + std::vector::iterator ic = parser.channellist.begin(); + while(ic != parser.channellist.end()) + { + InstrumentChannel* c = *ic; + + std::string cname = c->name; + if(channelmap.find(cname) != channelmap.end()) + { + cname = channelmap[cname]; + } + + for(std::size_t cnt = 0; cnt < kit.channels.size(); cnt++) + { + if(kit.channels[cnt].name == cname) + { + c->num = kit.channels[cnt].num; + } + } + if(c->num == NO_CHANNEL) + { + ERR(kitparser, "Missing channel '%s' in instrument '%s'\n", + c->name.c_str(), i->name().c_str()); + } + else { + /* + DEBUG(kitparser, "Assigned channel '%s' to number %d in instrument '%s'\n", + c->name.c_str(), c->num, i.name().c_str()); + */ + } + ic++; + } + + channelmap.clear(); + } } -int DrumKitParser::readData(char *data, size_t size) +int DrumKitParser::readData(std::string& data, std::size_t size) { - if(!fd) return -1; - return fread(data, 1, size, fd); + if(!fd) + { + return -1; + } + + data.resize(size); + auto nr_of_bytes_read = fread((void*)data.data(), 1, size, fd); + data.resize(nr_of_bytes_read); + return nr_of_bytes_read; + return fread((char*)data.c_str(), 1, size, fd); } - -#ifdef TEST_DRUMKITPARSER -//deps: drumkit.cc saxparser.cc instrument.cc sample.cc audiofile.cc channel.cc -//cflags: $(EXPAT_CFLAGS) $(SNDFILE_CFLAGS) -//libs: $(EXPAT_LIBS) $(SNDFILE_LIBS) -#include "test.h" - -const char xml[] = -"\n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n" - ; - -#define FNAME "/tmp/drumkittest.xml" - -TEST_BEGIN; - -FILE *fp = fopen(FNAME, "w"); -fprintf(fp, "%s", xml); -fclose(fp); - -DrumKit kit; -DrumKitParser p(FNAME, kit); -TEST_EQUAL_INT(p.parse(), 0, "Parsing went well?"); - -TEST_EQUAL_STR(kit.name(), "The Aasimonster", "Compare name"); -TEST_EQUAL_INT(kit.instruments.size(), 2, "How many instruments?"); - -unlink(FNAME); - -TEST_END; - -#endif/*TEST_DRUMKITPARSER*/ -- cgit v1.2.3