/*
* $Revision: 2564 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
***************************************************************/
/** \file
* \brief Declaration of class XmlParser.
*
* \author Sebastian Leipert and Carsten Gutwenger
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program 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.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifdef _MSC_VER
#pragma once
#endif
#ifndef OGDF_XML_PARSER_H
#define OGDF_XML_PARSER_H
#include "../basic/Hashing.h"
#include "../basic/String.h"
#include "../basic/GraphAttributes.h"
#include "XmlObject.h"
#include "../basic/SList.h"
namespace ogdf {
//---------------------------------------------------------
// XmlParser
// reads XML file and constructs XML parse tree
//---------------------------------------------------------
class OGDF_EXPORT XmlParser {
Hashing m_hashTable; // hash table for tags
int m_num;
istream *m_is;
bool m_error;
String m_errorString;
char *m_rLineBuffer, *m_lineBuffer, *m_pCurrent, *m_pStore, m_cStore;
int m_intSymbol; // integer attribute
double m_doubleSymbol; // double attribute
const char *m_stringSymbol; // string attribute
char *m_keyName; // Tag name
XmlKey m_keySymbol; // Tag name and Attribute Name in Hash Table
String m_longString;
bool m_eoTag; // end of Tag recognized
XmlObject *m_objectTree; // root node of XML parse tree
bool m_doCheck;
SList m_objectBody;
public:
// predefined id constants for all used keys
enum PredefinedKey { idPredefKey = 0, labelPredefKey, CreatorPredefKey,
namePredefKey, graphPredefKey, versionPredefKey, directedPredefKey,
nodePredefKey, edgePredefKey, graphicsPredefKey, xPredefKey,
yPredefKey, wPredefKey, hPredefKey, nodetypePredefKey, edgetypePredefKey,
typePredefKey, widthPredefKey, heightPredefKey, sizePredefKey,
positionPredefKey, pathPredefKey,
sourcePredefKey, targetPredefKey, sensePredefKey, arrowPredefKey, LinePredefKey,
pointPredefKey, NEXTPREDEFKEY };
// construction: creates object tree
// sets m_error flag if an error occured
XmlParser(const char *fileName, bool doCheck = false);
XmlParser(istream &is, bool doCheck = false);
// destruction: destroys object tree
~XmlParser();
// returns root object
XmlObject *root() { return m_objectTree; }
// id of a string in hash table; -1 if not contained
int getId(const String &tag) const {
HashElement *it = m_hashTable.lookup(tag);
return (it != 0) ? it->info() : -1;
}
// returns id of object
int id(XmlObject *object) const { return object->m_key->info(); }
// true <=> an error in XML files has been detected
bool error() const { return m_error; }
// returns error message
const String &errorString() const { return m_errorString; }
// creates graph from XML parse tree
bool read(Graph &G);
// creates attributed graph from XML parse tree
bool read(Graph &G, GraphAttributes &AG);
private:
void createObjectTree(istream &is, bool doCheck);
void initPredefinedKeys();
void setError(const char *errorString);
XmlObject *parseList(XmlObjectType closingKey, XmlObjectType errorKey, const char *objectBodyName);
XmlObjectType getNextSymbol();
bool getLine();
XmlKey hashString(const String &str);
XmlObject *getNodeIdRange(
int &minId,
int &maxId,
int &nodetypeCount,
XmlObject *graphObject);
bool makeIdMap(
int maxId,
Array &idMap,
int nodetypeCount,
Array & typeName,
Array &typeWidth,
Array &typeHeight,
XmlObject *graphObject);
void closeLabels(Array idMap, Array typeName);
void readLineAttribute(XmlObject *object, DPolyline &dpl);
void destroyObjectList(XmlObject *object);
void indent(ostream &os, int d);
void output(ostream &os, XmlObject *object, int d);
};
} // end namespace ogdf
#endif