diff options
Diffstat (limited to 'src/msgparser.cc')
-rw-r--r-- | src/msgparser.cc | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/msgparser.cc b/src/msgparser.cc new file mode 100644 index 0000000..ec41b3b --- /dev/null +++ b/src/msgparser.cc @@ -0,0 +1,128 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * msgparser.cc + * + * Fri Feb 24 14:59:34 CET 2012 + * Copyright 2012 Jonas Suhr Christensen + * jsc@umbraculum.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Munia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "msgparser.h" +#include <stdlib.h> +#include <stdio.h> + +inline void parse_add(msg_t& m, std::string data) { + int offset = 0; + std::string title = data.substr(offset, data.find(' ', offset) - offset); + offset += title.length() + 1; + std::string desc = data.substr(offset, data.find(' ', offset) - offset); + offset += desc.length() + 1; + std::string x_str = data.substr(offset, data.find(' ', offset) - offset); + int x = atoi(x_str.c_str()); + offset += x_str.length() + 1; + std::string y_str = data.substr(offset, data.find(' ', offset) - offset); + int y = atoi(y_str.c_str()); + + sprintf(m.add.title, "%s", desc.c_str()); + sprintf(m.add.desc, "%s", desc.c_str()); + m.add.x = x; + m.add.y = y; +} + +inline void parse_del(msg_t& m, std::string data) { + int offset = 0; + std::string id_str = data.substr(offset, data.find(' ', offset) - offset); + int id = atoi(id_str.c_str()); + + m.del.id = id; +} + +inline void parse_move(msg_t& m, std::string data) { + int offset = 1; + std::string s_id = data.substr(offset, data.find(' ', offset) - offset); + int id = atoi(s_id.c_str()); + offset += s_id.length() + 1; + std::string x_str = data.substr(offset, data.find(' ', offset) - offset); + int x = atoi(x_str.c_str()); + offset += x_str.length() + 1; + std::string y_str = data.substr(offset, data.find(' ', offset) - offset); + int y = atoi(y_str.c_str()); + + m.move.id = id; + m.move.x = x; + m.move.y = y; +} + +MsgVector parse_msg(std::string data) { + + //todo: explode on ';' and handle '"' and escaping + + printf("parsing: %s\n", data.c_str()); + + msg_t m; + + std::string cmd = data.substr(0, data.find(' ')); + + if(cmd == "add") m.cmd = cmd::add; + else if(cmd == "del") m.cmd = cmd::del; + else if(cmd == "move") m.cmd = cmd::move; + else if(cmd == "update") m.cmd = cmd::update; + else m.cmd = cmd::error; + + data = data.substr(cmd.length()+1, std::string::npos); + + switch(m.cmd) { + case cmd::add: + parse_add(m, data); + break; + case cmd::del: + parse_del(m, data); + break; + case cmd::move: + parse_move(m, data); + break; + case cmd::update: + break; + default: + break; + } + + MsgVector v; v.push_back(m); + return v; +} + +#ifdef TEST_MSGPARSER +//Additional dependency files +//deps: +//Required cflags (autoconf vars may be used) +//cflags: +//Required link options (autoconf vars may be used) +//libs: +#include "test.h" + +TEST_BEGIN; + +// TODO: Put some testcode here (see test.h for usable macros). +TEST_TRUE(false, "No tests yet!"); + +TEST_END; + +#endif/*TEST_MSGPARSER*/ |