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

📄 main.c

📁 一个完整的SHELL实现源代码
💻 C
字号:
#include "fs.h"
#include "conio.h"
#include "string.h"
#include "stdarg.h"

char* get_curr_dirt(char *path)
{
	char *curdir_path;
	int i=strlen(g_curdir_name)-1;

	for(curdir_path=g_curdir_name+i;*curdir_path!='/';--curdir_path);
	if(curdir_path==g_curdir_name+i)
		return path;
	else
		return ++curdir_path;
}

static s_int os_echo()//显示当前用户名和目录名作为提示符
{
	char *curr_path;

	curr_path=get_curr_dirt(g_curdir_name);
	printf("[%s @localhost %s]#",g_user.name,curr_path);
	return 0;
}

static s_int os_fit_cmd(char *str);

static s_int os_getcmd(char *str)
{
    s_int c,i=0,j=0,end=0;
    printf("\n");
    os_echo();
    while(!end)
    {
        str[i]='\0';
        if(j<i)printf("%s",str+Max(0,i-1));
        else if(j>i)printf("\b \b");
        c=getch();
        j=i;
        switch(c)
        {
            case 0x0d:
                end=1;
                str[i]='\0';
                break;
            case '\b':
                if(--i<0)i=0;
                break;
            case '\t':
                c=os_fit_cmd(str);
                if(c)
                {	
                	printf("%s",str+i);
                	j=i=c;
                }
                break;
            default:
                str[i]=(char)c;
                if(++i>80)i=80;
                break;
        }
    }
    printf("\n");
    while(i && str[--i]==' ')str[i]='\0';  /* remove end-spaces */
    return 0;
}

static s_int os_cmd_ls(char *str)
{
	if(*str == 0) str=".";
	if(dir(str)==0)return 0;
	printf("path [%s] not found.\n",str);
	return 1;
}

static s_int os_cmd_cd(char *str)
{
	if(*str==0)return 0; /* do nothing , but still ok */
	if(chdir(str)==0)return 0;
	printf("path [%s] not found.\n",str);
	return 1;
}

static s_int os_cmd_pwd()//显示当前目录名
{
	printf("%s\n",g_curdir_name);
	return 1;
}

static s_int os_cmd_err(char *str)
{
	printf("command [%s] not found.\n",str);
	printf("type 'help' for available commands.\n");
	return 0;
}

static s_int os_cmd_help(char *str);


static s_int os_cmd_halt(char *str)
{
	printf("System is going to halt.\n");
	return -1;
}

static s_int os_cmd_logout(char *str)
{
	return -2;
}

static s_int os_cmd_mkdir(char *str,...)//作为可变长参数,,可创建多个目录
{
	s_int i;
    char dir_nam[30];
    char *dir_name=dir_nam;
    char *strp;

	if(*str==0) return 0;

	for(strp=str;*strp==' ';strp++);

	while(1)
	{
		if(*strp=='\0') return 0;
	    for(i=0;*strp && *strp !=' ';strp++) 
			dir_nam[i++]=*strp; 
		dir_nam[i]='\0';
		if((i=mkdir(dir_name))<0) printf("operation failed.%d\n",i);
	    for(;*strp==' ';strp++);
	}

	return 0;
}
static s_int os_cmd_format(char *str)
{
	printf("Process format.\nWait please.\n");
	hd_format();
	return 0;
}

static s_int os_cmd_create(char *str)
{
	file *fp;
	char buf[100];
	s_int i;
	if(*str==0)return 1;
	fp=create(str);
	fflush(stdin);
	while(scanf("%s",buf)!=EOF)
	{
		i=strlen(buf);
		buf[i]='\n';
		buf[i+1]='\0';
		write(fp,strlen(buf),buf);
	}
	close(fp);
	return 0;
}

