summaryrefslogtreecommitdiff
path: root/server/src/macrotool_dump.cc
diff options
context:
space:
mode:
authordeva <deva>2009-07-06 11:01:35 +0000
committerdeva <deva>2009-07-06 11:01:35 +0000
commitce3ee895ae8c893c0202e4cddb068dce9919cd0d (patch)
treee9fb1550e72da7531c65db72f8fd38df90059c16 /server/src/macrotool_dump.cc
parentee93b9e274f3aeb3f4b7b6ba33cf07098fe21d8a (diff)
Added new macro tool binary to the project.
Diffstat (limited to 'server/src/macrotool_dump.cc')
-rw-r--r--server/src/macrotool_dump.cc286
1 files changed, 286 insertions, 0 deletions
diff --git a/server/src/macrotool_dump.cc b/server/src/macrotool_dump.cc
new file mode 100644
index 0000000..93a96a3
--- /dev/null
+++ b/server/src/macrotool_dump.cc
@@ -0,0 +1,286 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macrotool_dump.cc
+ *
+ * Mon Jul 6 08:37:22 CEST 2009
+ * Copyright 2009 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro 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.
+ *
+ * Pracro 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 Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "macrotool_dump.h"
+
+#include "debug.h"
+
+#include "macroparser.h"
+#include "templateparser.h"
+
+#include <vector>
+#include <map>
+#include <set>
+
+#include <sys/types.h>
+#include <dirent.h>
+
+#include <config.h>
+
+#include "configuration.h"
+
+struct _macro {
+ std::string name;
+ std::string title;
+ std::set<std::string> templates;
+ std::string file;
+ std::string version;
+};
+
+struct _template {
+ std::string name;
+ std::string title;
+ std::vector<std::string> macros;
+ std::string file;
+ std::string version;
+};
+
+static const char usage_str[] =
+" help Prints this helptext.\n"
+" macros Writes macro names, versions, filenames, titles and template references to stdout.\n"
+" templates Writes template names, versions, filenames, titles and macro references to stdout.\n"
+;
+
+
+static std::vector<std::string> listdir(std::string path)
+{
+ std::vector<std::string> files;
+
+ DIR* dir = opendir(path.c_str());
+ if(!dir) {
+ PRACRO_ERR(dump, "Could not open directory: %s\n", path.c_str());
+ return files;
+ }
+
+ struct dirent *d;
+ while((d = readdir(dir)) != 0) {
+ //if(d->d_type == DT_DIR) {
+ std::string name = d->d_name;
+ if(name.length() >= 4 && name.substr(name.length() - 4) == ".xml")
+ files.push_back(name);
+ //}
+ }
+ closedir(dir);
+
+ return files;
+}
+
+static std::vector<std::string> getMacros()
+{
+ std::vector<std::string> macros = listdir(Conf::xml_basedir + "/macros");
+ return macros;
+}
+
+static std::vector<std::string> getTemplates()
+{
+ std::vector<std::string> templates = listdir(Conf::xml_basedir + "/templates");
+ return templates;
+}
+
+static void printcolumn(std::string text, size_t width)
+{
+ printf(text.c_str());
+ for(size_t i = text.length(); i < width; i++) printf(" ");
+ printf("\t");
+}
+
+static std::map<std::string, struct _macro> macroList()
+{
+ std::map<std::string, struct _macro> macros;
+
+ std::vector<std::string> macrofiles = getMacros();
+ std::vector<std::string>::iterator mfs = macrofiles.begin();
+ while(mfs != macrofiles.end()) {
+ std::string name = mfs->substr(0, mfs->length() - 4);
+
+ MacroParser parser(name);
+ parser.parse();
+ Macro *macro = parser.getMacro();
+
+ std::string key = name;// + macro->attributes["version"];
+ macros[key].name = name;
+ macros[key].file = *mfs;
+ macros[key].title = macro->window.attributes["caption"];
+ macros[key].version = macro->attributes["version"];
+
+ mfs++;
+ }
+
+ std::vector<std::string> templatefiles = getTemplates();
+ std::vector<std::string>::iterator tfs = templatefiles.begin();
+ while(tfs != templatefiles.end()) {
+ std::string course = tfs->substr(0, tfs->length() - 4);
+ TemplateParser parser(course);
+ parser.parse();
+ Template *t = parser.getTemplate();
+ std::vector<Macro>::iterator ms = t->course.macros.begin();
+ while(ms != t->course.macros.end()) {
+ if(ms->attributes.find("header") == ms->attributes.end())
+ macros[ms->attributes["name"]].templates.insert(course);
+ ms++;
+ }
+ tfs++;
+ }
+
+ return macros;
+}
+
+static void dump_macros()
+{
+ std::map<std::string, struct _macro> macros = macroList();
+ macros[""].title = "Title:";
+ macros[""].file = "File:";
+ macros[""].version = "Version:";
+ macros[""].name = "Macro:";
+ macros[""].templates.insert("Templates:");
+
+ size_t name_sz = 0;
+ size_t version_sz = 0;
+ size_t file_sz = 0;
+ size_t title_sz = 0;
+
+ std::map<std::string, struct _macro>::iterator ms = macros.begin();
+ while(ms != macros.end()) {
+ if(ms->second.name.length() > name_sz) name_sz = ms->second.name.length();
+ if(ms->second.version.length() > version_sz) version_sz = ms->second.version.length();
+ if(ms->second.file.length() > file_sz) file_sz = ms->second.file.length();
+ if(ms->second.title.length() > title_sz) title_sz = ms->second.title.length();
+ ms++;
+ }
+
+ ms = macros.begin();
+ while(ms != macros.end()) {
+ printcolumn(ms->second.name, name_sz);
+ printcolumn(ms->second.version, version_sz);
+ printcolumn(ms->second.file, file_sz);
+ printcolumn(ms->second.title, title_sz);
+
+ std::set<std::string>::iterator ts = ms->second.templates.begin();
+ while(ts != ms->second.templates.end()) {
+ if(ts != ms->second.templates.begin()) printf(", ");
+ printf("%s", ts->c_str() );
+ ts++;
+ }
+
+ printf("\n");
+ ms++;
+ }
+}
+
+static std::map<std::string, struct _template> templateList()
+{
+ std::map<std::string, struct _template> templates;
+
+ std::vector<std::string> templatefiles = getTemplates();
+ std::vector<std::string>::iterator tfs = templatefiles.begin();
+ while(tfs != templatefiles.end()) {
+ std::string course = tfs->substr(0, tfs->length() - 4);
+ TemplateParser parser(course);
+ parser.parse();
+ Template *t = parser.getTemplate();
+
+ std::string key = t->course.attributes["name"];
+
+ templates[key].file = *tfs;
+ templates[key].name = t->course.attributes["name"];
+ templates[key].title = t->course.attributes["title"];
+ templates[key].version = t->course.attributes["version"];
+
+ std::vector<Macro>::iterator ms = t->course.macros.begin();
+ while(ms != t->course.macros.end()) {
+ if(ms->attributes.find("header") == ms->attributes.end())
+ templates[key].macros.push_back(ms->attributes["name"]);
+ ms++;
+ }
+
+ tfs++;
+ }
+
+ return templates;
+}
+
+static void dump_templates()
+{
+ std::map<std::string, struct _template> templates = templateList();
+ templates[""].title = "Title:";
+ templates[""].file = "File:";
+ templates[""].version = "Version:";
+ templates[""].name = "Template:";
+
+ size_t name_sz = 0;
+ size_t version_sz = 0;
+ size_t file_sz = 0;
+ size_t title_sz = 0;
+
+ std::map<std::string, struct _template>::iterator ts = templates.begin();
+ while(ts != templates.end()) {
+ if(ts->second.name.length() > name_sz) name_sz = ts->second.name.length();
+ if(ts->second.version.length() > version_sz) version_sz = ts->second.version.length();
+ if(ts->second.file.length() > file_sz) file_sz = ts->second.file.length();
+ if(ts->second.title.length() > title_sz) title_sz = ts->second.title.length();
+ ts++;
+ }
+
+ ts = templates.begin();
+ while(ts != templates.end()) {
+ printcolumn(ts->second.name, name_sz);
+ printcolumn(ts->second.version, version_sz);
+ printcolumn(ts->second.file, file_sz);
+ printcolumn(ts->second.title, title_sz);
+
+ printf("\n");
+ std::vector<std::string>::iterator ms = ts->second.macros.begin();
+ while(ms != ts->second.macros.end()) {
+ printf("\t%s\n", ms->c_str() );
+ ms++;
+ }
+
+ printf("\n");
+ ts++;
+ }
+}
+
+void macrotool_dump(std::string param)
+{
+ PRACRO_DEBUG(dump, "dump: %s\n", param.c_str());
+
+ if(param == "help") {
+ printf(usage_str);
+ return;
+ }
+
+ if(param == "macros") {
+ dump_macros();
+ return;
+ }
+
+ if(param == "templates") {
+ dump_templates();
+ return;
+ }
+
+}