From d4bfeb646063367a4537954203c92e71d7242a98 Mon Sep 17 00:00:00 2001 From: fluxgen Date: Sun, 2 May 2004 21:02:26 +0000 Subject: parses fluxbox menu file --- src/FbMenuParser.cc | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/FbMenuParser.hh | 58 ++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/FbMenuParser.cc create mode 100644 src/FbMenuParser.hh diff --git a/src/FbMenuParser.cc b/src/FbMenuParser.cc new file mode 100644 index 0000000..fbb96b1 --- /dev/null +++ b/src/FbMenuParser.cc @@ -0,0 +1,127 @@ +// FbMenuParser.cc for Fluxbox +// Copyright (c) 2004 Henrik Kinnunen (fluxgen at users.sourceforge.net) +// and Simon Bowden (rathnor at users.sourceforge.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: FbMenuParser.cc,v 1.1 2004/05/02 21:02:26 fluxgen Exp $ + +#include "FbMenuParser.hh" + +#include "FbTk/StringUtil.hh" + +bool FbMenuParser::open(const std::string &filename) { + m_file.open(filename.c_str()); + m_curr_pos = 0; + m_row = 0; + m_curr_token = DONE; + return isLoaded(); +} + +Parser &FbMenuParser::operator >> (Parser::Item &out) { + if (eof()) { + out = Parser::s_empty_item; + return *this; + } + + if (m_curr_line.empty()) + m_curr_token = DONE; // try next line + + char first = '['; + char second = ']'; + + switch (m_curr_token) { + case TYPE: + first = '['; + second = ']'; + break; + case NAME: + first = '('; + second = ')'; + break; + case ARGUMENT: + first = '{'; + second = '}'; + break; + case DONE: // get new line and call this again + if (!nextLine()) { + out = Parser::s_empty_item; + return *this; + } + return (*this)>>out; + break; + } + + std::string key; + int err = FbTk::StringUtil:: + getStringBetween(key, m_curr_line.c_str() + m_curr_pos, + first, second); + if (err <= 0) { + if (m_curr_token == TYPE) + m_curr_token = NAME; + else if (m_curr_token == NAME) + m_curr_token = ARGUMENT; + else if (m_curr_token == ARGUMENT) + m_curr_token = DONE; + + out = Parser::s_empty_item; + return *this; + } + + m_curr_pos += err; // update current position in current line + + // set value + out.second = key; + + // set type and next token to be read + switch (m_curr_token) { + case TYPE: + out.first = "TYPE"; + m_curr_token = NAME; + break; + case NAME: + out.first = "NAME"; + m_curr_token = ARGUMENT; + break; + case ARGUMENT: + out.first = "ARGUMENT"; + m_curr_token = DONE; + break; + case DONE: + break; + } + return *this; +} + +Parser::Item FbMenuParser::nextItem() { + Parser::Item item; + (*this)>>item; + return item; +} + +bool FbMenuParser::nextLine() { + if (!getline(m_file, m_curr_line)) + return false; + + m_row++; + m_curr_pos = 0; + m_curr_token = TYPE; + + return true; +} diff --git a/src/FbMenuParser.hh b/src/FbMenuParser.hh new file mode 100644 index 0000000..e274ed8 --- /dev/null +++ b/src/FbMenuParser.hh @@ -0,0 +1,58 @@ +// FbMenuParser.hh for Fluxbox +// Copyright (c) 2004 Henrik Kinnunen (fluxgen at users.sourceforge.net) +// and Simon Bowden (rathnor at users.sourceforge.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: FbMenuParser.hh,v 1.1 2004/05/02 21:02:26 fluxgen Exp $ + +#ifndef FBMENUPARSER_HH +#define FBMENUPARSER_HH + +#include "Parser.hh" + +#include + +class FbMenuParser: public Parser { +public: + FbMenuParser():m_row(0), m_curr_pos(0), m_curr_token(TYPE) {} + FbMenuParser(const std::string &filename):m_row(0), m_curr_pos(0), + m_curr_token(TYPE) { open(filename); } + ~FbMenuParser() { close(); } + + bool open(const std::string &filename); + void close() { m_file.close(); } + Parser &operator >> (Parser::Item &out); + Parser::Item nextItem(); + + bool isLoaded() const { return m_file.is_open(); } + bool eof() const { return m_file.eof(); } + int row() const { return m_row; } + std::string line() const { return m_curr_line; } +private: + bool nextLine(); + + mutable std::ifstream m_file; + int m_row; + int m_curr_pos; + std::string m_curr_line; + enum Object {TYPE, NAME, ARGUMENT, DONE} m_curr_token; +}; + +#endif // FBMENUPARSER_HH -- cgit v0.11.2