📄 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 + -