/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 */
//
// File:	HTMLMethodDump.h
// Author:	Simon Holmes a Court
//

#ifdef DEBUG_LOG
#include <fstream.h>

void dumpDissasembly(LogModuleObject &f, Uint8* start, Uint8* end);

//-----------------------------------------------------------------------------------------------------------
// Debugging Code for outputting HTML index
struct FileNode
{
	const char*	fileName;
	const char*	methodName;
	FileNode*	next;

	FileNode(const char* inFileName, const char* inMethodName) : 
		fileName(inFileName), methodName(inMethodName), next(NULL) {};
};

struct ClassNode
{
	const char*	className;
	FileNode*	files;	// pointers to files
	ClassNode*	next;

	ClassNode(const char* inClassName) : className(inClassName), files(NULL), next(NULL) {};
};

// Object to store references to all the HTML files generated

class FileIndex
{
private:
	ClassNode*	classes;

	FileIndex() : classes(NULL) {};
	ClassNode*	findClassName(const char* className);
	void		insertFileHelper(const char* fileName, const char* methodName, const char* className);
	void		outputHelper();
	// FIX no destructor -- memory leak

public:
//	static inline FileIndex& getFileIndex() { return (FileIndex::sFileIndex); };
	static FileIndex sFileIndex;

	static void	output() { FileIndex::sFileIndex.outputHelper(); }
	static void	insertFile(const char* f, const char* m, const char* c) { FileIndex::sFileIndex.insertFileHelper(f, m, c); }
};

//-----------------------------------------------------------------------------------------------------------
// MethodToHTML
UT_EXTERN_LOG_MODULE(MethodToHtml);

class MethodToHTML
{
public:
	LogModuleObject &mFile;

	MethodToHTML() : mFile(UT_LOG_MODULE(MethodToHtml)) {}

	// file stuff
	void openFile(const char* fileName);
	void closeFile();

	// html to begin and end a page
	void pageBegin(const char* name);
	void pageEnd();
	void heading(const char* label);

	// statistics
	void statsBegin();
	void statsLine(const char* label, const char* value);
	void statsLine(const char* label, const char* value1, const char* value2, const char* value3);
	void statsLine(const char* label, const int value);
	void bigstatsLine(const char* label, const char* value);
	void statsEnd();

	// dissassembly table
	void disassemblyTableBegin();
	void disassemblyRowBegin(Uint32 nodeNum);
	void disassemblyRowBegin(const char* label);
	void disassemblyColumnSeparator(Uint32 color);
	void disassemblyRowEnd();
	void disassemblyTableEnd();
};

#endif // DEBUG_LOG

