文章目录
功能说明
win c 实现shell 传参版(支持最大6个参数):
- 可以将有参函数通过函数名注册到自己实现的shell,在shell终端通过输入函数名的方式,执行对应函数。
- 注册的函数在终端支持最大6个参数,每个参数可为整形或字符型
- shell支持上下键命令切换。
- tab回显上次命令。
- 左右键可以左右移动光标,实现对终端命令字符串的任意位置的编辑(添加,删除)。
前置基础
参考上个博客:“win c 实现shell(命令解释器) 无参版-CSDN博客”。在其代码的基础上作为本次的基础代码。也可以直接拷贝如下代码作为基础代码。
回顾上期干货:
main.h
#ifndef _MINI_SHELL_H_
#define _MINI_SHELL_H_
#define CMD_ADD_MAX_NUM 200 // 命令最大支持添加条数
#define CMD_NAME_MAX_SIZE 200 // 单个命令名字最大支持长度
// 函数指针类型
typedef void (*cmdFun)(void);
void registerCmd(const char* name, cmdFun func);
// 注册函数接口,在这个示例中,宏 REGISTER_CMD(cmd) 使用 #cmd 将命令名转换为字符串,
// 并将命令名和函数指针传递给 registerCmd 函数。这样,你只需传递一个参数即可注册命令。
#define REGISTER_CMD(cmd) registerCmd(#cmd, cmd)
typedef struct
{
char cmdList[CMD_ADD_MAX_NUM][CMD_NAME_MAX_SIZE]; // "命令列表"(字符串)
cmdFun cmdList_funPtr[CMD_ADD_MAX_NUM]; // "命令列表"对应的"函数指针列表"
int cmdList_sum; // "命令列表"中已经注册的命令个数
int cmdList_curIndex; // 当前命令在"命令列表"的索引,初始为0
char curInputCmd[CMD_NAME_MAX_SIZE]; // 当前输入的命令
int curInputIndex; // 已经输入字符的索引,0是第一个字符的索引
int curInputSum; // 已经输入字符的总数
char oldInputCmd[CMD_NAME_MAX_SIZE]; // 上一条输入的命令
} shell_stu;
#endif
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#define KEY_FRONT 224 // 方向键的前导键
#define KEY_UP 72 // 上键
#define KEY_DOWN 80 // 下键
#define KEY_LEFT 75 // 左键
#define KEY_RIGHT 77 // 右键
#define KEY_ENTER 13 // 回车键
#define KEY_BACK 8 // 回退键
#define KEY_TAB 9 // tab键
// 用于清空上次显示在终端上的打印,命令长度不同导致的,比如命令1:test_5555,命令2:test_2,
// 上下键由命令1切换到命令2,终端就会打印test_2555.这个就是用空格再次覆盖后面的555
#define SPACE_DISPLAY " "
static shell_stu shell;
static void shell_stu_init()
{
shell.cmdList_sum = 0;
shell.cmdList_curIndex = 0;
memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
shell.curInputIndex = 0;
shell.curInputSum = 0;
memset(shell.oldInputCmd, 0, sizeof(shell.oldInputCmd));
}
/**
* @brief 在指定位置插入一个字符,并打印结果,不修改原字符串。
* 该函数不会修改原字符串,而是构造一个新字符串并打印。
* @param str 目标字符串。
* @param ch 要插入的字符。
* @param pos 插入字符的位置(从 0 开始索引)。
*/
void str_prtInsertChar(const char *str, char ch, int pos)
{
int len = strlen(str);
if (pos < 0 || pos > len)
{
printf("Invalid position.\n");
return;
}
// printf("Result: ");
for (int i = 0; i < len + 1; i++)
{
if (i == pos)
{
putchar(ch);
}
if (i < len)
{
putchar(str[i]);
}
}
// printf("\n");
}
/**
* @brief 在指定位置插入一个字符。
* 该函数会将原有字符向右移动,以腾出空间插入新字符,并确保不会超出缓冲区大小。
* @param str 目标字符串,插入字符后会修改该字符串。
* @param ch 要插入的字符。
* @param pos 插入字符的位置(从 0 开始索引)。
* @param size 字符串的总缓冲区大小(用于防止溢出)。
*/
void str_insertChar(char *str, char ch, int pos, int size)
{
int len = strlen(str);
if (pos < 0 || pos > len || len + 1 >= size)
{
printf("Invalid position or insufficient buffer size.\n");
return;
}
for (int i = len; i >= pos; i--)
{
str[i + 1] = str[i];
}
str[pos] = ch;
}
/**
* @brief 在指定位置删除一个字符。
* 该函数会将后续字符左移以填补被删除字符的位置。
* @param str 目标字符串,删除字符后会修改该字符串。
* @param pos 删除字符的位置(从 0 开始索引)。
*/
void str_deleteChar(char* str, int pos)
{
int len = strlen(str);
if (pos < 0 || pos >= len)
{
printf("Invalid position.\n");
return;
}
for (int i = pos; i < len; i++)
{
str[i] = str[i + 1];
}
}
// 回显命令
static void cmdShow()
{
printf("\r%s\rCMD>>", SPACE_DISPLAY);
str_prtInsertChar(shell.curInputCmd, '_', shell.curInputIndex);
}
// 清空输入的命令
static void curInputCmd_clear()
{
memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
shell.curInputIndex = 0;
shell.curInputSum = 0;
}
//命令注册
void registerCmd(const char* name, cmdFun func)
{
if (shell.cmdList_sum < CMD_ADD_MAX_NUM)
{
memset(shell.cmdList[shell.cmdList_sum], 0, CMD_NAME_MAX_SIZE);
strcpy(shell.cmdList[shell.cmdList_sum], name);
shell.cmdList_funPtr[shell.cmdList_sum] = func;
shell.cmdList_sum++;
printf("[CMD INSTALL OK][%02d] %s\n", shell.cmdList_sum, name);
}
else
{
printf("[CMD]table is full,regist failed!fun:%s\n", name);
}
}
// 命令解析和执行
static void cmdRun(const char* cmd)
{
int i;
for (i = 0; i <= shell.cmdList_sum; i++)
{
if (strcmp(cmd, shell.cmdList[i]) == 0)
{
printf("\n");
shell.cmdList_funPtr[i](); // 调用相应的函数
return;
}
}
printf("Unknown command: %s\n", cmd);
}
void logo_show()
{
printf("=======================================================\n");
printf("- - - - - - -\n");
printf(" __ ____ ____ _ _ _____ _ _ \n");
printf(" / \\/ / / ___/ / / / // ____// / / / \n");
printf(" / /\\_// / \\___ \\ / /_/ // _/ / / / / \n");
printf(" / / / / ___) // _ // /___ / /___ / /___ \n");
printf(" /_/ /_/ /____/ /_/ /_//_____//_____//_____/ \n");
printf("- - - - - - -\n");
printf("=======================================================\n");
printf("MINI 交互终端 [mini interface terminal]\n");
printf("-------------------------------------------------------\n");
}
void t1()
{
printf("this is t1 test\n");
}
void t2()
{
printf("this is t2 test\n");
}
void t3()
{
printf("this is t2 test\n");
}
void registerCmd_test_init()
{
REGISTER_CMD(t1);
REGISTER_CMD(t2);
REGISTER_CMD(t3);
}
void help(void)
{
printf("本SHELL已注册函数:\n");
for (int i = 0; i < shell.cmdList_sum; i++)
{
printf("[CMD] %s\n", shell.cmdList[i]);
}
}
static void registerCmd_init()
{
// ===========================================================
// 临时测试
// ===========================================================
#if 1 // ===start===临时测试===start===
registerCmd_test_init();
#endif // ===end===临时测试===end===
// ===========================================================
// 功能测试函数:
// src/source/main_loop
// ===========================================================
#if 1 // ===start===功能测试函数===start===
#endif // ===end===功能测试函数===end===
// ===========================================================
// 工具测试函数:
// src/source/tools
// src/test/tools
// ===========================================================
#if 1 // ===start===工具测试函数===start===
#endif // ===end===工具测试函数===end===
// 打印注册命令
REGISTER_CMD(help);
}
int main()
{
logo_show();
registerCmd_init();
cmdShow();
while (1)
{
// 检测按键
int ch = _getch();
// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值
// 1>上下键会从命令列表中回显当cmd_list_crr_index的命令
if (ch == KEY_FRONT)
{
// 特殊按键(如方向键)的前导字节
ch = _getch();
// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值
if (ch == KEY_UP)
{
// 上键
shell.cmdList_curIndex = (shell.cmdList_curIndex - 1 + shell.cmdList_sum) % shell.cmdList_sum;
strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
shell.curInputIndex = strlen(shell.curInputCmd) - 1;
shell.curInputSum = strlen(shell.curInputCmd);
printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
}
else if (ch == KEY_DOWN)
{
// 下键
shell.cmdList_curIndex = (shell.cmdList_curIndex + 1) % shell.cmdList_sum;
strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
shell.curInputIndex = strlen(shell.curInputCmd) - 1;
shell.curInputSum = strlen(shell.curInputCmd);
printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
}
else if (ch == KEY_LEFT)
{
// 左键
if (shell.curInputIndex > 0)
{
shell.curInputIndex--;
cmdShow();
}
}
else if (ch == KEY_RIGHT)
{
// 右键
if (shell.curInputIndex < shell.curInputSum)
{
shell.curInputIndex++;
cmdShow();
}
}
}
// 2>可以回车键可以执行输入的命令,或者回显CMD
else if (ch == KEY_ENTER)
{
// 如果终端有输入字符,并且按了回测,就执行
if (shell.curInputSum > 0)
{
// 备份上条命令
strcpy(shell.oldInputCmd, shell.curInputCmd);
cmdRun(shell.curInputCmd);
curInputCmd_clear();
}
else
{
//这里表示没有任何普通字符输入,但是按了回车,可以起到换行的作用
printf("\nCMD>>"); // 回显命令
}
}
// 3>检查是否是回退键,回退键清除终端上的字符:
else if (ch == KEY_BACK)
{
// 这里表示经过上下键回显完整的cmd字符
if (shell.curInputIndex > 0)
{
str_deleteChar(shell.curInputCmd, shell.curInputIndex - 1);
shell.curInputIndex--;
shell.curInputSum--;
cmdShow();
}
}
// 4>检查是否是tab键,回显上次执行的命令
else if (ch == KEY_TAB)
{
strcpy(shell.curInputCmd, shell.oldInputCmd);
shell.curInputIndex = strlen(shell.curInputCmd);
shell.curInputSum = strlen(shell.curInputCmd);
cmdShow();
}
// 5>普通字符
else
{
str_insertChar(shell.curInputCmd, ch, shell.curInputIndex, sizeof(shell.curInputCmd));
shell.curInputSum++;
shell.curInputIndex++;
cmdShow();
}
}
return 0;
}
传参功能实现逻辑
-
无参命令的回顾
之前已实现无参函数的注册和调用:终端解析用户输入的命令字符串,与已注册命令进行匹配,若匹配成功,则调用对应的函数。 -
引入参数传递
在此基础上,我们扩展支持命令传参。终端输入可包含命令及其参数,参数间使用空格分隔,示例如下:CMD>>cmd1 argv1 argv2 argv3其中,第一个单词是命令,后续为参数。
-
参数类型的区分
由于终端输入的内容均为字符串,为区分字符串参数与整型参数,我们约定:
- 被引号
""包裹的参数解析为字符串(char *)。 - 未加引号的参数解析为整型(
int)。
示例:
CMD>>cmd1 "arg1" 123 arg3 "cmd4"解析结果:
"arg1"→ 字符串 (char *)123→ 整型 (int)arg3→ 由于无引号, 整型 (int)"cmd4"→ 字符串 (char *)
- 被引号
-
解析输入并调用函数
获取用户输入后,首先解析出命令名,并在已注册的命令列表中查找匹配项。匹配成功后,获取参数并传递给相应的函数指针。例如,支持一个整型参数的函数指针定义如下:
typedef void (*CmdFunc1_I)(int);这与无参函数指针 (
typedef void (*CmdFunc)(void);) 类似,只是多了参数。调用时,可直接传参:
cmdFuncPtr(atoi(argv1)); -
支持多个参数类型的组合
由于参数可能是字符串或整型,我们需要定义不同参数数量和类型组合的函数指针。例如:
typedef void (*CmdFunc1_S)(char *); typedef void (*CmdFunc2_IS)(int, char *); typedef void (*CmdFunc2_SI)(char *, int);这样,若支持最多 6 个参数,我们需要定义所有可能的类型排列组合,共计 127 种函数指针(包括无参情况)。
-
函数指针匹配
在解析命令时,需要根据参数个数及类型,匹配适当的函数指针,确保正确调用目标函数。虽然组合较多,但可通过枚举映射或类型编码等技巧优化匹配逻辑(这一部分将在后续详细讨论)。
-
关于使用可变参数声明函数指针是否可行
可变参数函数指针声明如下:
#include <stdarg.h>//支持可变参数 // 定义支持可变参数的函数指针类型 typedef void (*CmdFunc)(int, ...); // 使用 ... 表示可变参数由于声明的可变参数函数指针,其定义的第一个参数必须有,这里是int,可作为区分是有几个可变参数。由于可变参数第一个是int,就必须表示我们注册的函数,参数1必须是int,并且即便用不着也必须定义,不然参数类型匹配的时候,匹配不上。
不使用可变参数函数指针的原因:
- 参数类型信息缺失:可变参数 (
...) 不包含类型信息,无法直接区分int和char *,需要额外的方式解析,增加复杂度。 - 参数匹配困难:注册的命令函数需要遵循统一的参数格式(如第一个参数必须是
int),否则匹配时可能失败,降低灵活性。 - 安全性问题:可变参数函数容易因参数解析错误导致未定义行为,如读取错误的类型或访问越界。
- 性能开销:相比固定参数,解析可变参数需要使用
va_list,存在额外的解析和类型转换开销。
因此,我选择使用固定参数的函数指针,虽然需要定义多个函数指针类型,但能确保参数匹配的准确性和安全性。
- 参数类型信息缺失:可变参数 (
详细步骤
127种函数指针的声明和匹配
新建cmd.h
#ifndef _CMD_H_
#define _CMD_H_
typedef int INT;
typedef char *CAR;
// 定义支持可变参数的函数指针类型
// 说明:cmdFun后面的第一个数字表示有几个参数,后面一次为该序号的参数的类型,I-数值;C-字符串
// 通用定义
typedef void (*cmdFun)(void);
// 无参数
typedef void (*cmdFun0)(void);
// ===strat=== 1个参数 ===strat===
typedef void (*cmdFun1_I)(INT);
typedef void (*cmdFun1_C)(CAR);
// ===end=== 1个参数 ===end===
// ===strat=== 2个参数 ===strat===
typedef void (*cmdFun2_II)(INT, INT);
typedef void (*cmdFun2_IC)(INT, CAR);
typedef void (*cmdFun2_CI)(CAR, INT);
typedef void (*cmdFun2_CC)(CAR, CAR);
// ===end=== 2个参数 ===end===
// ===strat=== 3个参数 ===strat===
typedef void (*cmdFun3_III)(INT, INT, INT);
typedef void (*cmdFun3_IIC)(INT, INT, CAR);
typedef void (*cmdFun3_ICI)(INT, CAR, INT);
typedef void (*cmdFun3_ICC)(INT, CAR, CAR);
typedef void (*cmdFun3_CII)(CAR, INT, INT);
typedef void (*cmdFun3_CIC)(CAR, INT, CAR);
typedef void (*cmdFun3_CCI)(CAR, CAR, INT);
typedef void (*cmdFun3_CCC)(CAR, CAR, CAR);
// ===end=== 3个参数 ===end===
// ===strat=== 4个参数 ===strat===
typedef void (*cmdFun4_IIII)(INT, INT, INT, INT);
typedef void (*cmdFun4_IIIC)(INT, INT, INT, CAR);
typedef void (*cmdFun4_IICI)(INT, INT, CAR, INT);
typedef void (*cmdFun4_IICC)(INT, INT, CAR, CAR);
typedef void (*cmdFun4_ICII)(INT, CAR, INT, INT);
typedef void (*cmdFun4_ICIC)(INT, CAR, INT, CAR);
typedef void (*cmdFun4_ICCI)(INT, CAR, CAR, INT);
typedef void (*cmdFun4_ICCC)(INT, CAR, CAR, CAR);
typedef void (*cmdFun4_CIII)(CAR, INT, INT, INT);
typedef void (*cmdFun4_CIIC)(CAR, INT, INT, CAR);
typedef void (*cmdFun4_CICI)(CAR, INT, CAR, INT);
typedef void (*cmdFun4_CICC)(CAR, INT, CAR, CAR);
typedef void (*cmdFun4_CCII)(CAR, CAR, INT, INT);
typedef void (*cmdFun4_CCIC)(CAR, CAR, INT, CAR);
typedef void (*cmdFun4_CCCI)(CAR, CAR, CAR, INT);
typedef void (*cmdFun4_CCCC)(CAR, CAR, CAR, CAR);
// ===end=== 4个参数 ===end===
// ===strat=== 5个参数 ===strat===
typedef void (*cmdFun5_IIIII)(INT, INT, INT, INT, INT);
typedef void (*cmdFun5_IIIIC)(INT, INT, INT, INT, CAR);
typedef void (*cmdFun5_IIICI)(INT, INT, INT, CAR, INT);
typedef void (*cmdFun5_IIICC)(INT, INT, INT, CAR, CAR);
typedef void (*cmdFun5_IICII)(INT, INT, CAR, INT, INT);
typedef void (*cmdFun5_IICIC)(INT, INT, CAR, INT, CAR);
typedef void (*cmdFun5_IICCI)(INT, INT, CAR, CAR, INT);
typedef void (*cmdFun5_IICCC)(INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_ICIII)(INT, CAR, INT, INT, INT);
typedef void (*cmdFun5_ICIIC)(INT, CAR, INT, INT, CAR);
typedef void (*cmdFun5_ICICI)(INT, CAR, INT, CAR, INT);
typedef void (*cmdFun5_ICICC)(INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_ICCII)(INT, CAR, CAR, INT, INT);
typedef void (*cmdFun5_ICCIC)(INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_ICCCI)(INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_ICCCC)(INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun5_CIIII)(CAR, INT, INT, INT, INT);
typedef void (*cmdFun5_CIIIC)(CAR, INT, INT, INT, CAR);
typedef void (*cmdFun5_CIICI)(CAR, INT, INT, CAR, INT);
typedef void (*cmdFun5_CIICC)(CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun5_CICII)(CAR, INT, CAR, INT, INT);
typedef void (*cmdFun5_CICIC)(CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun5_CICCI)(CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun5_CICCC)(CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_CCIII)(CAR, CAR, INT, INT, INT);
typedef void (*cmdFun5_CCIIC)(CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun5_CCICI)(CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun5_CCICC)(CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_CCCII)(CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun5_CCCIC)(CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_CCCCI)(CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_CCCCC)(CAR, CAR, CAR, CAR, CAR);
// ===end=== 5个参数 ===end===
// ===strat=== 6个参数 ===strat===
typedef void (*cmdFun6_IIIIII)(INT, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_IIIIIC)(INT, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_IIIICI)(INT, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_IIIICC)(INT, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_IIICII)(INT, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_IIICIC)(INT, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_IIICCI)(INT, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_IIICCC)(INT, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_IICIII)(INT, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_IICIIC)(INT, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_IICICI)(INT, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_IICICC)(INT, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_IICCII)(INT, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_IICCIC)(INT, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_IICCCI)(INT, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_IICCCC)(INT, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_ICIIII)(INT, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_ICIIIC)(INT, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_ICIICI)(INT, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_ICIICC)(INT, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_ICICII)(INT, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_ICICIC)(INT, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_ICICCI)(INT, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_ICICCC)(INT, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_ICCIII)(INT, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_ICCIIC)(INT, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_ICCICI)(INT, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_ICCICC)(INT, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_ICCCII)(INT, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_ICCCIC)(INT, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_ICCCCI)(INT, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_ICCCCC)(INT, CAR, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_CIIIII)(CAR, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_CIIIIC)(CAR, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_CIIICI)(CAR, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_CIIICC)(CAR, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CIICII)(CAR, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_CIICIC)(CAR, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CIICCI)(CAR, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CIICCC)(CAR, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CICIII)(CAR, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_CICIIC)(CAR, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CICICI)(CAR, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CICICC)(CAR, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CICCII)(CAR, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CICCIC)(CAR, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CICCCI)(CAR, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CICCCC)(CAR, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_CCIIII)(CAR, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_CCIIIC)(CAR, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_CCIICI)(CAR, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_CCIICC)(CAR, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CCICII)(CAR, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_CCICIC)(CAR, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CCICCI)(CAR, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CCICCC)(CAR, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CCCIII)(CAR, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_CCCIIC)(CAR, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CCCICI)(CAR, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CCCICC)(CAR, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CCCCII)(CAR, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CCCCIC)(CAR, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CCCCCI)(CAR, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CCCCCC)(CAR, CAR, CAR, CAR, CAR, CAR);
// ===end=== 6个参数 ===end===
void cmdRun_arg0(cmdFun cmd);
void cmdRun_arg1(cmdFun cmd, void *argv[]);
void cmdRun_arg2(cmdFun cmd, void *argv[]);
void cmdRun_arg3(cmdFun cmd, void *argv[]);
void cmdRun_arg4(cmdFun cmd, void *argv[]);
void cmdRun_arg5(cmdFun cmd, void *argv[]);
void cmdRun_arg6(cmdFun cmd, void *argv[]);
#endif
新建cmd.h技巧
由于需要实现127种的函数指针声明,如果我们一个一个敲,肯定是不现实的。这里提一点使用vscode编辑器可以通过按下鼠标中键实现多行编辑。或者可以考虑将其部分代码拷贝在另个文本,用全局替换方法。
1、基版本,1个参数
// ===strat=== 1个参数 ===strat===
typedef void (*cmdFun1_I)(INT);
typedef void (*cmdFun1_C)(CAR);
// ===end=== 1个参数 ===end===
2、2个参数在1个参数基础上
2.1 拷贝1个参数的代码块,然后修改
2.1.1 使用vscode的多行编辑,"cmdFun1_"全局修改为"cmdFun2_1"
2.1.2 使用vscode的多行编辑,在括号第一个参数添加"INT,",效果如下
typedef void (*cmdFun2_II)(INT, INT);
typedef void (*cmdFun2_IC)(INT, CAR);
2.2 再拷贝1个参数的代码块,然后修改
2.1.1 使用vscode的多行编辑,"cmdFun1_"全局修改为"cmdFun2_2"
2.1.2 使用vscode的多行编辑,在括号第一个参数添加"CAR,",效果如下
typedef void (*cmdFun2_CI)(CAR, INT);
typedef void (*cmdFun2_CC)(CAR, CAR);
2.3 如此2个参数的代码块,就编写完成,如下:
// ===strat=== 2个参数 ===strat===
typedef void (*cmdFun2_II)(INT, INT);
typedef void (*cmdFun2_IC)(INT, CAR);
typedef void (*cmdFun2_CI)(CAR, INT);
typedef void (*cmdFun2_CC)(CAR, CAR);
// ===end=== 2个参数 ===end===
3、其它个数参数同理
新建cmd.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cmd.h"
/**
* @brief : 无参数的命令调用
* @param : cmd 函数指针
*/
void cmdRun_arg0(cmdFun cmd)
{
cmdFun0 fun = (cmdFun0)cmd;
fun();
}
/**
* @brief : 通过是否被字符"包裹的来判断字符串是否是数值
* @param : str
* @return : 0-是数值,1-是字符串
*/
int str_if_string(const char* str)
{
size_t len = strlen(str);
if (len >= 2 && str[0] == '"' && str[len - 1] == '"')
{
return 1; // 是字符串
}
return 0; // 是数值
}
/**
* @brief : 1个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg1(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
cmdFun1_I fun = (cmdFun1_I)cmd;
fun(atoi(argv[1]));
}
else
{
cmdFun1_C fun = (cmdFun1_C)cmd;
fun(argv[1]);
}
}
/**
* @brief : 2个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg2(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
cmdFun2_II fun = (cmdFun2_II)cmd;
fun(atoi(argv[1]), atoi(argv[2]));
}
else
{
cmdFun2_IC fun = (cmdFun2_IC)cmd;
fun(atoi(argv[1]), argv[2]);
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
cmdFun2_CI fun = (cmdFun2_CI)cmd;
fun(argv[1], atoi(argv[2]));
}
else
{
cmdFun2_CC fun = (cmdFun2_CC)cmd;
fun(argv[1], argv[2]);
}
}
}
/**
* @brief : 3个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg3(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_III fun = (cmdFun3_III)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
}
else
{
cmdFun3_IIC fun = (cmdFun3_IIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3]);
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_ICI fun = (cmdFun3_ICI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]));
}
else
{
cmdFun3_ICC fun = (cmdFun3_ICC)cmd;
fun(atoi(argv[1]), argv[2], argv[3]);
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_CII fun = (cmdFun3_CII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]));
}
else
{
cmdFun3_CIC fun = (cmdFun3_CIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3]);
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_CCI fun = (cmdFun3_CCI)cmd;
fun(argv[1], argv[2], atoi(argv[3]));
}
else
{
cmdFun3_CCC fun = (cmdFun3_CCC)cmd;
fun(argv[1], argv[2], argv[3]);
}
}
}
}
/**
* @brief : 4个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg4(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_IIII fun = (cmdFun4_IIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_IIIC fun = (cmdFun4_IIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_IICI fun = (cmdFun4_IICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]));
}
else
{
cmdFun4_IICC fun = (cmdFun4_IICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4]);
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_ICII fun = (cmdFun4_ICII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_ICIC fun = (cmdFun4_ICIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_ICCI fun = (cmdFun4_ICCI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]));
}
else
{
cmdFun4_ICCC fun = (cmdFun4_ICCC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4]);
}
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CIII fun = (cmdFun4_CIII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_CIIC fun = (cmdFun4_CIIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CICI fun = (cmdFun4_CICI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]));
}
else
{
cmdFun4_CICC fun = (cmdFun4_CICC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4]);
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CCII fun = (cmdFun4_CCII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_CCIC fun = (cmdFun4_CCIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CCCI fun = (cmdFun4_CCCI)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]));
}
else
{
cmdFun4_CCCC fun = (cmdFun4_CCCC)cmd;
fun(argv[1], argv[2], argv[3], argv[4]);
}
}
}
}
}
/**
* @brief : 5个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg5(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IIIII fun = (cmdFun5_IIIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_IIIIC fun = (cmdFun5_IIIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IIICI fun = (cmdFun5_IIICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_IIICC fun = (cmdFun5_IIICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IICII fun = (cmdFun5_IICII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_IICIC fun = (cmdFun5_IICIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IICCI fun = (cmdFun5_IICCI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_IICCC fun = (cmdFun5_IICCC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5]);
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICIII fun = (cmdFun5_ICIII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_ICIIC fun = (cmdFun5_ICIIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICICI fun = (cmdFun5_ICICI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_ICICC fun = (cmdFun5_ICICC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICCII fun = (cmdFun5_ICCII)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_ICCIC fun = (cmdFun5_ICCIC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICCCI fun = (cmdFun5_ICCCI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_ICCCC fun = (cmdFun5_ICCCC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5]);
}
}
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CIIII fun = (cmdFun5_CIIII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CIIIC fun = (cmdFun5_CIIIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CIICI fun = (cmdFun5_CIICI)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CIICC fun = (cmdFun5_CIICC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CICII fun = (cmdFun5_CICII)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CICIC fun = (cmdFun5_CICIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CICCI fun = (cmdFun5_CICCI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CICCC fun = (cmdFun5_CICCC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5]);
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCIII fun = (cmdFun5_CCIII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CCIIC fun = (cmdFun5_CCIIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCICI fun = (cmdFun5_CCICI)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CCICC fun = (cmdFun5_CCICC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCCII fun = (cmdFun5_CCCII)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CCCIC fun = (cmdFun5_CCCIC)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCCCI fun = (cmdFun5_CCCCI)cmd;
fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CCCCC fun = (cmdFun5_CCCCC)cmd;
fun(argv[1], argv[2], argv[3], argv[4], argv[5]);
}
}
}
}
}
}
/**
* @brief : 6个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg6(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIIIII fun = (cmdFun6_IIIIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IIIIIC fun = (cmdFun6_IIIIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIIICI fun = (cmdFun6_IIIICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IIIICC fun = (cmdFun6_IIIICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIICII fun = (cmdFun6_IIICII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IIICIC fun = (cmdFun6_IIICIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIICCI fun = (cmdFun6_IIICCI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IIICCC fun = (cmdFun6_IIICCC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICIII fun = (cmdFun6_IICIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IICIIC fun = (cmdFun6_IICIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICICI fun = (cmdFun6_IICICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IICICC fun = (cmdFun6_IICICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICCII fun = (cmdFun6_IICCII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IICCIC fun = (cmdFun6_IICCIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICCCI fun = (cmdFun6_IICCCI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IICCCC fun = (cmdFun6_IICCCC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICIIII fun = (cmdFun6_ICIIII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICIIIC fun = (cmdFun6_ICIIIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICIICI fun = (cmdFun6_ICIICI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICIICC fun = (cmdFun6_ICIICC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICICII fun = (cmdFun6_ICICII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICICIC fun = (cmdFun6_ICICIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICICCI fun = (cmdFun6_ICICCI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICICCC fun = (cmdFun6_ICICCC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCIII fun = (cmdFun6_ICCIII)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICCIIC fun = (cmdFun6_ICCIIC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCICI fun = (cmdFun6_ICCICI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICCICC fun = (cmdFun6_ICCICC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCCII fun = (cmdFun6_ICCCII)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICCCIC fun = (cmdFun6_ICCCIC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCCCI fun = (cmdFun6_ICCCCI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICCCCC fun = (cmdFun6_ICCCCC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIIIII fun = (cmdFun6_CIIIII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CIIIIC fun = (cmdFun6_CIIIIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIIICI fun = (cmdFun6_CIIICI)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CIIICC fun = (cmdFun6_CIIICC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIICII fun = (cmdFun6_CIICII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CIICIC fun = (cmdFun6_CIICIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIICCI fun = (cmdFun6_CIICCI)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CIICCC fun = (cmdFun6_CIICCC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICIII fun = (cmdFun6_CICIII)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CICIIC fun = (cmdFun6_CICIIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICICI fun = (cmdFun6_CICICI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CICICC fun = (cmdFun6_CICICC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICCII fun = (cmdFun6_CICCII)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CICCIC fun = (cmdFun6_CICCIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICCCI fun = (cmdFun6_CICCCI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CICCCC fun = (cmdFun6_CICCCC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCIIII fun = (cmdFun6_CCIIII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCIIIC fun = (cmdFun6_CCIIIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCIICI fun = (cmdFun6_CCIICI)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCIICC fun = (cmdFun6_CCIICC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCICII fun = (cmdFun6_CCICII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCICIC fun = (cmdFun6_CCICIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCICCI fun = (cmdFun6_CCICCI)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCICCC fun = (cmdFun6_CCICCC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCIII fun = (cmdFun6_CCCIII)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCCIIC fun = (cmdFun6_CCCIIC)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCICI fun = (cmdFun6_CCCICI)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCCICC fun = (cmdFun6_CCCICC)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCCII fun = (cmdFun6_CCCCII)cmd;
fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCCCIC fun = (cmdFun6_CCCCIC)cmd;
fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCCCI fun = (cmdFun6_CCCCCI)cmd;
fun(argv[1], argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCCCCC fun = (cmdFun6_CCCCCC)cmd;
fun(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
}
}
新建cmd.c技巧
由于需要实现127种的函数指针匹配处理,如果我们一个一个敲,肯定是不现实的。这里提一点使用vscode编辑器可以通过按下鼠标中键实现多行编辑。或者可以考虑将其部分代码拷贝在另个文本,用全局替换方法。
1、基版本,1个参数
void cmdRun_arg1(cmdFun cmd, void *argv[])
{
if (str_if_string(argv[1]) == 0)
{
cmdFun1_I fun = (cmdFun1_I)cmd;
fun(atoi(argv[1]));
}
else
{
cmdFun1_C fun = (cmdFun1_C)cmd;
fun(argv[1]);
}
}
2、2个参数在1个参数基础上
2.1 拷贝1个参数的代码块的if代码块,然后修改
2.1.1 新建代码块
if (str_if_string(argv[1]) == 0)
{
【位置1】
}
else
{
【位置2】
}
2.1.2 制作位置【1】的代码块,
2.1.2.1 拷贝基版的if代码块
2.1.2.2 修改基版的if代码块中"cmdFun1_"为"cmdFun2_I"
2.1.2.3 修改基版的if代码块中"argv[1]"为"argv[2]"
2.1.2.4 修改基版的if代码块中"fun("为"fun(atoi(argv[1]),",最终效果如下
if (str_if_string(argv[2]) == 0)
{
cmdFun2_II fun = (cmdFun2_II)cmd;
fun(atoi(argv[1]),atoi(argv[2]));
}
else
{
cmdFun2_IC fun = (cmdFun2_IC)cmd;
fun(atoi(argv[1]),argv[2]);
}
2.1.2 制作位置【2】的代码块,
2.1.2.1 拷贝基版的if代码块
2.1.2.2 修改基版的if代码块中"cmdFun1_"为"cmdFun2_C"
2.1.2.3 修改基版的if代码块中"argv[1]"为"argv[2]"
2.1.2.4 修改基版的if代码块中"fun("为"fun(argv[1],",最终效果如下
if (str_if_string(argv[2]) == 0)
{
cmdFun2_CI fun = (cmdFun2_CI)cmd;
fun(argv[1],atoi(argv[2]));
}
else
{
cmdFun2_CC fun = (cmdFun2_CC)cmd;
fun(argv[1],argv[2]);
}
2.1.3 最终2个参数的代码效果如下:
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
cmdFun2_II fun = (cmdFun2_II)cmd;
fun(atoi(argv[1]),atoi(argv[2]));
}
else
{
cmdFun2_IC fun = (cmdFun2_IC)cmd;
fun(atoi(argv[1]),argv[2]);
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
cmdFun2_CI fun = (cmdFun2_CI)cmd;
fun(argv[1],atoi(argv[2]));
}
else
{
cmdFun2_CC fun = (cmdFun2_CC)cmd;
fun(argv[1],argv[2]);
}
}
3、其它个数参数同理
修改命令解析和执行cmdRun()
在main.c中修改
// 命令解析和执行
static void cmdRun(char *cmdLine)
{
char *argv[10] = {0}; // 允许最多9个参数,argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
int argc = 0;
// 使用 strtok 解析字符串,拆分出命令名和参数
char *token = strtok(cmdLine, " ");
while (token != NULL && argc < 10)
{
argv[argc++] = token;
token = strtok(NULL, " ");
}
// 在命令列表中查找匹配的命令
if (argc > 0 && argv[0] != NULL)
{
// 只有在 argv[0] 非 NULL 时才调用 strcmp
for (int i = 0; i < shell.cmdList_sum; i++)
{
if (strcmp(argv[0], shell.cmdList[i]) == 0)
{
printf("\n正在调用函数: %s\n", argv[0]);
// 动态传递参数给命令函数
// shell.cmdList_funPtr[i](argc, argv); // 传递参数,跳过 argv[0](命令名)
switch (argc)
{
case 1:
{
// 无参数
cmdRun_arg0(shell.cmdList_funPtr[i]);
return;
}
case 2:
{
// 1个参数
cmdRun_arg1(shell.cmdList_funPtr[i], argv);
return;
}
case 3:
{
// 2个参数
cmdRun_arg2(shell.cmdList_funPtr[i], argv);
return;
}
case 4:
{
// 3个参数
cmdRun_arg3(shell.cmdList_funPtr[i], argv);
return;
}
case 5:
{
// 4个参数
cmdRun_arg4(shell.cmdList_funPtr[i], argv);
return;
}
case 6:
{
// 5个参数
cmdRun_arg5(shell.cmdList_funPtr[i], argv);
return;
}
case 7:
{
// 6个参数
cmdRun_arg6(shell.cmdList_funPtr[i], argv);
return;
}
default:
{
printf("\r%s\rCMD>>%s", SPACE_DISPLAY, "参数过多,不支持参数大于6个的命令"); // 回显命令
return;
}
}
}
}
printf("\nSHELL 无此函数:%s\n", cmdLine);
}
}
添加测试几个带参函数进行测试
新建test.h
#ifndef _MINI_SHELL_TEST_H_
#define _MINI_SHELL_TEST_H_
void registerCmd_test_init();
#endif
新建test.c
由于可能得参数类型过多,这里抽一个典型参数类型,进行测试
#include "mini_shell.h"
void t0()
{
printf("t0:t0\n");
}
void t1_1(int i1)
{
printf("t1:%d\n", i1);
}
void t1_2(char *i1)
{
printf("t1:%s\n", i1);
}
void t2_11(int i1, int i2)
{
printf("t2:%d,%d\n", i1, i2);
}
void t2_21(char *i1, int i2)
{
printf("t2:%s,%d\n", i1, i2);
}
void t2_12(int i1, char *i2)
{
printf("t2:%d,%s\n", i1, i2);
}
void t2_22(char *i1, char *i2)
{
printf("t2:%s,%s\n", i1, i2);
}
void t3_1(int i1, int i2, int i3)
{
printf("t3:%d,%d,%d\n", i1, i2, i3);
}
void t3_2(char *i1, char *i2, char *i3)
{
printf("t3:%s,%s,%s\n", i1, i2, i3);
}
void t4_1(int i1, int i2, int i3, int i4)
{
printf("t4:%d,%d,%d,%d\n", i1, i2, i3, i4);
}
void t4_2(char *i1, char *i2, char *i3, char *i4)
{
printf("t4:%s,%s,%s,%s\n", i1, i2, i3, i4);
}
void t5_1(int i1, int i2, int i3, int i4, int i5)
{
printf("t5:%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5);
}
void t5_2(char *i1, char *i2, char *i3, char *i4, char *i5)
{
printf("t5:%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5);
}
void t6_1(int i1, int i2, int i3, int i4, int i5, int i6)
{
printf("t6:%d,%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5, i6);
}
void t6_2(char *i1, char *i2, char *i3, char *i4, char *i5, char *i6)
{
printf("t6:%s,%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5, i6);
}
void registerCmd_test_init()
{
REGISTER_CMD(t0);
REGISTER_CMD(t1_1);
REGISTER_CMD(t1_2);
REGISTER_CMD(t2_11);
REGISTER_CMD(t2_12);
REGISTER_CMD(t2_21);
REGISTER_CMD(t2_22);
REGISTER_CMD(t3_1);
REGISTER_CMD(t3_2);
REGISTER_CMD(t4_1);
REGISTER_CMD(t4_2);
REGISTER_CMD(t5_1);
REGISTER_CMD(t5_2);
REGISTER_CMD(t6_1);
REGISTER_CMD(t6_2);
}
此时代码状态和运行效果,直接看干货
干货
源码
cmd.h
#ifndef _CMD_H_
#define _CMD_H_
typedef int INT;
typedef char* CAR;
// 定义支持可变参数的函数指针类型
// 说明:cmdFun后面的第一个数字表示有几个参数,后面一次为该序号的参数的类型,I-数值;C-字符串
// 通用定义
typedef void (*cmdFun)(void);
// 无参数
typedef void (*cmdFun0)(void);
// ===strat=== 1个参数 ===strat===
typedef void (*cmdFun1_I)(INT);
typedef void (*cmdFun1_C)(CAR);
// ===end=== 1个参数 ===end===
// ===strat=== 2个参数 ===strat===
typedef void (*cmdFun2_II)(INT, INT);
typedef void (*cmdFun2_IC)(INT, CAR);
typedef void (*cmdFun2_CI)(CAR, INT);
typedef void (*cmdFun2_CC)(CAR, CAR);
// ===end=== 2个参数 ===end===
// ===strat=== 3个参数 ===strat===
typedef void (*cmdFun3_III)(INT, INT, INT);
typedef void (*cmdFun3_IIC)(INT, INT, CAR);
typedef void (*cmdFun3_ICI)(INT, CAR, INT);
typedef void (*cmdFun3_ICC)(INT, CAR, CAR);
typedef void (*cmdFun3_CII)(CAR, INT, INT);
typedef void (*cmdFun3_CIC)(CAR, INT, CAR);
typedef void (*cmdFun3_CCI)(CAR, CAR, INT);
typedef void (*cmdFun3_CCC)(CAR, CAR, CAR);
// ===end=== 3个参数 ===end===
// ===strat=== 4个参数 ===strat===
typedef void (*cmdFun4_IIII)(INT, INT, INT, INT);
typedef void (*cmdFun4_IIIC)(INT, INT, INT, CAR);
typedef void (*cmdFun4_IICI)(INT, INT, CAR, INT);
typedef void (*cmdFun4_IICC)(INT, INT, CAR, CAR);
typedef void (*cmdFun4_ICII)(INT, CAR, INT, INT);
typedef void (*cmdFun4_ICIC)(INT, CAR, INT, CAR);
typedef void (*cmdFun4_ICCI)(INT, CAR, CAR, INT);
typedef void (*cmdFun4_ICCC)(INT, CAR, CAR, CAR);
typedef void (*cmdFun4_CIII)(CAR, INT, INT, INT);
typedef void (*cmdFun4_CIIC)(CAR, INT, INT, CAR);
typedef void (*cmdFun4_CICI)(CAR, INT, CAR, INT);
typedef void (*cmdFun4_CICC)(CAR, INT, CAR, CAR);
typedef void (*cmdFun4_CCII)(CAR, CAR, INT, INT);
typedef void (*cmdFun4_CCIC)(CAR, CAR, INT, CAR);
typedef void (*cmdFun4_CCCI)(CAR, CAR, CAR, INT);
typedef void (*cmdFun4_CCCC)(CAR, CAR, CAR, CAR);
// ===end=== 4个参数 ===end===
// ===strat=== 5个参数 ===strat===
typedef void (*cmdFun5_IIIII)(INT, INT, INT, INT, INT);
typedef void (*cmdFun5_IIIIC)(INT, INT, INT, INT, CAR);
typedef void (*cmdFun5_IIICI)(INT, INT, INT, CAR, INT);
typedef void (*cmdFun5_IIICC)(INT, INT, INT, CAR, CAR);
typedef void (*cmdFun5_IICII)(INT, INT, CAR, INT, INT);
typedef void (*cmdFun5_IICIC)(INT, INT, CAR, INT, CAR);
typedef void (*cmdFun5_IICCI)(INT, INT, CAR, CAR, INT);
typedef void (*cmdFun5_IICCC)(INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_ICIII)(INT, CAR, INT, INT, INT);
typedef void (*cmdFun5_ICIIC)(INT, CAR, INT, INT, CAR);
typedef void (*cmdFun5_ICICI)(INT, CAR, INT, CAR, INT);
typedef void (*cmdFun5_ICICC)(INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_ICCII)(INT, CAR, CAR, INT, INT);
typedef void (*cmdFun5_ICCIC)(INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_ICCCI)(INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_ICCCC)(INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun5_CIIII)(CAR, INT, INT, INT, INT);
typedef void (*cmdFun5_CIIIC)(CAR, INT, INT, INT, CAR);
typedef void (*cmdFun5_CIICI)(CAR, INT, INT, CAR, INT);
typedef void (*cmdFun5_CIICC)(CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun5_CICII)(CAR, INT, CAR, INT, INT);
typedef void (*cmdFun5_CICIC)(CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun5_CICCI)(CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun5_CICCC)(CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun5_CCIII)(CAR, CAR, INT, INT, INT);
typedef void (*cmdFun5_CCIIC)(CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun5_CCICI)(CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun5_CCICC)(CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun5_CCCII)(CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun5_CCCIC)(CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun5_CCCCI)(CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun5_CCCCC)(CAR, CAR, CAR, CAR, CAR);
// ===end=== 5个参数 ===end===
// ===strat=== 6个参数 ===strat===
typedef void (*cmdFun6_IIIIII)(INT, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_IIIIIC)(INT, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_IIIICI)(INT, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_IIIICC)(INT, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_IIICII)(INT, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_IIICIC)(INT, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_IIICCI)(INT, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_IIICCC)(INT, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_IICIII)(INT, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_IICIIC)(INT, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_IICICI)(INT, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_IICICC)(INT, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_IICCII)(INT, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_IICCIC)(INT, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_IICCCI)(INT, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_IICCCC)(INT, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_ICIIII)(INT, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_ICIIIC)(INT, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_ICIICI)(INT, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_ICIICC)(INT, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_ICICII)(INT, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_ICICIC)(INT, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_ICICCI)(INT, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_ICICCC)(INT, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_ICCIII)(INT, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_ICCIIC)(INT, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_ICCICI)(INT, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_ICCICC)(INT, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_ICCCII)(INT, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_ICCCIC)(INT, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_ICCCCI)(INT, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_ICCCCC)(INT, CAR, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_CIIIII)(CAR, INT, INT, INT, INT, INT);
typedef void (*cmdFun6_CIIIIC)(CAR, INT, INT, INT, INT, CAR);
typedef void (*cmdFun6_CIIICI)(CAR, INT, INT, INT, CAR, INT);
typedef void (*cmdFun6_CIIICC)(CAR, INT, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CIICII)(CAR, INT, INT, CAR, INT, INT);
typedef void (*cmdFun6_CIICIC)(CAR, INT, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CIICCI)(CAR, INT, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CIICCC)(CAR, INT, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CICIII)(CAR, INT, CAR, INT, INT, INT);
typedef void (*cmdFun6_CICIIC)(CAR, INT, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CICICI)(CAR, INT, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CICICC)(CAR, INT, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CICCII)(CAR, INT, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CICCIC)(CAR, INT, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CICCCI)(CAR, INT, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CICCCC)(CAR, INT, CAR, CAR, CAR, CAR);
typedef void (*cmdFun6_CCIIII)(CAR, CAR, INT, INT, INT, INT);
typedef void (*cmdFun6_CCIIIC)(CAR, CAR, INT, INT, INT, CAR);
typedef void (*cmdFun6_CCIICI)(CAR, CAR, INT, INT, CAR, INT);
typedef void (*cmdFun6_CCIICC)(CAR, CAR, INT, INT, CAR, CAR);
typedef void (*cmdFun6_CCICII)(CAR, CAR, INT, CAR, INT, INT);
typedef void (*cmdFun6_CCICIC)(CAR, CAR, INT, CAR, INT, CAR);
typedef void (*cmdFun6_CCICCI)(CAR, CAR, INT, CAR, CAR, INT);
typedef void (*cmdFun6_CCICCC)(CAR, CAR, INT, CAR, CAR, CAR);
typedef void (*cmdFun6_CCCIII)(CAR, CAR, CAR, INT, INT, INT);
typedef void (*cmdFun6_CCCIIC)(CAR, CAR, CAR, INT, INT, CAR);
typedef void (*cmdFun6_CCCICI)(CAR, CAR, CAR, INT, CAR, INT);
typedef void (*cmdFun6_CCCICC)(CAR, CAR, CAR, INT, CAR, CAR);
typedef void (*cmdFun6_CCCCII)(CAR, CAR, CAR, CAR, INT, INT);
typedef void (*cmdFun6_CCCCIC)(CAR, CAR, CAR, CAR, INT, CAR);
typedef void (*cmdFun6_CCCCCI)(CAR, CAR, CAR, CAR, CAR, INT);
typedef void (*cmdFun6_CCCCCC)(CAR, CAR, CAR, CAR, CAR, CAR);
// ===end=== 6个参数 ===end===
void cmdRun_arg0(cmdFun cmd);
void cmdRun_arg1(cmdFun cmd, void* argv[]);
void cmdRun_arg2(cmdFun cmd, void* argv[]);
void cmdRun_arg3(cmdFun cmd, void* argv[]);
void cmdRun_arg4(cmdFun cmd, void* argv[]);
void cmdRun_arg5(cmdFun cmd, void* argv[]);
void cmdRun_arg6(cmdFun cmd, void* argv[]);
#endif
cmd.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cmd.h"
/**
* @brief : 无参数的命令调用
* @param : cmd 函数指针
*/
void cmdRun_arg0(cmdFun cmd)
{
cmdFun0 fun = (cmdFun0)cmd;
fun();
}
/**
* @brief : 通过是否被字符"包裹的来判断字符串是否是数值
* @param : str
* @return : 0-是数值,1-是字符串
*/
int str_if_string(const char* str)
{
size_t len = strlen(str);
if (len >= 2 && str[0] == '"' && str[len - 1] == '"')
{
return 1; // 是字符串
}
return 0; // 是数值
}
/**
* @brief : 1个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg1(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
cmdFun1_I fun = (cmdFun1_I)cmd;
fun(atoi(argv[1]));
}
else
{
cmdFun1_C fun = (cmdFun1_C)cmd;
fun(argv[1]);
}
}
/**
* @brief : 2个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg2(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
cmdFun2_II fun = (cmdFun2_II)cmd;
fun(atoi(argv[1]), atoi(argv[2]));
}
else
{
cmdFun2_IC fun = (cmdFun2_IC)cmd;
fun(atoi(argv[1]), argv[2]);
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
cmdFun2_CI fun = (cmdFun2_CI)cmd;
fun(argv[1], atoi(argv[2]));
}
else
{
cmdFun2_CC fun = (cmdFun2_CC)cmd;
fun(argv[1], argv[2]);
}
}
}
/**
* @brief : 3个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg3(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_III fun = (cmdFun3_III)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
}
else
{
cmdFun3_IIC fun = (cmdFun3_IIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3]);
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_ICI fun = (cmdFun3_ICI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]));
}
else
{
cmdFun3_ICC fun = (cmdFun3_ICC)cmd;
fun(atoi(argv[1]), argv[2], argv[3]);
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_CII fun = (cmdFun3_CII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]));
}
else
{
cmdFun3_CIC fun = (cmdFun3_CIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3]);
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
cmdFun3_CCI fun = (cmdFun3_CCI)cmd;
fun(argv[1], argv[2], atoi(argv[3]));
}
else
{
cmdFun3_CCC fun = (cmdFun3_CCC)cmd;
fun(argv[1], argv[2], argv[3]);
}
}
}
}
/**
* @brief : 4个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg4(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_IIII fun = (cmdFun4_IIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_IIIC fun = (cmdFun4_IIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_IICI fun = (cmdFun4_IICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]));
}
else
{
cmdFun4_IICC fun = (cmdFun4_IICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4]);
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_ICII fun = (cmdFun4_ICII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_ICIC fun = (cmdFun4_ICIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_ICCI fun = (cmdFun4_ICCI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]));
}
else
{
cmdFun4_ICCC fun = (cmdFun4_ICCC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4]);
}
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CIII fun = (cmdFun4_CIII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_CIIC fun = (cmdFun4_CIIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CICI fun = (cmdFun4_CICI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]));
}
else
{
cmdFun4_CICC fun = (cmdFun4_CICC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4]);
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CCII fun = (cmdFun4_CCII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]));
}
else
{
cmdFun4_CCIC fun = (cmdFun4_CCIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4]);
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
cmdFun4_CCCI fun = (cmdFun4_CCCI)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]));
}
else
{
cmdFun4_CCCC fun = (cmdFun4_CCCC)cmd;
fun(argv[1], argv[2], argv[3], argv[4]);
}
}
}
}
}
/**
* @brief : 5个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg5(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IIIII fun = (cmdFun5_IIIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_IIIIC fun = (cmdFun5_IIIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IIICI fun = (cmdFun5_IIICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_IIICC fun = (cmdFun5_IIICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IICII fun = (cmdFun5_IICII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_IICIC fun = (cmdFun5_IICIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_IICCI fun = (cmdFun5_IICCI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_IICCC fun = (cmdFun5_IICCC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5]);
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICIII fun = (cmdFun5_ICIII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_ICIIC fun = (cmdFun5_ICIIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICICI fun = (cmdFun5_ICICI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_ICICC fun = (cmdFun5_ICICC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICCII fun = (cmdFun5_ICCII)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_ICCIC fun = (cmdFun5_ICCIC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_ICCCI fun = (cmdFun5_ICCCI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_ICCCC fun = (cmdFun5_ICCCC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5]);
}
}
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CIIII fun = (cmdFun5_CIIII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CIIIC fun = (cmdFun5_CIIIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CIICI fun = (cmdFun5_CIICI)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CIICC fun = (cmdFun5_CIICC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CICII fun = (cmdFun5_CICII)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CICIC fun = (cmdFun5_CICIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CICCI fun = (cmdFun5_CICCI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CICCC fun = (cmdFun5_CICCC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5]);
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCIII fun = (cmdFun5_CCIII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CCIIC fun = (cmdFun5_CCIIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCICI fun = (cmdFun5_CCICI)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CCICC fun = (cmdFun5_CCICC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5]);
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCCII fun = (cmdFun5_CCCII)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]));
}
else
{
cmdFun5_CCCIC fun = (cmdFun5_CCCIC)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5]);
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
cmdFun5_CCCCI fun = (cmdFun5_CCCCI)cmd;
fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]));
}
else
{
cmdFun5_CCCCC fun = (cmdFun5_CCCCC)cmd;
fun(argv[1], argv[2], argv[3], argv[4], argv[5]);
}
}
}
}
}
}
/**
* @brief : 6个参数的命令调用
* @param : cmd 函数指针
* @param : argv argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
*/
void cmdRun_arg6(cmdFun cmd, void* argv[])
{
if (str_if_string(argv[1]) == 0)
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIIIII fun = (cmdFun6_IIIIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IIIIIC fun = (cmdFun6_IIIIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIIICI fun = (cmdFun6_IIIICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IIIICC fun = (cmdFun6_IIIICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIICII fun = (cmdFun6_IIICII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IIICIC fun = (cmdFun6_IIICIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IIICCI fun = (cmdFun6_IIICCI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IIICCC fun = (cmdFun6_IIICCC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICIII fun = (cmdFun6_IICIII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IICIIC fun = (cmdFun6_IICIIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICICI fun = (cmdFun6_IICICI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IICICC fun = (cmdFun6_IICICC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICCII fun = (cmdFun6_IICCII)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_IICCIC fun = (cmdFun6_IICCIC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_IICCCI fun = (cmdFun6_IICCCI)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_IICCCC fun = (cmdFun6_IICCCC)cmd;
fun(atoi(argv[1]), atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICIIII fun = (cmdFun6_ICIIII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICIIIC fun = (cmdFun6_ICIIIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICIICI fun = (cmdFun6_ICIICI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICIICC fun = (cmdFun6_ICIICC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICICII fun = (cmdFun6_ICICII)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICICIC fun = (cmdFun6_ICICIC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICICCI fun = (cmdFun6_ICICCI)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICICCC fun = (cmdFun6_ICICCC)cmd;
fun(atoi(argv[1]), argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCIII fun = (cmdFun6_ICCIII)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICCIIC fun = (cmdFun6_ICCIIC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCICI fun = (cmdFun6_ICCICI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICCICC fun = (cmdFun6_ICCICC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCCII fun = (cmdFun6_ICCCII)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_ICCCIC fun = (cmdFun6_ICCCIC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_ICCCCI fun = (cmdFun6_ICCCCI)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_ICCCCC fun = (cmdFun6_ICCCCC)cmd;
fun(atoi(argv[1]), argv[2], argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
}
else
{
if (str_if_string(argv[2]) == 0)
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIIIII fun = (cmdFun6_CIIIII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CIIIIC fun = (cmdFun6_CIIIIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIIICI fun = (cmdFun6_CIIICI)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CIIICC fun = (cmdFun6_CIIICC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIICII fun = (cmdFun6_CIICII)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CIICIC fun = (cmdFun6_CIICIC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CIICCI fun = (cmdFun6_CIICCI)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CIICCC fun = (cmdFun6_CIICCC)cmd;
fun(argv[1], atoi(argv[2]), atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICIII fun = (cmdFun6_CICIII)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CICIIC fun = (cmdFun6_CICIIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICICI fun = (cmdFun6_CICICI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CICICC fun = (cmdFun6_CICICC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICCII fun = (cmdFun6_CICCII)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CICCIC fun = (cmdFun6_CICCIC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CICCCI fun = (cmdFun6_CICCCI)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CICCCC fun = (cmdFun6_CICCCC)cmd;
fun(argv[1], atoi(argv[2]), argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
else
{
if (str_if_string(argv[3]) == 0)
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCIIII fun = (cmdFun6_CCIIII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCIIIC fun = (cmdFun6_CCIIIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCIICI fun = (cmdFun6_CCIICI)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCIICC fun = (cmdFun6_CCIICC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCICII fun = (cmdFun6_CCICII)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCICIC fun = (cmdFun6_CCICIC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCICCI fun = (cmdFun6_CCICCI)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCICCC fun = (cmdFun6_CCICCC)cmd;
fun(argv[1], argv[2], atoi(argv[3]), argv[4], argv[5], argv[6]);
}
}
}
}
else
{
if (str_if_string(argv[4]) == 0)
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCIII fun = (cmdFun6_CCCIII)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCCIIC fun = (cmdFun6_CCCIIC)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCICI fun = (cmdFun6_CCCICI)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCCICC fun = (cmdFun6_CCCICC)cmd;
fun(argv[1], argv[2], argv[3], atoi(argv[4]), argv[5], argv[6]);
}
}
}
else
{
if (str_if_string(argv[5]) == 0)
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCCII fun = (cmdFun6_CCCCII)cmd;
fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), atoi(argv[6]));
}
else
{
cmdFun6_CCCCIC fun = (cmdFun6_CCCCIC)cmd;
fun(argv[1], argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
}
}
else
{
if (str_if_string(argv[6]) == 0)
{
cmdFun6_CCCCCI fun = (cmdFun6_CCCCCI)cmd;
fun(argv[1], argv[2], argv[3], argv[4], argv[5], atoi(argv[6]));
}
else
{
cmdFun6_CCCCCC fun = (cmdFun6_CCCCCC)cmd;
fun(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
}
}
}
}
}
}
}
test.h
#ifndef _MINI_SHELL_TEST_H_
#define _MINI_SHELL_TEST_H_
void registerCmd_test_init();
#endif
test.c
#include "main.h"
void t0()
{
printf("t0:t0\n");
}
void t1_1(int i1)
{
printf("t1:%d\n", i1);
}
void t1_2(char* i1)
{
printf("t1:%s\n", i1);
}
void t2_11(int i1, int i2)
{
printf("t2:%d,%d\n", i1, i2);
}
void t2_21(char* i1, int i2)
{
printf("t2:%s,%d\n", i1, i2);
}
void t2_12(int i1, char* i2)
{
printf("t2:%d,%s\n", i1, i2);
}
void t2_22(char* i1, char* i2)
{
printf("t2:%s,%s\n", i1, i2);
}
void t3_1(int i1, int i2, int i3)
{
printf("t3:%d,%d,%d\n", i1, i2, i3);
}
void t3_2(char* i1, char* i2, char* i3)
{
printf("t3:%s,%s,%s\n", i1, i2, i3);
}
void t4_1(int i1, int i2, int i3, int i4)
{
printf("t4:%d,%d,%d,%d\n", i1, i2, i3, i4);
}
void t4_2(char* i1, char* i2, char* i3, char* i4)
{
printf("t4:%s,%s,%s,%s\n", i1, i2, i3, i4);
}
void t5_1(int i1, int i2, int i3, int i4, int i5)
{
printf("t5:%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5);
}
void t5_2(char* i1, char* i2, char* i3, char* i4, char* i5)
{
printf("t5:%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5);
}
void t6_1(int i1, int i2, int i3, int i4, int i5, int i6)
{
printf("t6:%d,%d,%d,%d,%d,%d\n", i1, i2, i3, i4, i5, i6);
}
void t6_2(char* i1, char* i2, char* i3, char* i4, char* i5, char* i6)
{
printf("t6:%s,%s,%s,%s,%s,%s\n", i1, i2, i3, i4, i5, i6);
}
void registerCmd_test_init()
{
REGISTER_CMD(t0);
REGISTER_CMD(t1_1);
REGISTER_CMD(t1_2);
REGISTER_CMD(t2_11);
REGISTER_CMD(t2_12);
REGISTER_CMD(t2_21);
REGISTER_CMD(t2_22);
REGISTER_CMD(t3_1);
REGISTER_CMD(t3_2);
REGISTER_CMD(t4_1);
REGISTER_CMD(t4_2);
REGISTER_CMD(t5_1);
REGISTER_CMD(t5_2);
REGISTER_CMD(t6_1);
REGISTER_CMD(t6_2);
}
main.h
#ifndef _MINI_SHELL_H_
#define _MINI_SHELL_H_
#include "cmd.h"
#define CMD_ADD_MAX_NUM 200 // 命令最大支持添加条数
#define CMD_NAME_MAX_SIZE 200 // 单个命令名字最大支持长度
void registerCmd(const char* name, cmdFun func);
// 注册函数接口,在这个示例中,宏 REGISTER_CMD(cmd) 使用 #cmd 将命令名转换为字符串,
// 并将命令名和函数指针传递给 registerCmd 函数。这样,你只需传递一个参数即可注册命令。
#define REGISTER_CMD(cmd) registerCmd(#cmd, cmd)
typedef struct
{
char cmdList[CMD_ADD_MAX_NUM][CMD_NAME_MAX_SIZE]; // "命令列表"(字符串)
cmdFun cmdList_funPtr[CMD_ADD_MAX_NUM]; // "命令列表"对应的"函数指针列表"
int cmdList_sum; // "命令列表"中已经注册的命令个数
int cmdList_curIndex; // 当前命令在"命令列表"的索引,初始为0
char curInputCmd[CMD_NAME_MAX_SIZE]; // 当前输入的命令
int curInputIndex; // 已经输入字符的索引,0是第一个字符的索引
int curInputSum; // 已经输入字符的总数
char oldInputCmd[CMD_NAME_MAX_SIZE]; // 上一条输入的命令
} shell_stu;
#endif
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#define KEY_FRONT 224 // 方向键的前导键
#define KEY_UP 72 // 上键
#define KEY_DOWN 80 // 下键
#define KEY_LEFT 75 // 左键
#define KEY_RIGHT 77 // 右键
#define KEY_ENTER 13 // 回车键
#define KEY_BACK 8 // 回退键
#define KEY_TAB 9 // tab键
// 用于清空上次显示在终端上的打印,命令长度不同导致的,比如命令1:test_5555,命令2:test_2,
// 上下键由命令1切换到命令2,终端就会打印test_2555.这个就是用空格再次覆盖后面的555
#define SPACE_DISPLAY " "
static shell_stu shell;
static void shell_stu_init()
{
shell.cmdList_sum = 0;
shell.cmdList_curIndex = 0;
memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
shell.curInputIndex = 0;
shell.curInputSum = 0;
memset(shell.oldInputCmd, 0, sizeof(shell.oldInputCmd));
}
/**
* @brief 在指定位置插入一个字符,并打印结果,不修改原字符串。
* 该函数不会修改原字符串,而是构造一个新字符串并打印。
* @param str 目标字符串。
* @param ch 要插入的字符。
* @param pos 插入字符的位置(从 0 开始索引)。
*/
void str_prtInsertChar(const char *str, char ch, int pos)
{
int len = strlen(str);
if (pos < 0 || pos > len)
{
printf("Invalid position.\n");
return;
}
// printf("Result: ");
for (int i = 0; i < len + 1; i++)
{
if (i == pos)
{
putchar(ch);
}
if (i < len)
{
putchar(str[i]);
}
}
// printf("\n");
}
/**
* @brief 在指定位置插入一个字符。
* 该函数会将原有字符向右移动,以腾出空间插入新字符,并确保不会超出缓冲区大小。
* @param str 目标字符串,插入字符后会修改该字符串。
* @param ch 要插入的字符。
* @param pos 插入字符的位置(从 0 开始索引)。
* @param size 字符串的总缓冲区大小(用于防止溢出)。
*/
void str_insertChar(char *str, char ch, int pos, int size)
{
int len = strlen(str);
if (pos < 0 || pos > len || len + 1 >= size)
{
printf("Invalid position or insufficient buffer size.\n");
return;
}
for (int i = len; i >= pos; i--)
{
str[i + 1] = str[i];
}
str[pos] = ch;
}
/**
* @brief 在指定位置删除一个字符。
* 该函数会将后续字符左移以填补被删除字符的位置。
* @param str 目标字符串,删除字符后会修改该字符串。
* @param pos 删除字符的位置(从 0 开始索引)。
*/
void str_deleteChar(char* str, int pos)
{
int len = strlen(str);
if (pos < 0 || pos >= len)
{
printf("Invalid position.\n");
return;
}
for (int i = pos; i < len; i++)
{
str[i] = str[i + 1];
}
}
// 回显命令
static void cmdShow()
{
printf("\r%s\rCMD>>", SPACE_DISPLAY);
str_prtInsertChar(shell.curInputCmd, '_', shell.curInputIndex);
}
// 清空输入的命令
static void curInputCmd_clear()
{
memset(shell.curInputCmd, 0, sizeof(shell.curInputCmd));
shell.curInputIndex = 0;
shell.curInputSum = 0;
}
//命令注册
void registerCmd(const char* name, cmdFun func)
{
if (shell.cmdList_sum < CMD_ADD_MAX_NUM)
{
memset(shell.cmdList[shell.cmdList_sum], 0, CMD_NAME_MAX_SIZE);
strcpy(shell.cmdList[shell.cmdList_sum], name);
shell.cmdList_funPtr[shell.cmdList_sum] = func;
shell.cmdList_sum++;
printf("[CMD INSTALL OK][%02d] %s\n", shell.cmdList_sum, name);
}
else
{
printf("[CMD]table is full,regist failed!fun:%s\n", name);
}
}
// 命令解析和执行
static void cmdRun(char *cmdLine)
{
char *argv[10] = {0}; // 允许最多9个参数,argv[0]是命令名,argv[1]是参数1,argv[2]是参数2,依次类推
int argc = 0;
// 使用 strtok 解析字符串,拆分出命令名和参数
char *token = strtok(cmdLine, " ");
while (token != NULL && argc < 10)
{
argv[argc++] = token;
token = strtok(NULL, " ");
}
// 在命令列表中查找匹配的命令
if (argc > 0 && argv[0] != NULL)
{
// 只有在 argv[0] 非 NULL 时才调用 strcmp
for (int i = 0; i < shell.cmdList_sum; i++)
{
if (strcmp(argv[0], shell.cmdList[i]) == 0)
{
printf("\n正在调用函数: %s\n", argv[0]);
// 动态传递参数给命令函数
// shell.cmdList_funPtr[i](argc, argv); // 传递参数,跳过 argv[0](命令名)
switch (argc)
{
case 1:
{
// 无参数
cmdRun_arg0(shell.cmdList_funPtr[i]);
return;
}
case 2:
{
// 1个参数
cmdRun_arg1(shell.cmdList_funPtr[i], argv);
return;
}
case 3:
{
// 2个参数
cmdRun_arg2(shell.cmdList_funPtr[i], argv);
return;
}
case 4:
{
// 3个参数
cmdRun_arg3(shell.cmdList_funPtr[i], argv);
return;
}
case 5:
{
// 4个参数
cmdRun_arg4(shell.cmdList_funPtr[i], argv);
return;
}
case 6:
{
// 5个参数
cmdRun_arg5(shell.cmdList_funPtr[i], argv);
return;
}
case 7:
{
// 6个参数
cmdRun_arg6(shell.cmdList_funPtr[i], argv);
return;
}
default:
{
printf("\r%s\rCMD>>%s", SPACE_DISPLAY, "参数过多,不支持参数大于6个的命令"); // 回显命令
return;
}
}
}
}
printf("\nSHELL 无此函数:%s\n", cmdLine);
}
}
void logo_show()
{
printf("=======================================================\n");
printf("- - - - - - -\n");
printf(" __ ____ ____ _ _ _____ _ _ \n");
printf(" / \\/ / / ___/ / / / // ____// / / / \n");
printf(" / /\\_// / \\___ \\ / /_/ // _/ / / / / \n");
printf(" / / / / ___) // _ // /___ / /___ / /___ \n");
printf(" /_/ /_/ /____/ /_/ /_//_____//_____//_____/ \n");
printf("- - - - - - -\n");
printf("=======================================================\n");
printf("MINI 交互终端 [mini interface terminal]\n");
printf("-------------------------------------------------------\n");
}
void help(void)
{
printf("本SHELL已注册函数:\n");
for (int i = 0; i < shell.cmdList_sum; i++)
{
printf("[CMD] %s\n", shell.cmdList[i]);
}
}
static void registerCmd_init()
{
// ===========================================================
// 临时测试
// ===========================================================
#if 1 // ===start===临时测试===start===
registerCmd_test_init();
#endif // ===end===临时测试===end===
// ===========================================================
// 功能测试函数:
// src/source/main_loop
// ===========================================================
#if 1 // ===start===功能测试函数===start===
#endif // ===end===功能测试函数===end===
// ===========================================================
// 工具测试函数:
// src/source/tools
// src/test/tools
// ===========================================================
#if 1 // ===start===工具测试函数===start===
#endif // ===end===工具测试函数===end===
// 打印注册命令
REGISTER_CMD(help);
}
int main()
{
logo_show();
shell_stu_init();
registerCmd_init();
cmdShow();
while (1)
{
// 检测按键
int ch = _getch();
// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值
// 1>上下键会从命令列表中回显当cmd_list_crr_index的命令
if (ch == KEY_FRONT)
{
// 特殊按键(如方向键)的前导字节
ch = _getch();
// printf("\r%s\rch>>0d:%d\n", SPACE_DISPLAY, ch); // 调试使用,直接打印当前输入按键对应的键值
if (ch == KEY_UP)
{
// 上键
shell.cmdList_curIndex = (shell.cmdList_curIndex - 1 + shell.cmdList_sum) % shell.cmdList_sum;
strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
shell.curInputIndex = strlen(shell.curInputCmd) - 1;
shell.curInputSum = strlen(shell.curInputCmd);
printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
}
else if (ch == KEY_DOWN)
{
// 下键
shell.cmdList_curIndex = (shell.cmdList_curIndex + 1) % shell.cmdList_sum;
strcpy(shell.curInputCmd, shell.cmdList[shell.cmdList_curIndex]);
shell.curInputIndex = strlen(shell.curInputCmd) - 1;
shell.curInputSum = strlen(shell.curInputCmd);
printf("\r%s\rCMD>>[%d]%s", SPACE_DISPLAY, shell.cmdList_curIndex + 1, shell.curInputCmd); // 回显命令
}
else if (ch == KEY_LEFT)
{
// 左键
if (shell.curInputIndex > 0)
{
shell.curInputIndex--;
cmdShow();
}
}
else if (ch == KEY_RIGHT)
{
// 右键
if (shell.curInputIndex < shell.curInputSum)
{
shell.curInputIndex++;
cmdShow();
}
}
}
// 2>可以回车键可以执行输入的命令,或者回显CMD
else if (ch == KEY_ENTER)
{
// 如果终端有输入字符,并且按了回测,就执行
if (shell.curInputSum > 0)
{
// 备份上条命令
strcpy(shell.oldInputCmd, shell.curInputCmd);
cmdRun(shell.curInputCmd);
curInputCmd_clear();
}
else
{
//这里表示没有任何普通字符输入,但是按了回车,可以起到换行的作用
printf("\nCMD>>"); // 回显命令
}
}
// 3>检查是否是回退键,回退键清除终端上的字符:
else if (ch == KEY_BACK)
{
// 这里表示经过上下键回显完整的cmd字符
if (shell.curInputIndex > 0)
{
str_deleteChar(shell.curInputCmd, shell.curInputIndex - 1);
shell.curInputIndex--;
shell.curInputSum--;
cmdShow();
}
}
// 4>检查是否是tab键,回显上次执行的命令
else if (ch == KEY_TAB)
{
strcpy(shell.curInputCmd, shell.oldInputCmd);
shell.curInputIndex = strlen(shell.curInputCmd);
shell.curInputSum = strlen(shell.curInputCmd);
cmdShow();
}
// 5>普通字符
else
{
str_insertChar(shell.curInputCmd, ch, shell.curInputIndex, sizeof(shell.curInputCmd));
shell.curInputSum++;
shell.curInputIndex++;
cmdShow();
}
}
return 0;
}
运行效果


完结撒花
备注:Linux c 实现shell 传参版(支持最大6个参数),功能和这个实现方式基本一致,只是有些地方需要额外进行处理,后期有时间更新
【<<<宇宙安全声明>>>】
安全声明(Security Disclaimer)
本博客提供的所有代码示例仅用于学习和参考目的,作者不对其适用性、安全性或可靠性作任何保证。在使用本博客提供的代码时,请注意以下事项:
- 风险自负:
本博客的代码可能未经严格测试,仅供技术交流和学习使用。任何人使用这些代码造成的直接或间接损失,作者概不负责。 - 环境适配:
代码可能需要根据具体环境进行适配和修改,请确保在安全的测试环境中运行,避免影响生产系统。 - 安全性:
本博客的代码可能未进行完整的安全审查,可能存在漏洞或安全风险。在生产环境使用前,请务必进行充分的安全测试和代码审计。 - 第三方依赖:
本代码纯c实现,使用C语言基本库即可。 - 版权与责任:
本博客代码完全免费,如有引用请标注来源。 - 法律合规:
任何代码的使用均应遵守当地法律法规,禁止用于非法用途,否则后果自负。
4957

被折叠的 条评论
为什么被折叠?



