commit fd46afb646347773b42878ad96a2dca4e2dd3455 Author: Tanmai Khanna Date: Tue Jul 16 22:08:20 2019 +0530 Creating and populating data structures for input parsed from xml file diff --git a/src/parse_ref.cc b/src/parse_ref.cc index 25a3554..2ac43c0 100644 --- a/src/parse_ref.cc +++ b/src/parse_ref.cc @@ -4,23 +4,79 @@ #include #include #include -#include +#include + +#include + +#include #include "parse_ref.h" +void print_tags(vector< wstring > input) +{ + for (int i = 0; i < input.size(); i++) + { + wcout << input[i]; + cout << " "; + } +} + // g++ parse_ref.cc -I /opt/local/include/libxml2/ -L /usr/lib -lxml2 -lz -lpthread -lm +vector ParseRef::parseTags (wstring tags) +{ + vector temp_tags_list; + + wstring temptag; + + for (std::wstring::iterator i = tags.begin(); i != tags.end(); ++i) + { + if(*i == '\\') //dealing with escaped characters + { + temptag.push_back(*i); + ++i; + temptag.push_back(*i); + } + else if(*i == '.') + { + temp_tags_list.push_back(temptag); + temptag.clear(); + } + else + { + temptag.push_back(*i); + } + } + + if(!temptag.empty()) //if any tag remaining + temp_tags_list.push_back(temptag); + + print_tags(temp_tags_list); + + cout << "\n"; + + return temp_tags_list; +} void ParseRef::parseParameterItem (xmlDocPtr doc, xmlNodePtr cur, wstring parameter_name) { xmlChar *Attr; cur = cur->xmlChildrenNode; + vector temp_tags_list; + while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"parameter-item"))) { Attr = xmlGetProp(cur, (const xmlChar *)"tags"); - printf("ParameterItem: %s\n", Attr); + + printf("ParameterItem: "); + + temp_tags_list = parseTags(XMLParseUtil::towstring(Attr)); + parameters[parameter_name].push_back(temp_tags_list); + + temp_tags_list.clear(); + xmlFree(Attr); //key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); @@ -33,37 +89,47 @@ void ParseRef::parseParameterItem (xmlDocPtr doc, xmlNodePtr cur, wstring parame void ParseRef::parseParameters (xmlDocPtr doc, xmlNodePtr cur) { - xmlChar *Attr; + wstring parameter_name; + cur = cur->xmlChildrenNode; while (cur != NULL) { - if ((!xmlStrcmp(cur->name, (const xmlChar *)"def-parameter"))) - { - Attr = xmlGetProp(cur, (const xmlChar *)"n"); - printf("ParameterName: %s\n", Attr); + if(cur->type == XML_ELEMENT_NODE) + { + parameter_name = XMLParseUtil::towstring(cur->name); - xmlFree(Attr); + cout << "\n"; + wcout << parameter_name; + cout << "\n"; parseParameterItem(doc,cur,parameter_name); - } + } cur = cur->next; } return; } -void ParseRef::parseCatItem (xmlDocPtr doc, xmlNodePtr cur) +void ParseRef::parseCatItem (xmlDocPtr doc, xmlNodePtr cur, wstring cat_name) { xmlChar *Attr; cur = cur->xmlChildrenNode; + vector temp_tags_list; + while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"cat-item"))) { Attr = xmlGetProp(cur, (const xmlChar *)"tags"); - printf("catItem: %s\n", Attr); + printf("catItem: "); + + temp_tags_list = parseTags(XMLParseUtil::towstring(Attr)); + cats[cat_name].push_back(temp_tags_list); + + temp_tags_list.clear(); + xmlFree(Attr); //key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); @@ -84,10 +150,10 @@ void ParseRef::parseCats (xmlDocPtr doc, xmlNodePtr cur) if ((!xmlStrcmp(cur->name, (const xmlChar *)"def-cat"))) { Attr = xmlGetProp(cur, (const xmlChar *)"n"); - printf("catName: %s\n", Attr); - xmlFree(Attr); + printf("catName: %s\n", Attr); - parseCatItem(doc,cur); + parseCatItem(doc,cur, XMLParseUtil::towstring(Attr)); + xmlFree(Attr); } cur = cur->next; @@ -95,42 +161,68 @@ void ParseRef::parseCats (xmlDocPtr doc, xmlNodePtr cur) return; } -void ParseRef::parsePatternItem (xmlDocPtr doc, xmlNodePtr cur) +vector ParseRef::parsePatternItem (xmlDocPtr doc, xmlNodePtr cur) { xmlChar *Attr; cur = cur->xmlChildrenNode; + vector temp_pattern; + while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"pattern-item"))) { + markable_pattern temp; + Attr = xmlGetProp(cur, (const xmlChar *)"n"); - printf("patternItem: %s\n", Attr); + temp.name = XMLParseUtil::towstring(Attr); + + wcout << temp.name; + cout << " "; + xmlFree(Attr); Attr = xmlGetProp(cur, (const xmlChar *)"head"); if(Attr != NULL) - printf("HEAD!\n"); + { + temp.head = 1; + printf("[HEAD!]"); + } + else + temp.head = 0; xmlFree(Attr); + + temp_pattern.push_back(temp); } cur = cur->next; } - return; + + return temp_pattern; } -void ParseRef::parsePatterns (xmlDocPtr doc, xmlNodePtr cur) +void ParseRef::parsePatterns (xmlDocPtr doc, xmlNodePtr cur, wstring markable_name) { cur = cur->xmlChildrenNode; + vector temp_pattern_list; + + wcout << markable_name; + cout << "\n"; + while (cur != NULL) { if ((!xmlStrcmp(cur->name, (const xmlChar *)"pattern"))) - parsePatternItem(doc,cur); + temp_pattern_list = parsePatternItem(doc,cur); + markables[markable_name].push_back(temp_pattern_list); + temp_pattern_list.clear(); + cur = cur->next; + + cout << "\n"; } return; } @@ -145,10 +237,11 @@ void ParseRef::parseMarkables (xmlDocPtr doc, xmlNodePtr cur) if ((!xmlStrcmp(cur->name, (const xmlChar *)"markable"))) { Attr = xmlGetProp(cur, (const xmlChar *)"n"); - printf("MarkableName: %s\n", Attr); - xmlFree(Attr); + printf("MarkableName: "); - parsePatterns(doc,cur); + parsePatterns(doc,cur, XMLParseUtil::towstring(Attr)); + + xmlFree(Attr); } cur = cur->next; diff --git a/src/parse_ref.h b/src/parse_ref.h index 1ae16bc..7a71b67 100644 --- a/src/parse_ref.h +++ b/src/parse_ref.h @@ -8,6 +8,7 @@ #include #include #include +#include using namespace std; @@ -15,7 +16,7 @@ typedef vector< vector > acceptable_tags; struct markable_pattern { - vector name; + wstring name; int head; }; @@ -32,14 +33,16 @@ private: public: void parseDoc(char *docname); void parseParameters (xmlDocPtr doc, xmlNodePtr cur); - void parseParameterItem (xmlDocPtr doc, xmlNodePtr cur); + void parseParameterItem (xmlDocPtr doc, xmlNodePtr cur, wstring parameter_name); void parseCats (xmlDocPtr doc, xmlNodePtr cur); - void parseCatItem (xmlDocPtr doc, xmlNodePtr cur); + void parseCatItem (xmlDocPtr doc, xmlNodePtr cur, wstring cat_name); void parseMarkables (xmlDocPtr doc, xmlNodePtr cur); - void parsePatterns (xmlDocPtr doc, xmlNodePtr cur); - void parsePatternItem (xmlDocPtr doc, xmlNodePtr cur); + void parsePatterns (xmlDocPtr doc, xmlNodePtr cur, wstring markable_name); + vector parsePatternItem (xmlDocPtr doc, xmlNodePtr cur); + + vector parseTags (wstring tags); }; #endif \ No newline at end of file