mirror of
https://gitee.com/Lamdonn/varch.git
synced 2025-12-06 08:46:42 +08:00
113 lines
3.3 KiB
Markdown
113 lines
3.3 KiB
Markdown
## 介绍
|
||
|
||
命令提示符是在操作系统中,提示进行命令输入的一种工作提示符,是一个便利人机交互接口。
|
||
该命令解析模块,暂不涉及接收从控制台传入的命令,而是处理字符串命令。
|
||
|
||
## 接口
|
||
|
||
### 命令导出
|
||
```c
|
||
int command_export(const char *name, command_handle_t handle);
|
||
```
|
||
在介绍命令解析函数之前,先看一下命令导出函数。
|
||
这个函数就是添加支持的函数,通过名字和相应的回调函数对应起来。`name`函数识别名(一般就是用函数名当作命令解析的识别名),`handle`就是相应的回调处理函数。导出成功了就返回1,失败返回0。
|
||
```c
|
||
typedef int (*command_handle_t)(int argc, char *argv[]);
|
||
```
|
||
`command_handle_t`函数类型的定义就是和我们常用的`int main(int argc, char *argv[])`是一致的,参数通过`argc`和`argv`传入。
|
||
|
||
### 命令执行
|
||
```c
|
||
int command(const char *line);
|
||
```
|
||
命令执行函数也很简单,也就是传入命令行就OK,返回相应命令识别的函数的返回值,-1是解析失败的时候的返回值,所以在定义处理函数时候,**返回值不能使用-1**。
|
||
命令的输入格式:
|
||
```
|
||
argv[0] argv[1] argv[2] ...
|
||
```
|
||
其中`argv[0]`就是命令识别符,后面可以跟若干个参数,个数通过`argc`传给函数。
|
||
命令参数通过空格分开,而当想在参数内传入空格时候,就需要用到转义字符反斜杠`\`进行转义,"\ "表示空格,除此,还支持的**转义字符**包含:双引号`"`和反斜杠`\`。
|
||
为了简化转义字符的使用,可以用**一对双引号**来括住不需要转义解析的命令。
|
||
使用例子:
|
||
```c
|
||
int func1(int argc, char *argv[])
|
||
{
|
||
printf("I am func1!\r\n");
|
||
printf("argc = %d\r\n", argc);
|
||
for (int i = 0; i < argc; i++)
|
||
{
|
||
printf("argv[%d] = %s\r\n", i, argv[i]);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
int func2(int argc, char *argv[])
|
||
{
|
||
printf("I am func2!\r\n");
|
||
return 1;
|
||
}
|
||
|
||
int func3(int argc, char *argv[])
|
||
{
|
||
printf("I am func3!\r\n");
|
||
return 1;
|
||
}
|
||
|
||
static void test(void)
|
||
{
|
||
/* 导出命令 */
|
||
command_export("func1", func1);
|
||
command_export("func2", func2);
|
||
command_export("func3", func3);
|
||
|
||
command("cmd -l"); // 模块内置的命令,用于查看当前支持的命令
|
||
printf("--------------------------\r\n");
|
||
command("func2");
|
||
printf("--------------------------\r\n");
|
||
command("func3");
|
||
printf("--------------------------\r\n");
|
||
command("func1 1 2 3"); // 不转义,每个空格分隔的都将成为单独的参数
|
||
printf("--------------------------\r\n");
|
||
command("func1 1\\ 2 3"); // 1后面的空格进行转义,1和2之前将会和空格连在一起
|
||
printf("--------------------------\r\n");
|
||
command("func1 \"1 2 3\""); // 双引号之间 "1 2 3" 会被解析为一个参数
|
||
}
|
||
```
|
||
结果:
|
||
```
|
||
cmd
|
||
func1
|
||
func2
|
||
func3
|
||
count = 4
|
||
--------------------------
|
||
I am func2!
|
||
--------------------------
|
||
I am func3!
|
||
--------------------------
|
||
I am func1!
|
||
argc = 4
|
||
argv[0] = func1
|
||
argv[1] = 1
|
||
argv[2] = 2
|
||
argv[3] = 3
|
||
--------------------------
|
||
I am func1!
|
||
argc = 3
|
||
argv[0] = func1
|
||
argv[1] = 1 2
|
||
argv[2] = 3
|
||
--------------------------
|
||
I am func1!
|
||
argc = 2
|
||
argv[0] = func1
|
||
argv[1] = 1 2 3
|
||
```
|
||
在其中`cmd`为内置命令,统计当前支持的命令,返回支持的命令个数。
|
||
|
||
### 命令清空
|
||
```c
|
||
void command_clear(void);
|
||
```
|
||
清空所有导出的命令。
|