[Scummvm-cvs-logs] SF.net SVN: scummvm:[41597] tools/branches/gsoc2009-decompiler/decompiler

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Tue Jun 16 23:42:04 CEST 2009


Revision: 41597
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41597&view=rev
Author:   kjdf
Date:     2009-06-16 21:42:03 +0000 (Tue, 16 Jun 2009)

Log Message:
-----------
decompiler: graph library take 1

Modified Paths:
--------------
    tools/branches/gsoc2009-decompiler/decompiler/misc.h

Added Paths:
-----------
    tools/branches/gsoc2009-decompiler/decompiler/graph2.h
    tools/branches/gsoc2009-decompiler/decompiler/test.cc

Added: tools/branches/gsoc2009-decompiler/decompiler/graph2.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph2.h	                        (rev 0)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph2.h	2009-06-16 21:42:03 UTC (rev 41597)
@@ -0,0 +1,99 @@
+#ifndef GRAPH_H
+#define GRAPH_H
+
+typedef unsigned id_t;
+
+#include <map>
+#include <list>
+#include <string>
+#include <sstream>
+
+#include "misc.h"
+
+using namespace std;
+
+
+string escape(const string &s) {
+	string ret;
+	foreach (char c, s) {
+		if (c == '\\' || c == '"')
+			ret.push_back('\\');
+		ret.push_back(c);
+	}
+	return ret;
+};
+
+
+template<typename Data>
+struct Graph {
+
+
+	struct NodeInfo {
+		list<NodeInfo*> _in;
+		list<NodeInfo*> _out;
+		Data _data;
+		NodeInfo(Data data) : _data(data) {
+		}
+	};
+
+
+	struct Node {
+		Graph *_graph;
+		NodeInfo* _info;
+
+		Node(Graph *graph, NodeInfo *info): _graph(graph), _info(info) {
+		}
+
+		list<Node> out() {
+			list<Node> ret;
+			foreach (NodeInfo *v, _info->_out)
+				ret.push_back(Node(_graph, v));
+			return ret;
+		}
+
+		void addEdge(Node v) {
+			_graph->addEdge(*this, v);
+		}
+
+		Data &operator*() {
+			return _info->_data;
+		}
+
+		Data *operator->() {
+			return &_info->_data;
+		}
+	};
+
+	list<NodeInfo*> _nodes;
+
+	Graph() {
+	}
+
+	Node addNode(Data data) {
+		NodeInfo* info = new NodeInfo(data);
+		_nodes.push_back(info);
+		return Node(this, info);
+	}
+
+	void addEdge(Node from, Node to) {
+		from._info->_out.push_back(to._info);
+		to._info->_in.push_back(from._info);
+	}
+
+	// printer :: Data -> string
+	template<typename Printer>
+	string print(Printer printer) {
+		stringstream ret;
+		ret << "digraph G {" << endl;
+		foreach (NodeInfo *u, _nodes) {
+			ret << (unsigned) u << " [shape=box,label=\"" << escape(printer(u->_data)) << "\"];" << endl;
+			foreach (NodeInfo *v, u->_out)
+				ret << (unsigned) u << " -> " << (unsigned) v << ";" << endl;
+		}
+		ret << "}" << endl;
+		return ret.str();
+	}
+
+};
+
+#endif


Property changes on: tools/branches/gsoc2009-decompiler/decompiler/graph2.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Modified: tools/branches/gsoc2009-decompiler/decompiler/misc.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/misc.h	2009-06-16 21:23:26 UTC (rev 41596)
+++ tools/branches/gsoc2009-decompiler/decompiler/misc.h	2009-06-16 21:42:03 UTC (rev 41597)
@@ -3,6 +3,10 @@
 
 #include <fstream>
 
+#include <boost/foreach.hpp>
+
+#define foreach BOOST_FOREACH
+
 using namespace std;
 
 typedef unsigned char uint8;

Added: tools/branches/gsoc2009-decompiler/decompiler/test.cc
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/test.cc	                        (rev 0)
+++ tools/branches/gsoc2009-decompiler/decompiler/test.cc	2009-06-16 21:42:03 UTC (rev 41597)
@@ -0,0 +1,30 @@
+#include <cstdio>
+
+#include "graph2.h"
+
+#include <string>
+#include <sstream>
+#include <iostream>
+using namespace std;
+
+string printer(int i) {
+	stringstream ret;
+	ret << "node \\ containing \"" << i << "\"";
+	return ret.str();
+};
+
+typedef Graph<int>::Node node;
+
+int main() {
+	Graph<int> g;
+	node a = g.addNode(0);
+	g.addEdge(a, g.addNode(1));
+	g.addEdge(a, g.addNode(2));
+	g.addEdge(a, g.addNode(0));
+	g.addEdge(a, g.addNode(0));
+	*a = 6;
+	foreach (node u, a.out()) 
+		*u = 12;
+	cout << g.print(printer) << endl;
+	return 0;
+}


Property changes on: tools/branches/gsoc2009-decompiler/decompiler/test.cc
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list