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

📄 cmd.c

📁 ADS开发的BOOTLOADER,针对2410,是某培训班出的!
💻 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 + -