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

📄 util.cpp

📁 一个类c语言的解释器
💻 CPP
字号:
#include "stdafx.h"
#include "util.h"

CHAR chBuf[1024]; 

DWORD CALLBACK ReadStreamCallback(DWORD_PTR dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb){
	ReadFile((HANDLE)dwCookie,pbBuff,cb,(LPDWORD)pcb,NULL);
	return 0;
}

DWORD CALLBACK WriteStreamCallback(DWORD_PTR dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb){
	WriteFile((HANDLE)dwCookie,pbBuff,cb,(LPDWORD)pcb,NULL);
	return 0;
}

//在编辑区的rich edit里面打开文件
VOID open(CString filename,HWND hwnd){
	EDITSTREAM stES;
	HANDLE hFile = CreateFile(filename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	stES.dwCookie=(DWORD)hFile;
	stES.dwError=NULL;
	stES.pfnCallback=(EDITSTREAMCALLBACK)ReadStreamCallback;
	SendMessage(hwnd,EM_STREAMIN,SF_TEXT,(LPARAM)&stES);
	SendMessage(hwnd,EM_SETMODIFY,FALSE,0);
	CloseHandle(hFile);
}

//保存在编辑区中rich edit中的文件
VOID save(CString filename,HWND hwnd){
	EDITSTREAM stES;
	HANDLE hFile = CreateFile(filename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	SetFilePointer(hFile,0,0,FILE_BEGIN);
	SetEndOfFile(hFile);
	stES.dwCookie=(DWORD)hFile;
	stES.dwError=NULL;
	stES.pfnCallback=(EDITSTREAMCALLBACK)WriteStreamCallback;
	SendMessage(hwnd,EM_STREAMOUT,SF_TEXT,(LPARAM)&stES);
	SendMessage(hwnd,EM_SETMODIFY,FALSE,0);
	CloseHandle(hFile);
}

VOID scanFile(CString path,HWND output){
	int m;

	//结束字符串,读到此字符串就表示词法分析结束
	char END[] = "EOF\n";
	char c[100];
	int k;

	//管道的读写句柄
	HANDLE hChildStdinRd, hChildStdinWr,  
		hChildStdoutRd, hChildStdoutWr;
	SECURITY_ATTRIBUTES saAttr; 
	BOOL fSuccess;

	//命令行参数
	WCHAR szCmdline[255];
	PROCESS_INFORMATION piProcInfo; 
	STARTUPINFO siStartInfo;
	BOOL bFuncRetn = FALSE; 

	DWORD dwRead, dwWritten;

	//缓冲区
	//CHAR chBuf[1024]; 

	//临时变量,保存读的字符串
	CHAR *temp;
	SETTEXTEX se;


	//初始化命令行数组的内存
	ZeroMemory(szCmdline,sizeof(szCmdline));

	//设置命令行
	wcscat(szCmdline,TEXT("cmmc.exe "));
	wcscat(szCmdline,TEXT("\""));
	wcscat(szCmdline,path);
	wcscat(szCmdline,TEXT("\""));
	wcscat(szCmdline,TEXT(" 1"));
	se.codepage=CP_ACP;
	se.flags=ST_KEEPUNDO|ST_SELECTION;

	// 设置继承标志 

	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
	saAttr.bInheritHandle = TRUE; 
	saAttr.lpSecurityDescriptor = NULL; 


	// 为子进程的标准输出创建管道 

	if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) ;

	SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);

	// 为子进程的标准输入创建管道 

	if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) ;

	SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);

	//初始化内存
	ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );

	// 初始化 STARTUPINFO 结构. 

	ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
	siStartInfo.cb = sizeof(STARTUPINFO); 
	siStartInfo.hStdError = hChildStdoutWr;
	siStartInfo.hStdOutput = hChildStdoutWr;
	siStartInfo.hStdInput = hChildStdinRd;
	siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

	// 创建子进程 

	CreateProcess(NULL, 
		szCmdline,     // command line 
		NULL,          // process security attributes 
		NULL,          // primary thread security attributes 
		TRUE,          // handles are inherited 
		0,             // creation flags 
		NULL,          // use parent's environment 
		NULL,          // use parent's current directory 
		&siStartInfo,  // STARTUPINFO pointer 
		&piProcInfo);  // receives PROCESS_INFORMATION 

	//关闭句柄
	CloseHandle(piProcInfo.hProcess);
	CloseHandle(piProcInfo.hThread);

	//循环读取子进程的输出,
	//每读取一个输出,就返回一个值给子进程
	//读到EOF的时候结束
	CloseHandle(hChildStdoutWr);
	while(true)
	{ 
		ZeroMemory(chBuf,strlen(chBuf));
		//从管道中读取文件
		bool bResult = ReadFile( hChildStdoutRd, chBuf, 1024, &dwRead, NULL);

		//在读取结果末尾添加换行符
		chBuf[dwRead-1]='\n';

		//在读取结果末尾添加结束符
		chBuf[dwRead]='\0';

		//分配内存,用来保存读取结果
		temp=(char*)malloc(dwRead+1);

		//把读取结果放到局部变量中
		strcpy(temp,chBuf);

		//发送EM_SETTEXTEX消息,让richedit添加文本
		SendMessage(output,EM_SETTEXTEX,(WPARAM)&se,(LPARAM)temp);

		//发送一个消息给管道,表明以读取了管道中的上一条信息
		//if (!WriteFile(hChildStdinWr, chBuf, dwRead, &dwWritten, NULL)) 
			//ErrorCode = GetLastError();
			//break; 

		//判断是否读取结束
		if (!bResult||dwRead==0)
		{
			break;
		}
		//释放内存
		free(temp);
	}
}

