Skip to content

用于单片机上的简易命令行( Simple CMD )

License

Notifications You must be signed in to change notification settings

PING020903/simpleCmd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

简易终端( Simple CMD )

功能介绍

  • 注册命令RegisterCommand

  • 取消注册命令unRegisterCommand

  • 取消注册全部命令 unRegisterAllCommand

  • 寻找命令节点FindCommand

  • 更新命令updateCommand

  • 注册参数RegisterParameter

  • 取消注册单个命令下的所有参数unRegisterAllParameters

  • 取消注册参数unRegisterParameter

  • 更新参数updateParameter

  • 命令解析CommandParse

  • 命令解析( 宽字符 )CommandParseW

  • 获得上次运行链表管理函数的错误NodeGetLastError

  • 打印当前已经注册的命令和参数showList

  • 打印指定命令已经注册的参数showParam


TIPS:

  • 该终端使用[command] [param] [userParam]这样的形式,userParam是可选项

  • 不能单独调用command,因为command没有处理函数可注册,被解析的指令必须带有param才能正常调用处理函数,

  • 若解析的指令后面没有跟随userParam则直接调用处理函数,有userParam则会作为字符串参数传递给处理函数

  • command为英文的情况下,将会被强制转换为小写,调试时无论输入大写还是小写均为同样的效果

  • command首选推荐英文,中文( GB2312, UTF-8 )可能会出现未知情况,但并不是不行

  • param是否支持宽字符,是继承command是否为宽字符这个属性,若后面带有userParam也应为宽字符格式

  • param不支持输入字符(space)

  • 若传入到用户注册函数的是源字符串,请用户不要妄图修改源字符串,因为它实际上是const属性


transplantation

INCLUDE:
  • stdio.h

  • string.h

  • wchar.h

  • stdlib.h

FUNCTIONS USED:
  • malloc & free

  • printf & wprintf

  • strlen & wcslen

  • strcpy & wcscpy

  • strcmp & wcscmp

  • memcpy


注册命令RegisterCommand

int RegisterCommand(const bool isWch,
                    const char* command,
                    const wchar_t* commandW);

isWch: 是否使用宽字符支持

command: 命令的字符串

RETURN:

  • NODE_OK
  • NODE_ARG_ERR
  • NODE_CMD_TOO_LONG
  • NODE_REPEATING
  • NODE_FAIL
note:

        若输入英文命令,所有大写的字符都会被转换为小写


取消注册命令unRegisterCommand

int unRegisterCommand(char* command, wchar_t* commandW);

command: 非宽字符的命令

commandW: 宽字符的命令

RETURN:

  • NODE_OK
  • NODE_ARG_ERR
  • NODE_CMD_TOO_LONG
  • NODE_NOT_YET_INIT
  • NODE_NOT_FIND_CMD
  • NODE_FAIL
note:

        若输入英文命令,所有大写的字符都会被转换为小写


取消注册全部命令 unRegisterAllCommand

int unRegisterAllCommand(void);

RETURN:

  • NODE_OK

  • NODE_FAIL

  • NODE_NOT_YET_INIT


寻找命令节点FindCommand

command_node* FindCommand(const char* command,
                          const wchar_t* commandW);

command: 非宽字符的命令

commandW: 宽字符的命令

RETURN:

  • target node

  • NULL


更新命令updateCommand

int updateCommand(char* oldCommand, wchar_t* oldCommandW,
                  char* newCommand, wchar_t* newCommandW);

oldCommand: 旧命令

oldCommandW: 旧命令( 宽字符 )

newCommand: 新命令

newCommandW: 新命令( 宽字符 )

RETURN:

  • NODE_OK
  • NODE_ARG_ERR
  • NODE_NOT_FIND_CMD
  • NODE_REPEATING
  • NODE_NOT_YET_INIT
  • NODE_FAIL
note:

        若输入英文命令,所有大写的字符都会被转换为小写


注册参数RegisterParameter

int RegisterParameter(command_node* node,
                      ParameterHandler hook,
                      const bool isRaw,
                      const void* paramStr);

node: 注册参数的命令

hook: 参数的处理函数

isRaw: 是否给 hook 传递源字符串

param: 参数