static s_int os_cmd_cat(char *str)
{
	file *fp;
	char buf[128];
	if(str[0]==0)return 1;
	buf[99]='\0';
	if( (fp=open(str,FREAD)) == NULL)
	{	
		printf("file %s not found.\n",str);
		return 0;
	}     
	while(read(fp,sizeof(buf)-1,buf)==0)
	{
		printf("%s",buf);
	}
	close(fp);
	return 0;
}
static s_int os_cmd_rm(char *str)
{
	int i;
	if(str[0])
	{
		i=delete(str);
		switch(i)
		{
		case 0:
			break;
		case -1:
			printf("Path not found.\n",i);
			break;
		case -2:
			printf("File not found.\n",i);
			break;
		case -3:
			printf("File inode error.\n",i);
			break;
		default:
			printf("Unknown Error [%d]\n",i);
		}
	}
	else
	{
		printf("file name needed.\n");
	}
	return 0;
}
s_int os_cmd_rmdir(char *str,...)
{
	s_int i;
//	char *first
	char *next;
	va_list ap;//依次指向每个参数

		//	char *p;
//	
  
     
/*    
	if((i=mkdir(ap))<0)printf("operation failed.%d\n",i);
	
    for(;p=va_arg(ap,char *);)
	  if((i=mkdir(p))<0)printf("operation failed.%d\n",i);
	va_end(ap);

*/ 
	 if(!*str) return 0;/* do nothing , but still ok */
     va_start(ap,str);//将ap指向第一个无名参数
	 while(1)
	 { 
		if( (next=va_arg(ap,char *))==NULL)
			return 0;
		i=rmdir(next);
		switch(i)
		{
		case 0:
			break;
		case -1:
			printf("Working Path not found.\n",i);
			break;
		case -2:
			printf("Remove path not found.\n",i);
			break;
		case -3:
			printf("Fatal: Directory inode error.\n",i);
			break;
		case -4:
			printf("Path not empty.\n");
			break;
		default:
			printf("Unknown Error [%d]\n",i);
		}
	 } 
	return 0;
}

static struct cmd_lists{
	char *cmd_tag;
	s_int (*func)(char *);
	char *cmd_help;
}cmd_list[]={
	"ls",  		os_cmd_ls,   	"show directory\nusage: ls [path]",
	"cd",		os_cmd_cd,  	"change direcotry\nusage: cd [path]",
	"pwd",		os_cmd_pwd,  	"show current direcotry\nusage: pwd [...]",
	"help",		os_cmd_help,	"show help\nusage: help [command name]",
	"halt",		os_cmd_halt,	"halt the system\nusage: halt",
	"logout",	os_cmd_logout,	"user log out\nusage: logout",
	"mkdir",	os_cmd_mkdir,	"create directory\nusage: mkdir <directory name>",
	"format",   os_cmd_format,	"format the file system\nusage: format",
	"create",	os_cmd_create,	"create file\nusage: create <file name>",
	"cat",		os_cmd_cat,		"show file\nusage: cat <file name>",
	"rm",		os_cmd_rm,		"remove file\nusage: rm <file name>",
	"rmdir",	os_cmd_rmdir,	"remove directory\nusage: rmdir <directory name>",
	 NULL,		os_cmd_err, 	NULL,
};

s_int os_fit_cmd(char *str)
{
	s_int i,len=strlen(str);
	for(i=0;cmd_list[i].cmd_tag;i++)
	{
		if(!strncmp(cmd_list[i].cmd_tag,str,len))
		{
			strcpy(str,cmd_list[i].cmd_tag);
			return strlen(cmd_list[i].cmd_tag);
		}
	}
	return 0;
}
s_int os_cmd_help(char *str)
{
	s_int i;
	for(i=0;cmd_list[i].cmd_tag;i++)
	{
		if(!strcmp(cmd_list[i].cmd_tag,str))
		{
			printf("%s\n",cmd_list[i].cmd_help);
			return 0;
		}
	}
	printf("%s",cmd_list[0].cmd_tag);
	for(i=1;cmd_list[i].cmd_tag;i++)
		printf("\t%s",cmd_list[i].cmd_tag);
	printf("\n");
	return 0;
}
/* fromat command name */
static s_int get_cmd_name(char *dst,char **str)
{
	for(;*(*str)==' ';(*str)++);
	for(;*(*str) && *(*str)!=' ';(*str)++)*dst++=**str;
	for(;*(*str)==' ';(*str)++);
	*dst=0;
	return 0;
}

static s_int os_processcmd(char *str)
{
	int i,j;
	char cmd[32];
	
	get_cmd_name(cmd,&str);
	for(i=0;cmd_list[i].cmd_tag;i++)
	{
		j=strlen(cmd);
		if(strlen(cmd_list[i].cmd_tag)!=j)
			continue;
		if(!strncmp(cmd,cmd_list[i].cmd_tag,j))
			return cmd_list[i].func(str);
	}
	return os_cmd_err(cmd);
}

s_int main()
{
	s_int res=1;
	char str[128];
	install();
	while(res!=-1)
	{
		res= login();
		while(res>=0)
		{
			os_getcmd(str);
			res=os_processcmd(str);
		}
		logout();
	}
	halt();
	/*system("pause");*/
	return 0;
}

⌨️ 快捷键说明

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