summaryrefslogtreecommitdiff
path: root/server/src/macroheaderparser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/macroheaderparser.cc')
-rw-r--r--server/src/macroheaderparser.cc149
1 files changed, 149 insertions, 0 deletions
diff --git a/server/src/macroheaderparser.cc b/server/src/macroheaderparser.cc
new file mode 100644
index 0000000..4c61929
--- /dev/null
+++ b/server/src/macroheaderparser.cc
@@ -0,0 +1,149 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * macroheaderparser.cc
+ *
+ * Wed Jul 22 08:42:23 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 "debug.h"
+#include "macroheaderparser.h"
+#include "configuration.h"
+
+#include <stdio.h>
+
+// For assert
+#include <assert.h>
+
+// For open and friends
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+// For vprintf and friends
+#include <stdarg.h>
+
+#ifndef XML
+// For XML
+#include <config.h>
+#endif/*XML*/
+
+#include <errno.h>
+#include <string.h>
+
+#include "exception.h"
+
+void MacroHeaderParser::error(const char* fmt, ...)
+{
+ // TODO: Throw exception here.
+
+ PRACRO_ERR_LOG(macro, "Error in MacroHeaderParser: ");
+
+ {
+ va_list argp;
+ va_start(argp, fmt);
+ PRACRO_ERR_LOG_VA(macro, fmt, argp);
+ va_end(argp);
+
+ fprintf(stderr, "\n");
+ }
+
+ {
+ char *p;
+ va_list argp;
+ va_start(argp, fmt);
+ if(vasprintf(&p, fmt, argp) != -1) {
+ throw Exception("Error in MacroHeaderParser: " + std::string(p));
+ free(p);
+ }
+ va_end(argp);
+ }
+
+}
+
+MacroHeaderParser::MacroHeaderParser(std::string macrofile)
+{
+ m = NULL;
+
+ file = macrofile;
+
+ PRACRO_DEBUG(macro, "Using macro file: %s\n", macrofile.c_str());
+
+ fd = open(macrofile.c_str(), O_RDONLY);
+ if(fd == -1) error("Could not open file %s", macrofile.c_str());
+}
+
+MacroHeaderParser::~MacroHeaderParser()
+{
+ if(fd != -1) close(fd);
+ if(m) delete m;
+}
+
+void MacroHeaderParser::startTag(std::string name, std::map< std::string, std::string> attributes)
+{
+ // Create macro and enable parsing of queries, maps and window
+ if(name == "macro") {
+ assert(!m); // A Macro has already been allocated, cannot create macro!
+ m = new Macro();
+ m->attributes = attributes;
+ }
+}
+
+int MacroHeaderParser::readData(char *data, size_t size)
+{
+ if(m) return 0; // If m is allocated, it means that we have parsed the macro
+ // tag, and can dismiss the rest of the document.
+
+ if(fd == -1) {
+ PRACRO_ERR_LOG(macro, "Invalid file descriptor.\n");
+ return 0;
+ }
+ ssize_t r = read(fd, data, size);
+ if(r == -1) {
+ PRACRO_ERR_LOG(macro, "Could not read...%s\n", strerror(errno));
+ return 0;
+ }
+ return r;
+}
+
+void MacroHeaderParser::parseError(char *buf, size_t len, std::string error, int lineno)
+{
+ if(m) return; // Ignore "unclosed token" errors when the macro tag has been parsed.
+
+ PRACRO_ERR_LOG(macro, "MacroHeaderParser[%s] error at line %d: %s\n", file.c_str(), lineno, error.c_str());
+ PRACRO_ERR_LOG(macro, "\tBuffer %u bytes: [", len);
+ if(fwrite(buf, len, 1, stderr) != len) {}
+ PRACRO_ERR_LOG(macro, "]\n");
+
+ char *slineno;
+ if(asprintf(&slineno, " at line %d\n", lineno) != -1) {
+ throw Exception(error + slineno);
+ free(slineno);
+ }
+
+}
+
+Macro *MacroHeaderParser::getMacro()
+{
+ return m;
+}