Files
firestorm/Gameleap/code/mw4/Libraries/stuff/NotationFile.hpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

227 lines
5.9 KiB
C++

//===========================================================================//
// File: notation.hpp //
// Title: Declaration of NotationFile classes. //
// Project: Munga //
// Author: Ken Olsen //
// Purpose: Provide general purpose access to data stored in a formatted //
// text file. //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 01/06/95 KEO Converted from Tool Architecture I. //
// 02/07/95 KEO Add AppendEntry methods. //
// 02/17/95 KEO Change page and entry lists to make nomenclature. //
// 03/24/95 KEO Add methods to read and write text in memory. //
// 03/31/95 KEO Add methods for lab only mark. //
// 05/23/95 KEO Add getfilename, setpage and appendpage. //
// 11/11/95 KEO Add operation modes and correct small bugs. //
// 04/01/97 GAH Added "DeleteAllPages" method. //
//---------------------------------------------------------------------------//
// Copyright (c) 1994-1995 Virtual World Entertainment, Inc. //
// Copyright (c) 1996-1997 Fasa Interactive Technologies, Inc. //
// All rights reserved worldwide. //
// This unpublished source code is PROPRIETARY and CONFIDENTIAL. //
//===========================================================================//
#pragma once
#include "Stuff.hpp"
#include "Scalar.hpp"
#include "FileStream.hpp"
#include "Tree.hpp"
namespace Stuff {
class NotationFile;
class Page;
class Note;
class Macro
{
public:
MString m_replacement;
bool m_inUse;
explicit Macro(MString *replace);
static void AddValue(
void *macro_tree,
const char* name,
const char* value
);
static void ReplaceMacros(
void *macro_tree,
const char *buffer,
char *new_buf,
int new_buf_size
);
void TestInstance() {}
};
//=======================================================================
// 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,
bool preserve_case=false
);
explicit NotationFile(MemoryStream *stream=NULL);
~NotationFile();
void TestInstance() const;
static bool TestClass();
static void *s_cachedIncludes;
protected:
NotationFile(
MemoryStream *stream,
void *macro_tree
);
void CommonConstruction(
MemoryStream *memory_stream,
void *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;}
void Write(MemoryStream *stream);
protected:
void Read(
MemoryStream *stream,
void *macro_tree,
Page **page,
bool nested
);
void ProcessLine(
MemoryStream *stream,
void *macro_tree,
Page **notepage,
char* buffer
);
void HandleBangStuff(
char *buffer,
void *macro_tree,
Page **page
);
void HandlePoundStuff(
char *buffer,
void *macro_tree,
Page **page
);
void SetDirty()
{ Check_Object(this); m_dirtyFlag = true; }
Stuff::MString m_fileName;
bool
m_dirtyFlag,
m_concatenate,
m_preserveCase;
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(const char* pagename);
typedef ChainIteratorOf<Page*> PageIterator;
PageIterator* MakePageIterator()
{Check_Object(this); return new(g_Heap) 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;
void* m_pageMap;
};
}