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