From d4bfeb646063367a4537954203c92e71d7242a98 Mon Sep 17 00:00:00 2001
From: fluxgen <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 <fstream>
+
+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