From 1ae51ff94d0f1f27a4e4cc657371578db13c3ca1 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 8 Feb 2019 20:26:14 +0100 Subject: Make code compile again (fix bitrot dating back from 2013). --- src/messageparser.cc | 599 ++++++++++++++++++++++++++++----------------------- 1 file changed, 329 insertions(+), 270 deletions(-) (limited to 'src/messageparser.cc') diff --git a/src/messageparser.cc b/src/messageparser.cc index 55cfe34..d59cccc 100644 --- a/src/messageparser.cc +++ b/src/messageparser.cc @@ -39,306 +39,365 @@ typedef std::vector TokenVector; typedef std::list MsgTokensList; -inline static void parse_into_msg_tokens(std::string& data, - MsgTokensList& msgTokensList) { - TokenVector tokenVector; - std::string token; - bool inside_quote = false; - char prev_ch = '0'; - for(size_t i = 0; i < data.length(); i++) { - char ch = data[i]; - - switch(ch) { - case '\"': - if(prev_ch != '\\') { - inside_quote = !inside_quote; - } else { - token += ch; - } - break; - case ' ': - if(inside_quote) { - DEBUG(msgparser, "Appending %c\n", ch); - token += ch; - } else { - if(token.empty()) continue; // skip multiple white spaces and pre white space - DEBUG(msgparser, "Adding token %s\n", token.c_str()); - tokenVector.push_back(token); - token.clear(); - } - break; - case ';': - if(inside_quote) { - token += ch; - } else { - tokenVector.push_back(token); - msgTokensList.push_back(tokenVector); - tokenVector.clear(); - token.clear(); - } - break; - default: - token += ch; - break; - } - prev_ch = ch; - } - - if(token != "") { - tokenVector.push_back(token); - token.clear(); - } - - if(!tokenVector.empty()) { - msgTokensList.push_back(tokenVector); - tokenVector.clear(); - } - - /* // WARNING: Enabling this will print passwords in plaintext... - // Debug: print tokens - DEBUG(parser, "tokenlists: %d\n", msgTokensList.size()); - MsgTokensList::iterator j = msgTokensList.begin(); - while(j != msgTokensList.end()) { - DEBUG(parser, " tokens: %d\n", j->size()); - int idx = 0; - TokenVector::iterator i = j->begin(); - while(i != j->end()) { - DEBUG(parser, " token[%d]: '%s'\n", idx++, i->c_str()); - i++; - } - j++; - } - */ +inline static void parse_into_msg_tokens(std::string& data, + MsgTokensList& msgTokensList) +{ + TokenVector tokenVector; + std::string token; + bool inside_quote = false; + char prev_ch = '0'; + for(size_t i = 0; i < data.length(); i++) + { + char ch = data[i]; + + switch(ch) + { + case '\"': + if(prev_ch != '\\') + { + inside_quote = !inside_quote; + } + else + { + token += ch; + } + break; + case ' ': + if(inside_quote) + { + DEBUG(msgparser, "Appending %c\n", ch); + token += ch; + } + else + { + if(token.empty()) + { + continue; // skip multiple white spaces and pre white space + } + DEBUG(msgparser, "Adding token %s\n", token.c_str()); + tokenVector.push_back(token); + token.clear(); + } + break; + case ';': + if(inside_quote) + { + token += ch; + } + else + { + tokenVector.push_back(token); + msgTokensList.push_back(tokenVector); + tokenVector.clear(); + token.clear(); + } + break; + default: + token += ch; + break; + } + prev_ch = ch; + } + + if(token != "") + { + tokenVector.push_back(token); + token.clear(); + } + + if(!tokenVector.empty()) + { + msgTokensList.push_back(tokenVector); + tokenVector.clear(); + } + + //// WARNING: Enabling this will print passwords in plaintext... + //// Debug: print tokens + //DEBUG(parser, "tokenlists: %d\n", msgTokensList.size()); + //MsgTokensList::iterator j = msgTokensList.begin(); + //while(j != msgTokensList.end()) + //{ + // DEBUG(parser, " tokens: %d\n", j->size()); + // int idx = 0; + // TokenVector::iterator i = j->begin(); + // while(i != j->end()) + // { + // DEBUG(parser, " token[%d]: '%s'\n", idx++, i->c_str()); + // i++; + // } + // j++; + //} + } static taskid_t getId(std::map &sym, std::string token) { - bool isnumeric = true; - for(size_t i = 0; i < token.size(); i++) { - isnumeric &= (token[i] >= '0' && token[i] <= '9'); - } - - DEBUG(getid, "======= %d %s\n", isnumeric, token.c_str()); - - if(isnumeric) { - taskid_t id = atoi(token.c_str()); - DEBUG(getid, "======= id: %d\n", id); - return id; - } - - if(sym.find(token) == sym.end()) sym[token] = task_manager.createId(); - return sym[token]; + bool isnumeric = true; + for(size_t i = 0; i < token.size(); i++) + { + isnumeric &= (token[i] >= '0' && token[i] <= '9'); + } + + DEBUG(getid, "======= %d %s\n", isnumeric, token.c_str()); + + if(isnumeric) + { + taskid_t id = atoi(token.c_str()); + DEBUG(getid, "======= id: %d\n", id); + return id; + } + + if(sym.find(token) == sym.end()) + { + sym[token] = task_manager.createId(); + } + + return sym[token]; } inline static void create_msg_list(MsgTokensList& msgTokensList, MessageList& msgList, - bool clientmode) { - size_t origin = 0; - if(clientmode) { - origin = 1; - } + bool clientmode) +{ + size_t origin = 0; + if(clientmode) + { + origin = 1; + } + + std::map sym; - std::map sym; + MsgTokensList::iterator it_msg; + for(it_msg = msgTokensList.begin(); it_msg != msgTokensList.end(); it_msg++) + { + TokenVector t = *it_msg; - MsgTokensList::iterator it_msg; - for(it_msg = msgTokensList.begin(); it_msg != msgTokensList.end(); it_msg++) { - TokenVector t = *it_msg; + //malformed msg + if(t.size() < origin+1) + { + continue; + } - //malformed msg - if(t.size() < origin+1) continue; - - message_t m; + message_t m; - DEBUG(msgparser, "t[%d] : %s, running in clientmode: %d\n", - (int)origin, t[origin].c_str(), clientmode); + DEBUG(msgparser, "t[%d] : %s, running in clientmode: %d\n", + (int)origin, t[origin].c_str(), clientmode); // DEBUG(msgparser, "%d\n", t.size()); - if(t[origin] == "observe") m.cmd = cmd::observe; - else if(t[origin] == "unobserve") m.cmd = cmd::unobserve; - else if(t[origin] == "login") m.cmd = cmd::login; - else if(t[origin] == "logout") m.cmd = cmd::logout; - else if(t[origin] == "create") m.cmd = cmd::create; - else if(t[origin] == "remove") m.cmd = cmd::remove; - else if(t[origin] == "move") m.cmd = cmd::move; - else if(t[origin] == "update") m.cmd = cmd::update; - else m.cmd = cmd::error; - - switch(m.cmd) { - case cmd::observe: { - if(t.size() != origin+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - m.observe.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - break; - } - case cmd::unobserve: { - if(t.size() != origin+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - m.unobserve.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - DEBUG(msgparser, "unobserve @ %d\n", m.unobserve.id); - break; - } - case cmd::login: { - if(t.size() != origin+1+2) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - m.login.user = t[origin+1]; - m.login.password = t[origin+2]; - DEBUG(msgparser, "login %s\n", m.login.user.c_str()); - break; - } - case cmd::logout: - if(t.size() != origin+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - break; - case cmd::create: { - if(!clientmode && t.size() != origin+1+2) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - if(clientmode && t.size() != origin+1+2) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - if(clientmode) { - m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - m.create.parentid = getId(sym, t[origin+2]);// atoi(t[origin+2].c_str()); - } - else { - m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - m.create.parentid = getId(sym, t[origin+2]);//atoi(t[origin+1].c_str()); - } - break; - } - case cmd::remove: { - if(t.size() != origin+1+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - m.remove.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - break; - } - case cmd::move: { - if(t.size() != origin+2+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - m.move.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - m.move.parentid = getId(sym, t[origin+2]);//atoi(t[origin+2].c_str()); - break; - } - case cmd::update: { - if(t.size() != origin+3+1) { - DEBUG(msgparser, "Wrong number of parameters\n"); - continue; - } - m.update.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); - m.update.name = t[origin+2]; - m.update.value = t[origin+3]; - break; - } - default: - break; - }; - msgList.push_back(m); - } + if(t[origin] == "observe") m.cmd = cmd::observe; + else if(t[origin] == "unobserve") m.cmd = cmd::unobserve; + else if(t[origin] == "login") m.cmd = cmd::login; + else if(t[origin] == "logout") m.cmd = cmd::logout; + else if(t[origin] == "create") m.cmd = cmd::create; + else if(t[origin] == "remove") m.cmd = cmd::remove; + else if(t[origin] == "move") m.cmd = cmd::move; + else if(t[origin] == "update") m.cmd = cmd::update; + else m.cmd = cmd::error; + + switch(m.cmd) + { + case cmd::observe: + { + if(t.size() != origin+1+1) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + m.observe.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + } + break; + + case cmd::unobserve: + { + if(t.size() != origin+1+1) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + m.unobserve.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + DEBUG(msgparser, "unobserve @ %d\n", m.unobserve.id); + } + break; + + case cmd::login: + { + if(t.size() != origin+1+2) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + m.login.user = t[origin+1]; + m.login.password = t[origin+2]; + DEBUG(msgparser, "login %s\n", m.login.user.c_str()); + } + break; + + case cmd::logout: + if(t.size() != origin+1) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + break; + + case cmd::create: + { + if(!clientmode && t.size() != origin+1+2) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + if(clientmode && t.size() != origin+1+2) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + if(clientmode) + { + m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + m.create.parentid = getId(sym, t[origin+2]);// atoi(t[origin+2].c_str()); + } + else + { + m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + m.create.parentid = getId(sym, t[origin+2]);//atoi(t[origin+1].c_str()); + } + break; + } + case cmd::remove: + { + if(t.size() != origin+1+1) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + m.remove.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + } + break; + case cmd::move: + { + if(t.size() != origin+2+1) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + m.move.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + m.move.parentid = getId(sym, t[origin+2]);//atoi(t[origin+2].c_str()); + } + break; + case cmd::update: + { + if(t.size() != origin+3+1) + { + DEBUG(msgparser, "Wrong number of parameters\n"); + continue; + } + m.update.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str()); + m.update.name = t[origin+2]; + m.update.value = t[origin+3]; + } + break; + default: + break; + }; + msgList.push_back(m); + } } -MessageList parse_msg(std::string data) { - DEBUG(msgparser, "Parsing: '%s'\n", data.c_str()); +MessageList parse_msg(std::string data) +{ + DEBUG(msgparser, "Parsing: '%s'\n", data.c_str()); + + MsgTokensList msgTokensList; + parse_into_msg_tokens(data, msgTokensList); - MsgTokensList msgTokensList; - parse_into_msg_tokens(data, msgTokensList); - - MessageList msgList; - create_msg_list(msgTokensList, msgList, false); - - return msgList; + MessageList msgList; + create_msg_list(msgTokensList, msgList, false); + + return msgList; } -MessageList parse_msg_client(std::string data) { - DEBUG(msgparser, "Parsing: '%s'\n", data.c_str()); - MsgTokensList msgTokensList; - parse_into_msg_tokens(data, msgTokensList); - - MessageList msgList; - create_msg_list(msgTokensList, msgList, true); - - return msgList; +MessageList parse_msg_client(std::string data) +{ + DEBUG(msgparser, "Parsing: '%s'\n", data.c_str()); + MsgTokensList msgTokensList; + parse_into_msg_tokens(data, msgTokensList); + + MessageList msgList; + create_msg_list(msgTokensList, msgList, true); + + return msgList; } -std::string msg_tostring(message_t m) { - char* buf = NULL; - switch(m.cmd) { - case cmd::create: { - asprintf(&buf, "create %d %d;", - m.create.id, - m.create.parentid); - break; - } - case cmd::remove: { - asprintf(&buf, "remove %d;", m.remove.id); - break; - } - case cmd::move: { - asprintf(&buf, "move %d %d;", m.move.id, m.move.parentid); - break; - } - case cmd::update: { - asprintf(&buf, "update %d \"%s\" \"%s\";", - m.update.id, m.update.name.c_str(), m.update.value.c_str()); - break; - }; - default: - break; - } - - std::string r; - if(buf) { - r = buf; - free(buf); - } - - return r; +std::string msg_tostring(message_t m) +{ + char* buf = NULL; + switch(m.cmd) + { + case cmd::create: + asprintf(&buf, "create %d %d;", + m.create.id, + m.create.parentid); + break; + case cmd::remove: + asprintf(&buf, "remove %d;", m.remove.id); + break; + case cmd::move: + asprintf(&buf, "move %d %d;", m.move.id, m.move.parentid); + break; + case cmd::update: + asprintf(&buf, "update %d \"%s\" \"%s\";", + m.update.id, m.update.name.c_str(), m.update.value.c_str()); + break; + default: + break; + } + + std::string r; + if(buf) + { + r = buf; + free(buf); + } + + return r; } -message_t create_msg_create(task_t t) { - message_t m; - m.cmd = cmd::create; - m.create.id = t.id; - m.create.parentid = t.parentid; - return m; +message_t create_msg_create(task_t t) +{ + message_t m; + m.cmd = cmd::create; + m.create.id = t.id; + m.create.parentid = t.parentid; + return m; } -message_t create_msg_update(task_t t, const std::string &attr) { - message_t m; - m.cmd = cmd::update; - m.update.id = t.id; - m.update.name = attr; - m.update.value = t.attributes[attr]; - return m; +message_t create_msg_update(task_t t, const std::string &attr) +{ + message_t m; + m.cmd = cmd::update; + m.update.id = t.id; + m.update.name = attr; + m.update.value = t.attributes[attr]; + return m; } -message_t create_msg_remove(task_t t) { - message_t m; - m.cmd = cmd::remove; - m.remove.id = t.id; - return m; +message_t create_msg_remove(task_t t) +{ + message_t m; + m.cmd = cmd::remove; + m.remove.id = t.id; + return m; } -message_t create_msg_move(taskid_t id, taskid_t to) { - message_t m; - m.cmd = cmd::move; - m.move.id = id; - m.move.parentid = to; - return m; +message_t create_msg_move(taskid_t id, taskid_t to) +{ + message_t m; + m.cmd = cmd::move; + m.move.id = id; + m.move.parentid = to; + return m; } #ifdef TEST_MSGPARSER -- cgit v1.2.3