⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 notationfile.hpp

📁 机甲指挥官2源代码
💻 HPP
字号:
//===========================================================================//
// File:     notation.hpp                                                    //
// Title:    Declaration of NotationFile classes.                            //
// Purpose:  Provide general purpose access to data stored in a formatted    //
//           text file.                                                      //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#pragma once

#include "Stuff.hpp"
#include "Scalar.hpp"
#include "FileStream.hpp"
#include "Tree.hpp"

namespace Stuff {

	class NotationFile;
	class Page;
	class Note;

	class Macro;
	typedef TreeOf<Macro *, MString> MacroTree;

	class Macro:
		public Plug
	{
	public:
		MString m_macro;
		MString m_replacement;
		bool m_inUse;

		Macro(
			MString *macro,
			MString *replace
		);

		static void
			AddValue(
				MacroTree *macro_tree,
				const char* name,
				const char* value
			);

		static void
			ReplaceMacros(
				MacroTree *macro_tree,
				const char *buffer,
				char *new_buf,
				int new_buf_size
			);
	};

	//=======================================================================
	// Format of notation file:
	//
	// !include file1.txt
	// !include=file1a.txt
	// !include "file2.txt"
	//
	// !example_macro=Field2Data
	//
	// // comment
	//
	// [RecordName]	// comment
	// FieldName=FieldData
	// Field2Name=Field2Data
	// Field3Name=test.ini
	//
	// [Record2Name]
	// FieldName=FieldData
	// Field4Name=$(example_macro)
	// Field5Name={
	//  [Record3Name]
	//  Field6Name=Whatever
	// }
	//
	// /* [Page3Name]
	// Field7Name=Uhhm
	// Field8Name=Uhhh */
	// ...
	//
	//=======================================================================

	//##########################################################################
	//##############    NotationFile    ########################################
	//##########################################################################

	class NotationFile
		#if defined(_ARMOR)
			: public Stuff::Signature
		#endif
	{
		friend class Page;
		friend class Note;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Constructor/Destructors
	//
	public:
		enum Type {
			Standard,
			NonEmpty,
			Raw
		};

		NotationFile(
			const char *file_name,
			Type type=Standard
		);
		NotationFile(
			MemoryStream *stream=NULL,
			MacroTree *macro_tree=NULL
		);

		~NotationFile();

		void
			TestInstance() const;
		static bool
			TestClass();

	protected:
		void
			CommonConstruction(
				MemoryStream *memory_stream,
				TreeOf<Macro*, MString> *macro_tree
			);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Stream access
	//
	public:
		const FileDependencies*
			GetFileDependencies() const
				{Check_Object(this); return &m_fileDependencies;}

		const char*
			GetFileName() const
				{Check_Object(this); return m_fileName;}

		void
			SaveAs(const char* file_name);
		void
			Save();

		void
			IgnoreChanges()
				{Check_Object(this); m_dirtyFlag = false;}

		bool
			IsChanged() const
				{Check_Object(this); return m_dirtyFlag;}

	protected:
		void
			Read(
				MemoryStream *stream,
				MacroTree *macro_tree,
				Page **page,
				bool nested
			);
		void
			Write(MemoryStream *stream);

		void
			ProcessLine(
				MemoryStream *stream,
				MacroTree *macro_tree,
				Page **notepage,
				char* buffer
			);

		void
			HandleBangStuff(
				char *buffer,
				MacroTree *macro_tree,
				Page **page
			);

		void
			SetDirty()
				{ Check_Object(this); m_dirtyFlag = true; }

		Stuff::MString
			m_fileName;
		bool
			m_dirtyFlag;
		Type
			m_type;
		FileDependencies
			m_fileDependencies;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Page access
	//
	public:
		bool
			IsEmpty()
				{Check_Object(this); return m_pages.IsEmpty();}

		bool
			DoesPageExist(const char *pagename)
				{Check_Object(this); return FindPage(pagename) != NULL;}
		Page*
			FindPage(const char* pagename);
		Page*
			GetPage(unsigned index);
		Page*
			GetPage(const char* pagename);

		typedef ChainIteratorOf<Page*> PageIterator;
		PageIterator*
			MakePageIterator()
				{Check_Object(this); return new PageIterator(&m_pages);}

		Page*
			AddPage(const char *pagename);
		Page*
			SetPage(const char *pagename);

		void
			DeletePage(const char *pagename);
		void
			DeleteAllPages();

	protected:
		ChainOf<Page*>
			m_pages;
	};

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -