Files
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

237 lines
5.8 KiB
C++

#pragma once
#ifndef __COMLINEHPP__
#define __COMLINEHPP__
#include <windows.h>
#include "comutil.hpp"
#include "critical.hpp"
class CCommandLineClient;
class CCommandLineServer;
namespace NCOMLINE
{
enum LineType {LINE_UNDEF,LINE_OUTPUT,LINE_COMMAND};
const int MAXARGS = 25;
const int MAXLINES = 100;
struct LineData
{
CCom_String m_Data;
LineType m_Type;
int m_ComBreak;
int m_ArgBreak[MAXARGS];
int m_NumArgs;
void PushArg (int loc)
{
m_ArgBreak[m_NumArgs] = loc;
m_NumArgs++;
}
void Argument (int id,char *arg,int len)
{
assert (id >= 0);
assert (id <m_NumArgs);
arg[0] = 0;
len--;
if (id == 0)
{
if (len < m_ArgBreak[0])
return;
strncpy (arg,(LPCTSTR) m_Data,m_ArgBreak[0]);
len = m_ArgBreak[0];
}
else
{
if (len < (m_ArgBreak[id]-m_ArgBreak[id-1]-1))
return;
strncpy (arg,&(((LPCTSTR) m_Data)[m_ArgBreak[id-1]+1]),(m_ArgBreak[id]-m_ArgBreak[id-1]-1));
len = m_ArgBreak[id]-m_ArgBreak[id-1]-1;
}
// strncpy (arg,(LPCTSTR) name,len);
arg[len] = 0;
}
LineData (void)
{
m_NumArgs = 0;
m_Data.Empty ();
m_ComBreak = 0;
m_Type = LINE_UNDEF;
}
LineData (const CCom_String& p1,LineType p2)
{
m_NumArgs = 0;
m_Data = p1;
m_Type = p2;
}
LineData (const LineData& p1)
{
int i;
for (i=0;i<MAXARGS;i++)
m_ArgBreak[i] = p1.m_ArgBreak[i];
m_Data = p1.m_Data;
m_ComBreak = p1.m_ComBreak;
m_Type = p1.m_Type;
m_NumArgs = p1.m_NumArgs;
}
~LineData (void)
{
}
};
typedef bool (*ComFunc) (CCommandLineServer *thisptr,LineData& p1);
struct CommandMap
{
CCom_String m_Command;
ComFunc m_Function;
CommandMap (void)
{
m_Function = NULL;
m_Command = "";
}
CommandMap (const CommandMap& p1)
{
m_Command = p1.m_Command;
m_Function = p1.m_Function;
}
CommandMap (CCom_String p1,ComFunc p2)
{
m_Command = p1;
m_Function = p2;
}
};
LRESULT WINAPI CommandLineWndProc (HWND thewnd,UINT themsg,WPARAM wParam,LPARAM lParam);
DWORD WINAPI ServerThreadProc (void *data);
extern CCommandLineServer *n_CurServer;
};
#ifdef LAB_ONLY
#define COMSPEW(x) if(NCOMLINE::n_CurServer)NCOMLINE::n_CurServer->PushLine (x)
#else
#define COMSPEW(x) ((void)0)
#endif
typedef void (* CommandLineCallProc) (int);
#ifdef COMCLIENT
class CCommandLineClient
{
friend LRESULT WINAPI NCOMLINE::CommandLineWndProc (HWND thewnd,UINT themsg,WPARAM wParam,LPARAM lParam);
static int m_WndClassRefCount;
private:
HWND m_Window; // window for the command line
NCOMLINE::LineData *m_Lines; // each line that appears in the command line window
int m_NumLines,m_SizeLines;
int m_TopDisplay; // line that is the top of the command window
HFONT m_Font; // font used for text
COLORREF m_CurLineColor; // color of current line
COLORREF m_CommandColor; // color of command on previous lines
COLORREF m_ArgColor; // color of arguments on previous lines
COLORREF m_OutColor; // color of output on previous lines
HPEN m_CursorPen; // pen used to draw the cursor
int m_CursorPos; // pos of cursor within current text
POINT m_CursorLoc; // location of cursor on the screen at top of bar
bool m_ShowCursor; // true if we should show the cursor at all
bool m_CursorFlash; // current state of cursor flash
CCom_String m_CurrentLine; // current line being edited.
RECT m_WindowRect; // size of the window
int m_DisplayLines; // number of lines displayed in the window
unsigned char pszStringBinding[255]; // rpc binding
bool m_Attached;
LRESULT WndProc (HWND thewnd,UINT themsg,WPARAM wParam,LPARAM lParam);
void ParseLine (NCOMLINE::LineData& data);
void ExecuteLine (NCOMLINE::LineData& data);
bool DumpFile (NCOMLINE::LineData& data);
void KillServer (NCOMLINE::LineData& data);
HINSTANCE m_Instance; // main application instance
bool DumpFile (const CCom_String& filename);
void PushLine (const NCOMLINE::LineData& data);
public:
CCommandLineClient (HINSTANCE inst);
~CCommandLineClient (void);
void ExecuteLine (const char *line);
void PushLine (const char *line);
void DumpToFile (const char *filename);
RPC_STATUS AttachServer (NCOMLINE::LineData& data);
RPC_STATUS DetachServer (NCOMLINE::LineData& data);
void ListServers (void);
void ShowWindow (void);
void HideWindow (void);
};
#endif
#ifdef COMSERVER
class CCommandLineServer
{
friend DWORD WINAPI NCOMLINE::ServerThreadProc (void *data);
private:
NCOMLINE::LineData *m_Lines; // each line that appears in the command line window
int m_NumLines,m_SizeLines;
// std::list<NCOMLINE::LineData> m_Lines; // list of lines pending on the server side.
HANDLE m_Thread;
DWORD m_ThreadID;
ROOT_CRITICAL m_Critical;
HANDLE m_Semaphore;
HANDLE m_ExitSemaphore;
HANDLE hMappedFile;
bool m_Inited;
HINSTANCE m_Instance;
NCOMLINE::CommandMap *m_Commands;
int m_NumCommands,m_SizeCommands;
void ParseLine (NCOMLINE::LineData& data);
void PushLine (const NCOMLINE::LineData& data);
void PushCommand (const NCOMLINE::CommandMap& data);
void RemoveLine (void);
public:
CCommandLineServer (void);//,bool startclient = false);
~CCommandLineServer (void);
bool Inited (void) const
{ return m_Inited; }
void ExecuteLine (const char * line);
void PushLine (const char *line);
int NumOutputLines(void);
void GetOutputLine(int size,unsigned char * pszString);
bool AddCommand (NCOMLINE::ComFunc func,const CCom_String& name);
bool RemoveCommand (const CCom_String& name);
};
#endif
#endif