diff options
Diffstat (limited to 'server/src/macroheaderparser.cc')
-rw-r--r-- | server/src/macroheaderparser.cc | 149 |
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; +} |