?? cmd.c
字號:
#include <string.h>
#include "struct.h"
#include "cmd.h"
#include "lcd.h"
#include "uart.h"
#define NOTFIND 0
#define FOUND 1
#define SPACE 0
#define TOKEN 1
#define STRING 2
usr_command help = {
"help",
help_done,
NULL,
NULL,
NULL,
NULL,
};
static usr_command * head_cmd;
static usr_command * prv_cmd;
//命令解釋
void preargs(char *str,int *argc_p, char ** argv)
{char c;
int argc=0;
int last=SPACE;
while((c=*str)!='\0')
{
if(c==' '||c=='\t')
{
if(last!=STRING){
*(str++)=0;
last=SPACE;
continue;}
}
if(last==SPACE)
{if(c=='"')
{last=STRING;
*(str++)=0;
argv[argc++]=(str++);
continue;
}
argv[argc++]=(str++);
last=TOKEN;
continue;
}
if(last==STRING)
{if(c=='"')
{*str='\0';
last=0;
}
}
str++;
}
argv[argc]=NULL;
if(argc_p!=0)
{
*argc_p=argc;
}
}
//分析命令
void exec_sting(char *buf)
{int argc,i;
char *argv[128];
for(i=0;i<128;i++)
{argv[i]=0;
}
preargs(buf,&argc,argv);
if (argc>0)
{
exec_cmd(argc, ( char **)argv);
}
}
//執行命令
int exec_cmd(int argc, char **argv)
{usr_command *comd;
comd=find_cmd(argc,argv);
if(comd==NULL)
{
uart_send("Command can't find\r\n");
return 0;}
if(comd->cmdfunc){
comd->cmdfunc(argc,argv);
}else{
uart_send("Command isn't integrity\r\n");
return 0;
}
return 1;}
//查找命令
usr_command * find_cmd(int argc, char ** argv)
{usr_command *p;
usr_command *f;
int stat=NOTFIND;
int i=0,j;
f=head_cmd;
p=NULL;
j=argc;
for(;j>0;j--)
{
stat=NOTFIND;
prv_cmd=p;
p=f;
while(p!=NULL)
{
if(strcmp(p->name,argv[i])==0) {stat=FOUND; break;}
p=p->next;
}
if(stat!=FOUND) return (prv_cmd);
if((f=p->child)==NULL) break;
i++;}
return (p);
}
//添加命令樹
static void add_cmd_tree(usr_command *p)
{
if(p->parent)
{
p->next=p->parent->child;
p->parent->child=p;
}else{
p->next=head_cmd;
head_cmd=p;
}
}
//添加命令
void add_cmd(usr_command *p)
{usr_command *crrune;
add_cmd_tree(p);
crrune=p->child;
if(crrune)
{
while(crrune)
{crrune=crrune->next;
}
crrune->next=&help;
}else{
p->child=&help;
}
}
//命令行
void myshell()
{char *c;
uart_send("\n\r");
while(1)
{uart_send("myshell>>");
uart_receive(c);
exec_sting(c);
}
}
//初始化
void init_cmd()
{
head_cmd=NULL;
}
//遞歸
static void cmd_visit(usr_command *tail)
{usr_command *p;
if(tail!=NULL&&(!strcmp(tail->name,"help")==0))
{p=tail->parent;
uart_send(tail->name);
while(p!=NULL)
{uart_send("--");
uart_send(p->name);
p=p->parent;
}
uart_send("\r\n");
cmd_visit(tail->child);
cmd_visit(tail->next);
}
}
//遍利命令
void ls_cmd_tree(int argc, char ** argv)
{
usr_command *tail;
tail=head_cmd;
cmd_visit(tail);
}
//HELP處理函數
void help_done(int argc, char ** argv)
{
uart_send(prv_cmd->help);
uart_send("\r\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -