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

📄 shell2.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 CPP
字号:
#include	"compiler.h"#include	"dosio.h"#include	"shell2.h"#include	"parser.h"#include	"global.h"	int		shell_phase;	dword	shell_waitid;// ---- 偝乕偽乕娫捠怣const char keybdmng_svr[] = "KEYBDMNG.EX2";const char elf_svr[] = "ELF.BN2";static void registserver(void) {	dword		self;	dword		keybdmng;	dword		elf;	dword		initid;	MessageInfo	msg;	self = syscall_get_tid();	keybdmng = syscall_lookup_main_thread(keybdmng_svr);	if (keybdmng != (dword)-1) {		memset(&msg, 0, sizeof(msg));		msg.header = MSG_KEY_REGIST_TO_SERVER;		msg.arg1 = self;		syscall_send(keybdmng, &msg);	}	elf = syscall_lookup_main_thread(elf_svr);	if (elf != (dword)-1) {		memset(&msg, 0, sizeof(msg));		msg.header = MSG_REGISTER_TO_SERVER;		msg.arg1 = self;		syscall_send(elf, &msg);	}	initid = syscall_lookup_main_thread("INIT");	if (initid != (dword)-1) {		memset(&msg, 0, sizeof(msg));		msg.header = MSG_SERVER_START_OK;		msg.arg1 = self;		syscall_send(initid, &msg);	}}static void unregistserver(void) {	dword		self;	dword		elf;	dword		keybdmng;	MessageInfo msg;	self = syscall_get_tid();	elf = syscall_lookup_main_thread(elf_svr);	if (elf != (dword)-1) {		msg.header = MSG_UNREGISTER_FROM_SERVER;		msg.arg1 = self;		msg.arg2 = 0;		msg.arg3 = 0;		syscall_send(elf, &msg);	}	keybdmng = syscall_lookup_main_thread(keybdmng_svr);	if (keybdmng != (dword)-1) {		msg.header = MSG_KEY_UNREGIST_FROM_SERVER;		msg.arg1 = self;		msg.arg2 = 0;		msg.arg3 = 0;		syscall_send(keybdmng, &msg);	}}// ---- 偙傑傫偳static	int		cmdpos = 0;static	char	cmdbuf[80];static void cmddisp(const char *cmdline) {	int		x;	int		y;	int		len;	char	path[MAX_PATH];	if (shell_phase != PHASE_MAIN) {		return;	}	if (cmdline == NULL) {		cmdline = cmdbuf;	}	syscall_get_cursor(&x, &y);	syscall_set_cursor(0, y);	file_getfullpath(path, NULL, sizeof(path));	file_cutseparator(path);	printf("[Mona]%s>%s", path, cmdline);	len = 6 + strlen(path) + 1 + strlen(cmdline);	while(len < x) {		len++;		printf(" ");	}}static void keydown(const MessageInfo *msg) {	int		c;	if (msg->arg2 & MKEY_MODIFIER_CHAR) {		c = msg->arg3;	}	else if (msg->arg1 == MKEY_ENTER) {		c = 13;	}	else if (msg->arg1 == MKEY_BACK) {		c = 8;	}	else if (msg->arg1 == MKEY_ESCAPE) {		c = 27;	}	else {		return;	}	switch(c) {		case 13:			// ENTER			printf("\n");			commandExecute(cmdbuf);		// 僐僺乕偟偰巊偆偺偑朷傑偟偄			cmdpos = 0;			cmdbuf[0] = '\0';			break;		case 8:				// BS			if (cmdpos) {				cmdbuf[--cmdpos] = '\0';			}			break;		case 27:			// ESC			cmdpos = 0;			cmdbuf[0] = '\0';			break;		default:			if (cmdpos < (int)(sizeof(cmdbuf) - 1)) {				cmdbuf[cmdpos++] = (char)c;				cmdbuf[cmdpos] = '\0';			}			break;	}	cmddisp(NULL);}// ---- 傔偄傫void defmsgdispatch(const MessageInfo *msg) {	switch(msg->header) {		case MSG_KEY_VIRTUAL_CODE:			if (msg->arg2 & MKEY_MODIFIER_DOWN) {				if (!(shell_phase & PHASE_WAITCHILD)) {					keydown(msg);				}#if 1			// NON-GUI偱偢偭偲僽儘僢僉儞僌偝傟偪傖偆傫偱				else if (msg->arg1 == MKEY_ESCAPE) {					shell_phase &= ~PHASE_WAITCHILD;					keydown(msg);				}#endif			}			break;		case MSG_PROCESS_TERMINATED:			if ((shell_phase & PHASE_WAITCHILD) &&				(shell_waitid == msg->arg1)) {				shell_phase &= ~PHASE_WAITCHILD;			}			break;	}}int svrmain(void) {	MessageInfo	msg;	registserver();	if (globalinitialize() != SUCCESS) {		return(1);	}	executeMSH("/AUTOEXEC.MSH");	shell_phase = PHASE_MAIN;	cmddisp(NULL);	while(shell_phase) {		while(!syscall_receive(&msg)) {			defmsgdispatch(&msg);		}		syscall_mthread_yeild_message();	}	unregistserver();	return(0);}

⌨️ 快捷键说明

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