RETURN:

  • NODE_OK
  • NODE_ARG_ERR
  • NODE_CMD_NODE_NULL
  • NODE_PARAM_TOO_LONG
  • NODE_REPEATING
  • NODE_FAIL
note:

        相较于commandparameter的定义就比较自由,除了不能输入字符(space)


取消注册单个命令下的所有参数unRegisterAllParameters

int unRegisterAllParameters(command_node* node);

node: 命令节点

RETURN:

  • NODE_OK

  • NODE_ARG_ERR

  • NODE_PARAM_NODE_NULL


取消注册参数unRegisterParameter

int unRegisterParameter(command_node* node,
                        const void* paramStr);

node: 要被删除参数的命令 paraStr: 参数

RETURN:

  • NODE_OK

  • NODE_ARG_ERR

  • NODE_NOT_FIND_PARAM

  • NODE_PARAM_TOO_LONG

  • NODE_FAIL


更新参数updateParameter

int updateParameter(cconst command_node* CmdNode, ParameterHandler hook,
                    const bool isRaw, const void* oldParam, const void* newParam);

CmdNode: 要被更改参数的命令 hook: 参数处理函数 isRaw: 是否给 hook 传递源字符串 oldParam: 旧参数( 宽字符 ) newParam: 新参数

RETURN:

  • NODE_OK

  • NODE_ARG_ERR

  • NODE_REPEATING

  • NODE_NOT_FIND_PARAM


命令解析CommandParse

int CommandParse(const char* commandString);

commandString: 用户输入的字符串

RETURN:

  • NODE_OK
  • NODE_ARG_ERR
  • NODE_CMD_TOO_LONG
  • NODE_PARAM_TOO_LONG
  • NODE_NOT_FIND_CMD
  • NODE_NOT_FIND_PARAM
  • NODE_PARSE_ERR
  • NODE_NOT_YET_INIT
note:

        commandparameter直接的空格都会被忽略,parameteruserParam之间也是如此


命令解析( 宽字符 )CommandParseW

int CommandParseW(const wchar_t* commandString);

commandString: 用户输入的字符串

RETURN:

  • NODE_OK
  • NODE_ARG_ERR
  • NODE_CMD_TOO_LONG
  • NODE_PARAM_TOO_LONG
  • NODE_NOT_FIND_CMD
  • NODE_NOT_FIND_PARAM
  • NODE_PARSE_ERR
  • NODE_NOT_YET_INIT
note:

        commandparameter直接的空格都会被忽略,parameteruserParam之间也是如此


获得上次运行链表管理函数的错误NodeGetLastError

int NodeGetLastError(void);

RETURN:

        lastError


打印当前已经注册的命令和参数showList

void showList(void);

打印指定命令已经注册的参数showParam

void showParam(command_node* CmdNode);

作者吐槽

        在这里,我先 DISS 一下这篇文章https://zhuanlan.zhihu.com/p/141409031还有这份代码https://github.com/jiejieTop/cmd-parser

        为什么 DISS 这份文章和代码呢?

        缘由是这样的,我需要个如同终端这样的字符解释器,根据我输入的字符来调用不同的函数,对板子进行调试,搜索了一些词条,但都是关于Power Shell亦或者是Unix shell的命令表格,跟我的需求都不搭边,唯一符合的就只有以上的这个知乎的文章链接。

        一开始我看见了这个符合我预期的东西还是挺开心的,但是点进GitHub仓库一看,好家伙,几个issue都没有处理,关键是这几个issue都是关于代码移植以后各种报错、跑不起来,还有几个pull request都没有处理,这完全是没人管的一个东西。再细看代码,发现在line:67处有这么一句,

 printf("%s -->%s\n",index->cmd,index->desc);

而这个index的定义是这样的

typedef void (*cmd_handler)(void);

typedef struct cmd {
    const char*     cmd;
    const char*     cmd_mess;
    unsigned int    hash;
    cmd_handler     handler;
} cmd_t;


static void _list(void)
{
    cmd_t *index;
    for (index = _cmd_begin; index < _cmd_end; index = _get_next_cmd(index)) {
        printf("%s -->%s\n",index->cmd,index->desc);
    }
}

于是我自己写了这个能满足我需求的终端。


创建于2024-11-11 20:44

修改时间2024-18 6:37

About

用于单片机上的简易命令行( Simple CMD )

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages