From ce3ee895ae8c893c0202e4cddb068dce9919cd0d Mon Sep 17 00:00:00 2001 From: deva Date: Mon, 6 Jul 2009 11:01:35 +0000 Subject: Added new macro tool binary to the project. --- server/src/.cvsignore | 1 + server/src/Makefile.am | 21 +++- server/src/macrotool.cc | 157 ++++++++++++++++++++++++ server/src/macrotool_dump.cc | 286 +++++++++++++++++++++++++++++++++++++++++++ server/src/macrotool_dump.h | 35 ++++++ 5 files changed, 499 insertions(+), 1 deletion(-) create mode 100644 server/src/macrotool.cc create mode 100644 server/src/macrotool_dump.cc create mode 100644 server/src/macrotool_dump.h diff --git a/server/src/.cvsignore b/server/src/.cvsignore index 9b80a8b..e7654ee 100644 --- a/server/src/.cvsignore +++ b/server/src/.cvsignore @@ -1,4 +1,5 @@ pracrod +macrotool Makefile.in Makefile .libs diff --git a/server/src/Makefile.am b/server/src/Makefile.am index a1920fe..768f563 100644 --- a/server/src/Makefile.am +++ b/server/src/Makefile.am @@ -1,5 +1,5 @@ -bin_PROGRAMS = pracrod +bin_PROGRAMS = pracrod macrotool pracrod_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) $(LUA_LIBS) -lpthread @@ -33,6 +33,25 @@ pracrod_SOURCES = \ widgetgenerator.cc \ xml_encode_decode.cc +macrotool_LDADD = $(LD_EFENCE) $(PQXX_LIBS) $(CONFIG_LIBS) $(LUA_LIBS) -lpthread + +macrotool_CXXFLAGS = $(PQXX_CXXFLAGS) $(CONFIG_CXXFLAGS) $(LUA_CXXFLAGS) + +macrotool_SOURCES = \ + macrotool.cc \ + debug.cc \ + configuration.cc \ + configurationparser.cc \ + database.cc \ + exception.cc \ + log.cc \ + macroparser.cc \ + macrotool_dump.cc \ + pracrodao.cc \ + pracrodaopgsql.cc \ + saxparser.cc \ + templateparser.cc + EXTRA_DIST = \ configuration.h \ configurationparser.h \ diff --git a/server/src/macrotool.cc b/server/src/macrotool.cc new file mode 100644 index 0000000..46fbc24 --- /dev/null +++ b/server/src/macrotool.cc @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * macrotool.cc + * + * Mon Jul 6 08:25:28 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. + */ +// For ETC +#include + +// For getopt_long and friends +#include + +#include "configurationparser.h" +#include "configuration.h" + +#include "debug.h" + +#include "macrotool_dump.h" + +static const char version_str[] = +"Pracro server v" VERSION "\n" +; + +static const char copyright_str[] = +"Copyright (C) 2006-2009 Bent Bisballe Nyeng - Aasimon.org.\n" +"This is free software. You may redistribute copies of it under the terms of\n" +"the GNU General Public License .\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +"Written by Bent Bisballe Nyeng (deva@aasimon.org)\n" +; + +static const char usage_str[] = +"Usage: %s [options] command\n" +"Options:\n" +" -c, --config file Read configfile from 'file'\n" +" -x, --xml-basedir d Use 'd' as basedir for finding template- and macro-files (default "XML").\n" +" -v, --version Print version information and exit.\n" +" -h, --help Print this message and exit.\n" +" -D, --debug ddd Enable debug messages on 'ddd'; see documentation for details\n" +"\n" +"Commands:\n" +" dump entity Dumps 'entity' to screen ('dump help' to see list of entities).\n" +; + +ConfigurationParser *configparser = NULL; + +int main(int argc, char *argv[]) +{ + int c; + char *configfile = NULL; + char *xml_basedir = NULL; + char *debugstr = NULL; + + pracro_debug_init(); + + int option_index = 0; + while(1) { + static struct option long_options[] = { + {"config", required_argument, 0, 'c'}, + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'v'}, + {"xml-basedir", required_argument, 0, 'x'}, + {"debug", required_argument, 0, 'D'}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "D:hvc:x:", long_options, &option_index); + + if (c == -1) + break; + + switch(c) { + case 'c': + configfile = strdup(optarg); + break; + + case 'x': + xml_basedir = strdup(optarg); + break; + + case 'D': + debugstr = strdup(optarg); + break; + + case '?': + case 'h': + printf(version_str); + printf(usage_str, argv[0]); + return 0; + + case 'v': + printf(version_str); + printf(copyright_str); + return 0; + + default: + break; + } + } + + if(optind >= argc) { + fprintf(stderr, "Missing command\n"); + printf(usage_str, argv[0]); + exit(EXIT_FAILURE); + } + + std::string command = argv[optind]; + + if(debugstr) { + pracro_debug_parse(debugstr); + } + + // Load config + if(configfile) configparser = new ConfigurationParser(configfile); + else configparser = new ConfigurationParser(ETC"/pracrod.conf"); + + if(xml_basedir) { + Conf::xml_basedir = xml_basedir; + } + + if(command == "dump") { + optind++; + if(optind >= argc) { + fprintf(stderr, "Missing command parameter\n"); + printf(usage_str, argv[0]); + exit(EXIT_FAILURE); + } + macrotool_dump(argv[optind]); + } + + // Clean up + if(configfile) free(configfile); + + return 0; +} 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 +#include +#include + +#include +#include + +#include + +#include "configuration.h" + +struct _macro { + std::string name; + std::string title; + std::set templates; + std::string file; + std::string version; +}; + +struct _template { + std::string name; + std::string title; + std::vector 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 listdir(std::string path) +{ + std::vector 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 getMacros() +{ + std::vector macros = listdir(Conf::xml_basedir + "/macros"); + return macros; +} + +static std::vector getTemplates() +{ + std::vector 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 macroList() +{ + std::map macros; + + std::vector macrofiles = getMacros(); + std::vector::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 templatefiles = getTemplates(); + std::vector::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::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 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::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::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 templateList() +{ + std::map templates; + + std::vector templatefiles = getTemplates(); + std::vector::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::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 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::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::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; + } + +} diff --git a/server/src/macrotool_dump.h b/server/src/macrotool_dump.h new file mode 100644 index 0000000..cc5adff --- /dev/null +++ b/server/src/macrotool_dump.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * macrotool_dump.h + * + * 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. + */ +#ifndef __PRACRO_MACROTOOL_DUMP_H__ +#define __PRACRO_MACROTOOL_DUMP_H__ + +#include + +void macrotool_dump(std::string param); + +#endif/*__PRACRO_MACROTOOL_DUMP_H__*/ -- cgit v1.2.3