Files
RP412/MUNGA/NOTATION.h
T
CydandClaude Opus 4.8 4abbf8879f Initial import of Red Planet v4.10 Win32 source
Imports the current Win32 source for the pod-racing game 'Red Planet',
built on the MUNGA engine and its L4 (Win32/DirectX) platform layer:

- MUNGA / MUNGA_L4: cross-platform engine core and Win32 backend
- RP / RP_L4: Red Planet game logic and Win32 application
- DivLoader, Setup1: asset loader and installer project
- lib, MUNGA_L4/openal, MUNGA_L4/sos: third-party audio dependencies

Removed stale Subversion metadata and added .gitignore/.gitattributes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:59:51 -05:00

194 lines
6.8 KiB
C++

#pragma once
#include "namelist.h"
#include "scalar.h"
class NotationFile;
class NotationFile__Notation;
class NotationFile__NotePage;
class NameList;
class AlphaNameList;
inline Logical Comment_Line(const char *p) { return ((*p == ';') || (*p == '#') || (*p == '/' && *(p+1) == '/')); }
class NotationFile SIGNATURED
{
friend class NotationFile__NotePage;
friend class NotationFile__Notation;
public:
typedef NotationFile__Notation Notation;
typedef NotationFile__NotePage NotePage;
private:
char *fileName;
NotePage *firstNotePage, *lastNotePage;
long pageCount, cleanPageCount;
Logical dirtyFlag;
NotePage *saveNotePage;
Enumeration operationModes;
enum WriteMode
{
//--------------------------------------------
// NOTE: These numbers are not arbitrary!
// See code before changing or adding values.
//--------------------------------------------
Size_Only = 0,
Disk_File = 1,
Text_Memory = 2,
Binary_Memory = 3 // not implemented yet
};
public:
#if 0
enum Mode
{
// Access Modes:
EXCLUSIVE = 0,
SHARED = 1,
// Error Modes:
QUIET = 0,
FATAL = 2,
// Default Modes:
DEFAULT = (EXCLUSIVE | QUIET)
};
#endif
enum OperationModes
{
RawOperationModes = 0x0000,
SkipBlanksListMode = 0x0001,
CleanPageListMode = 0x0002,
CleanEntryListMode = 0x0004,
IgnorePageCaseMode = 0x0008,
IgnoreEntryCaseMode = 0x0010,
DefaultOperationModes = (SkipBlanksListMode),
CleanListMode = (CleanPageListMode | CleanEntryListMode),
IgnoreCaseMode = (IgnorePageCaseMode | IgnoreEntryCaseMode),
RelaxedOperationModes = (CleanListMode | IgnoreCaseMode)
};
NotationFile(const char *filename = NULL, Enumeration operation_modes = DefaultOperationModes);
~NotationFile();
Enumeration GetModes() { Check(this); return operationModes; }
Enumeration PutModes(Enumeration operation_modes) { Check(this); return (operationModes = operation_modes); }
Enumeration SetMode(Enumeration operation_modes) { Check(this); return (operationModes |= operation_modes); }
Enumeration ClearMode(Enumeration operation_modes) { Check(this); return (operationModes &= ~operation_modes); }
Logical IsDirty() const { Check(this); return dirtyFlag; }
Logical IsEmpty() const { Check(this); return (pageCount == 0L); }
const char *GetFileName() const { Check(this); return fileName; }
long PageCount() const { Check(this); return ((operationModes & CleanPageListMode) ? cleanPageCount:pageCount); }
Logical PageExists(const char *pagename);
long EntryCount(const char *pagename);
NotePage* SetPage(const char *pagename, const char *comment = NULL);
NotePage* AppendPage(const char *pagename, const char *comment = NULL);
int GetEntry(const char *pagename, const char *entryname, const char **contents);
int GetEntry(const char *pagename, const char *entryname, int *value);
int GetEntry(const char *pagename, const char *entryname, Scalar *value);
int GetEntry(const char *pagename, const char *entryname, double *value);
int GetLogicalEntry(const char *pagename, const char *entryname, Logical *value);
void SetEntry(const char *pagename, const char *entryname, int value);
void SetEntry(const char *pagename, const char *entryname, Scalar value);
void SetEntry(const char *pagename, const char *entryname, double value);
void SetEntry(const char *pagename, const char *entryname, const char *contents);
void SetLogicalEntry(const char *pagename, const char *entryname, Logical value);
void AppendEntry(const char *pagename, const char *entryname, const char *contents);
void AppendEntry(const char *pagename, const char *entryname, int value);
void AppendEntry(const char *pagename, const char *entryname, Scalar value);
void AppendEntry(const char *pagename, const char *entryname, double value);
void AppendLogicalEntry(const char *pagename, const char *entryname, Logical value);
NameList* MakeEntryList(const char *pagename, const char *entryname_prefix = NULL);
NameList* MakeEntryList(NotationFile::NotePage *notepage, const char *entryname_prefix = NULL);
NameList* MakePageList(const char *pagename_prefix = NULL);
AlphaNameList* MakeAlphaEntryList(const char *pagename, const char *entryname_prefix = NULL);
AlphaNameList* MakeAlphaEntryList(NotationFile::NotePage *notepage, const char *entryname_prefix = NULL);
AlphaNameList* MakeAlphaPageList(const char *pagename_prefix = NULL);
void DeleteEntry(const char *pagename, const char *entryname);
void DeletePage(const char *pagename);
void ReadFile(const char *filename);
void ReadText(char *start, long length);
Logical WriteFile(const char *filename = NULL);
long SizeOfText();
long WriteText(char *buffer, long size);
void Abort();
void DeleteStandardPages();
void MarkLabOnly();
Logical IsMarkedLabOnly() { Check(this); return PageExists("LAB_ONLY"); }
private:
void AppendNotePage(NotePage *notepage);
Logical FindNotePage(const char *pagename, NotePage **notepage);
Logical FindNotePage(const char *pagename, NotePage **notepage, NotePage **prevpage);
void SetDirty() { Check(this); dirtyFlag = true; }
void DeletePage(NotePage *notepage, NotePage *prev);
void Read(char *buffer);
long Write(std::ostream &stream, WriteMode mode = Disk_File);
public:
Logical TestInstance() const;
static Logical TestClass();
};
class NotationFile__Notation SIGNATURED
{
friend class NotationFile;
friend class NotationFile__NotePage;
private:
NotationFile::Notation *nextNotation;
char *notationName, *notationEntry;
Logical cleanNotation;
NotationFile__Notation()
{
nextNotation = NULL;
notationName = notationEntry = NULL;
cleanNotation = false;
}
~NotationFile__Notation();
void SetName(const char *entryname, long *clean_notation_count);
void SetEntry(const char *contents);
const char* GetName() const { Check(this); return notationName; }
const char* GetEntry() const { Check(this); return notationEntry; }
long WriteNotation(std::ostream &stream, NotationFile::WriteMode mode) const;
Logical TestInstance() const;
};
class NotationFile__NotePage SIGNATURED
{
friend class NotationFile;
private:
NotationFile *notationFile;
NotationFile::NotePage *nextNotePage;
NotationFile::Notation *firstNotation, *lastNotation;
long notationCount, cleanNotationCount;
char *pageName, *pageComment;
Logical cleanPage;
NotationFile__NotePage(NotationFile *notation_file);
~NotationFile__NotePage();
void SetName(const char *pagename, long *clean_page_count);
void SetComment(const char *comment);
const char *GetName() const { Check(this); return pageName; }
void AppendNote(NotationFile::Notation *note);
Logical FindNote(const char *entryname, NotationFile::Notation **note);
Logical FindNote(const char *entryname, NotationFile::Notation **note, NotationFile::Notation **prev);
void UpdateNote(NotationFile::Notation *note);
void DeleteNote(const char *entryname);
long WriteNote(std::ostream &stream, NotationFile::WriteMode mode) const;
Logical TestInstance() const;
};