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

📄 shell.cpp

📁 利用Linux系统函数实现的SHELL程式
💻 CPP
字号:
#include <iostream>#include <direct.h>#include <string>using namespace std;    #include "shell.h"#include "commands.h"char chr_PathName0[MAX_ENVIRONMENT_LENGTH]="";  //chr_PathName0 is original path namechar *chr_PathName=(char*)malloc(sizeof(char)*(MAX_ENVIRONMENT_LENGTH-100));  //Path namechar chr_Prompt0[MAX_ENVIRONMENT_LENGTH]="";  //chr_Promt0 is original Promtchar *chr_Prompt=(char*)malloc(sizeof(char)*MAX_ENVIRONMENT_LENGTH);  //Promt = Path name & shell name & promt characterchar *chr_CommandLine=(char*)malloc(sizeof(char)*MAX_COMMANDLINE_LENGTH);  //Command line including command and argumentint main(void){
	if(initial()){
		cout<<SHELL_NAME<<" started!"<<endl;		
		do{			reinitial(0,chr_PathName);
			cout<<chr_Prompt;			cin.getline(chr_CommandLine,MAX_COMMANDLINE_LENGTH);  //Input command, length is limited by MAX_COMMANDLINE_LENGTH			//Implement command			cin.clear();
		}while(strcmp("quit",execute(chr_CommandLine)));
	}
	else cout<<"Initialization failed!"<<endl;
	return 0;
}char *execute(char *tmpchr_CommandLine){	//char *tokenPtr=strtok(tmpchr_CommandLine," ");	char tmpchr0[MAX_COMMANDLINE_LENGTH]="";  //Used as a duplicate of char *tokenPtr	char tmpchr1[MID_OUTPRINT]="";  //Used as a duplicate of output of fuctions:func_*	char *tokenPtr;  //Used for getting the first part in the string:char *tmpchr_CommandLine	strcpy(tmpchr0,tmpchr_CommandLine);	tokenPtr=strtok(tmpchr0," ");	if(tokenPtr==NULL)  //Command is null
		return "";		else 
		if(strcmp(tokenPtr,"cd")==0) {cout<< func_cd(tmpchr_CommandLine);}
		else if(strcmp(tokenPtr,"clr")==0) {strcpy(tmpchr1,func_clr(getArgument(tmpchr_CommandLine)));}
		else if(strcmp(tokenPtr,"dir")==0) {strcpy(tmpchr1,func_dir(trim(tmpchr_CommandLine)));}	    else if(strcmp(tokenPtr,"environ")==0) {strcpy(tmpchr1,func_environ(getArgument(tmpchr_CommandLine)));}	    else if(strcmp(tokenPtr,"echo")==0) {strcpy(tmpchr1,func_echo(tmpchr_CommandLine));}	    else if(strcmp(tokenPtr,"help")==0) {strcpy(tmpchr1,func_help(getArgument(tmpchr_CommandLine)));}	    else if(strcmp(tokenPtr,"pause")==0) {strcpy(tmpchr1,func_pause(getArgument(tmpchr_CommandLine)));}	    else if(strcmp(tokenPtr,"quit")==0) {strcpy(tmpchr1,func_quit(getArgument(tmpchr_CommandLine)));}	    else strcpy(tmpchr1,func_else(tokenPtr));	
		
		cout<<tmpchr1;	    if(strcmp(tmpchr1,func_quit(""))==0)
			return tokenPtr;		
		else
			return "";
}
char *strmid(char *sourceChr,int from,int length){  //'from' starts from 1
	//char *tmpchr0=(char*)malloc(sizeof(char)*MAX_COMMANDLINE_LENGTH);	//char *tmpchr0=(char*)malloc(sizeof(char)*strlen(sourceChr));	char tmpchr0[MAX_COMMANDLINE_LENGTH]="";	char *tmpchr1=(char*)malloc(sizeof(char)*strlen(sourceChr));	int tmpint0=0;	if((length+from-1)>(signed int)strlen(sourceChr)) return "";	for(int tmpint1=from-1;tmpint1<=from+length-2;tmpint1++){		tmpchr0[tmpint0]=sourceChr[tmpint1];		tmpint0++;
	}
	strcpy(tmpchr1,tmpchr0);
	return tmpchr1;
}
char *getArgument(char *tmpchr_CommandLine){
	//char *tmpchr0=(char*)malloc(sizeof(char)*strlen(tmpchr_CommandLine));	char *tokenPtr;	char *tmpchr1=(char*)malloc(sizeof(char)*strlen(tmpchr_CommandLine));		char tmpchr0[MAX_COMMANDLINE_LENGTH];	strcpy(tmpchr0,tmpchr_CommandLine);	tokenPtr=strtok(tmpchr0," ");		strcpy(tmpchr1,"");		tokenPtr=strtok(NULL," ");	while(tokenPtr!=NULL && strlen(tmpchr1)<=MAX_COMMANDLINE_LENGTH){		strcat(tmpchr1,tokenPtr);		tokenPtr=strtok(NULL," ");				strcat(tmpchr1," ");
	}
	return tmpchr1;
}	bool initial(void){  //Used for the first time this shell start 	getcwd(chr_PathName0,MAX_ENVIRONMENT_LENGTH);  //Stores the original path name 	//getcwd(chr_PathName,MAX_ENVIRONMENT_LENGTH); 	strcpy(chr_PathName,chr_PathName0);	strcpy(chr_Prompt0,chr_PathName);  //Stores the original prompt	strcpy(chr_Prompt,"<");	strcat(chr_Prompt,chr_PathName);	strcat(chr_Prompt,">/"); 	strcat(chr_Prompt,SHELL_NAME);	strcat(chr_Prompt,"$");	return true;	
}	bool reinitial(int tmpint_Argument,char *tmpchr_Argument){  //Used for the relocate working directory
	//	getcwd(chr_PathName,MAX_ENVIRONMENT_LENGTH);		if(tmpint_Argument==0){
		chr_PathName=tmpchr_Argument;
	}		
	strcpy(chr_Prompt,"<");		
	strcat(chr_Prompt,chr_PathName);	strcat(chr_Prompt,">/"); 	strcat(chr_Prompt,SHELL_NAME);	strcat(chr_Prompt,"$");
	return true;
}char *ltrim(char *tmpchr){
	char *ptrtmpchr; 
	ptrtmpchr=tmpchr;
	while(*ptrtmpchr==' '){
		*ptrtmpchr=*(ptrtmpchr+1);
		ptrtmpchr++;
	}
	return ptrtmpchr;
}char *ltrim(char *tmpchr,char tmpchr_Tokenizer){
	char *ptrtmpchr; 
	ptrtmpchr=tmpchr;
	while(*ptrtmpchr==tmpchr_Tokenizer){
		*ptrtmpchr=*(ptrtmpchr+1);
		ptrtmpchr++;
	}
	return ptrtmpchr;
}char *rtrim(char *tmpchr){ 	char *ptrtmpchr; 
	int inttmp0;
	ptrtmpchr=tmpchr;
	
	inttmp0=strlen(ptrtmpchr);
	while(*(ptrtmpchr+inttmp0-1)==' '){
		*(ptrtmpchr+inttmp0-1)='\0';
		inttmp0--;
	}
	return ptrtmpchr;
} char *rtrim(char *tmpchr,char tmpchr_Tokenizer){
	char *ptrtmpchr; 
	int inttmp0;
	ptrtmpchr=tmpchr;
	inttmp0=strlen(ptrtmpchr);
	while(*(ptrtmpchr+inttmp0-1)==tmpchr_Tokenizer){    
		*(ptrtmpchr+inttmp0-1)='\0';
		inttmp0--;
	}
	return ptrtmpchr;
}char *trim(char *tmpchr){
	return rtrim(ltrim(tmpchr));
}char *trim(char *tmpchr,char tmpchr_Tokenizer){	return rtrim(ltrim(tmpchr,tmpchr_Tokenizer),tmpchr_Tokenizer);}	

⌨️ 快捷键说明

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