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