string parseFile(CString path,bool& succeed){
	int m;

	//结束字符串,读到此字符串就表示词法分析结束
	char END[] = "EOF\n";
	char c[100];
	int k;

	//管道的读写句柄
	HANDLE hChildStdinRd, hChildStdinWr,  
		hChildStdoutRd, hChildStdoutWr;
	SECURITY_ATTRIBUTES saAttr; 
	BOOL fSuccess;

	//命令行参数
	WCHAR szCmdline[255];
	PROCESS_INFORMATION piProcInfo; 
	STARTUPINFO siStartInfo;
	BOOL bFuncRetn = FALSE; 

	DWORD dwRead, dwWritten;

	//缓冲区
	

	//临时变量,保存读的字符串
	CHAR *temp;
	SETTEXTEX se;


	//初始化命令行数组的内存
	ZeroMemory(szCmdline,sizeof(szCmdline));

	//设置命令行
	wcscat(szCmdline,TEXT("cmmc.exe "));
	wcscat(szCmdline,TEXT("\""));
	wcscat(szCmdline,path);
	wcscat(szCmdline,TEXT("\""));
	wcscat(szCmdline,TEXT(" 2"));
	se.codepage=CP_ACP;
	se.flags=ST_KEEPUNDO|ST_SELECTION;

	// 设置继承标志 

	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
	saAttr.bInheritHandle = TRUE; 
	saAttr.lpSecurityDescriptor = NULL; 


	// 为子进程的标准输出创建管道 

	if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) ;

	SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);

	// 为子进程的标准输入创建管道 

	if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) ;

	SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);

	//初始化内存
	ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );

	// 初始化 STARTUPINFO 结构. 

	ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
	siStartInfo.cb = sizeof(STARTUPINFO); 
	siStartInfo.hStdError = hChildStdoutWr;
	siStartInfo.hStdOutput = hChildStdoutWr;
	siStartInfo.hStdInput = hChildStdinRd;
	siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

	// 创建子进程 

	CreateProcess(NULL, 
		szCmdline,     // command line 
		NULL,          // process security attributes 
		NULL,          // primary thread security attributes 
		TRUE,          // handles are inherited 
		0,             // creation flags 
		NULL,          // use parent's environment 
		NULL,          // use parent's current directory 
		&siStartInfo,  // STARTUPINFO pointer 
		&piProcInfo);  // receives PROCESS_INFORMATION 

	//关闭句柄
	CloseHandle(piProcInfo.hProcess);
	CloseHandle(piProcInfo.hThread);

	string s = "";
	ReadFile( hChildStdoutRd, chBuf, 1024, &dwRead, NULL);
	WriteFile(hChildStdinWr, chBuf, dwRead, &dwWritten, NULL);
	CloseHandle(hChildStdoutWr);
	if (chBuf[0]=='T')
	{
		//语法分析成功
		succeed = true;
	}
	else if(chBuf[0]=='F'){
		//分析错误
		succeed = false;
	}
	else{
		//词法有错误
		succeed = false;
	}
	while (true)
	{
		char* buff;
		ZeroMemory(chBuf,strlen(chBuf));
		bool bResult = ReadFile( hChildStdoutRd, chBuf, 1024, &dwRead, NULL);
		int index = s.find_first_of(-52);
		s = s.substr(0,index);
		s.append(chBuf);
		if (!bResult||dwRead==0)
		{
			break;
		}
	}
	int index = s.find_first_of(-52);
	s = s.substr(0,index);
	return s;
}

VOID execFile(CString path,bool &success){
	bool can_exec = true;
	parseFile(path,can_exec);
	if(can_exec){
		success = true;
		SECURITY_ATTRIBUTES saAttr; 
		BOOL fSuccess;

		//命令行参数
		WCHAR szCmdline[255];
		PROCESS_INFORMATION piProcInfo; 
		STARTUPINFO siStartInfo;
		BOOL bFuncRetn = FALSE; 

		DWORD dwRead, dwWritten;

		//缓冲区
		//CHAR chBuf[1024]; 

		//临时变量,保存读的字符串
		CHAR *temp;
		SETTEXTEX se;


		//初始化命令行数组的内存
		ZeroMemory(szCmdline,sizeof(szCmdline));

		//设置命令行
		wcscat(szCmdline,TEXT("interpreter.exe "));
		wcscat(szCmdline,TEXT("\""));
		wcscat(szCmdline,path);
		wcscat(szCmdline,TEXT(".cmmo"));
		wcscat(szCmdline,TEXT("\""));
		se.codepage=CP_ACP;
		se.flags=ST_KEEPUNDO|ST_SELECTION;

		// 设置继承标志 

		saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
		saAttr.bInheritHandle = TRUE; 
		saAttr.lpSecurityDescriptor = NULL; 

		//初始化内存
		ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );

		// 初始化 STARTUPINFO 结构. 

		ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
		siStartInfo.cb = sizeof(STARTUPINFO); 
		//siStartInfo.dwFlags = STARTF_USESTDHANDLES;
		//siStartInfo.wShowWindow = SW_SHOWNORMAL;

		// 创建子进程 

		CreateProcess(NULL, 
			szCmdline,     // command line 
			NULL,          // process security attributes 
			NULL,          // primary thread security attributes 
			false,          // handles are inherited 
			0,             // creation flags 
			NULL,          // use parent's environment 
			NULL,          // use parent's current directory 
			&siStartInfo,  // STARTUPINFO pointer 
			&piProcInfo);  // receives PROCESS_INFORMATION 
	}
	else{
		success = false;
	}

}

⌨️ 快捷键说明

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