闲云控制台(一)控制台命令解析框架
公布闲云控制台连载系列,会不定期增加新功能~
先发一个命令解析的框架
/**************************************************
*******************闲云万能控制台*********************
*********
********* 作者: 闲云野鹤
********* QQ: 836663997
********* QQ群: 116920287 欢迎加入
********* 邮箱: xianyun1230@163.com
********* 博客: blog.csdn.net/xianyun2009
*********
********* 功能会一直更新。
***************************************************/
#define _CRT_SECURE_NO_WARNINGS //vs中关闭安全开发周期(SDL)检測#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <memory.h>
#include <conio.h>/***定义控制台的支持能力***/
#define MAX_CMD 100 //支持命令的最大数目
#define LEN_CMD 50 //命令中名称的最大的长度
#define LEN_ARGU 50 //命令中參数的最大的长度
#define LEN_OBJ 900 //命令中命令对象的最大的长度
#define LEN_SUMMARY 100 //命令简单介绍长度/***用于处理区返回运行状态***/
#define OVER_CMD 5 //命令名称太长
#define OVER_ARGU 6 //命令參数太长
#define OVER_OBJ 7 //命令对象太长/***用于运行区命令返回运行状态***/
#define NO 0 //运行失败
#define OK 1 //运行成功
#define ERR_NOCMD 2 //命令错误
#define ERR_ARGU 3 //參数错误
#define ERR_NOOBJ 4 //对象错误typedef struct //输入命令的结构
{char Cmd_Name[LEN_CMD + 1]; //命令名称char Cmd_Arguments[LEN_ARGU + 1]; //參数列表char Cmd_Object[LEN_OBJ + 1]; //命令对象
}Command, *pCommand;typedef int (*CMD_FUN)(pCommand);typedef struct //命令结构,存放支持的命令
{char Cmd_Name[LEN_CMD]; //命令名称CMD_FUN _Fun; //处理函数char Cmd_Summary[LEN_SUMMARY];
}CMD_ITEM, *pCMD_ITEM;
CMD_ITEM KEEP_CMD[MAX_CMD] = { 0 }; //用于存放注冊命令
unsigned int CUR_CMD_NUM = 0; //当前已注冊命令数目/***********************************
***处理命令***************************进行转换和分发命令****************
************************************/
/***转换命令***/
int Translate_Command(char* _cmd_str, pCommand _cmd)
{memset(_cmd, 0, sizeof(Command)); //_cmd所有置0while ('\0' != *_cmd_str && isspace(*_cmd_str)) //清除命令两端空格类字符++_cmd_str;int _len = strlen(_cmd_str) - 1;while (_len >= 0 && isspace(*(_cmd_str + _len)))*(_cmd_str + _len--) = '\0';//切割命令char* p_str = strchr(_cmd_str, ' ');if (!p_str){if (_len + 1 > LEN_CMD) //命令名称太长return OVER_CMD;strcpy(_cmd->Cmd_Name, _cmd_str); //分离命令名称}else{if (p_str - _cmd_str > LEN_CMD) //命令名称太长return OVER_CMD;strncpy(_cmd->Cmd_Name, _cmd_str, p_str - _cmd_str); //分离命令名称while ('\0' != *p_str && isspace(*p_str))++p_str;if ('-' == *p_str) //检測參数标识'-'{++p_str;char* p_space = strchr(p_str, ' ');if (p_space){if (p_space - p_str > LEN_ARGU) //命令參数太长return OVER_ARGU;strncpy(_cmd->Cmd_Arguments, p_str, p_space - p_str); //分离參数while ('\0' != p_space && isspace(*p_space))++p_space;if (strlen(p_space) > LEN_OBJ) //命令对象太长return OVER_OBJ;strcpy(_cmd->Cmd_Object, p_space); //分离命令对象}else{if (strlen(p_str) > LEN_ARGU) //命令參数太长return OVER_ARGU;strcpy(_cmd->Cmd_Arguments, p_str); //分离參数}}else{if (strlen(p_str) > LEN_OBJ) //命令对象太长return OVER_OBJ;strcpy(_cmd->Cmd_Object, p_str); //分离命令对象}}return OK;
}
/***检验命令是否已注冊并返回指针***/
const pCMD_ITEM Loc_Command(pCommand _cmd)
{unsigned int i;for (i = 0; i < CUR_CMD_NUM; ++i){if (0 == strcmp(_cmd->Cmd_Name, KEEP_CMD[i].Cmd_Name))return &KEEP_CMD[i];}return NULL; //无此命令
}
/***分发命令***/
int Dispatch_Command(pCommand _cmd)
{//printf("Dispatch command:%s<-\targu:%s<-\tobj:%s<-\n", _cmd->Cmd_Name, _cmd->Cmd_Arguments, _cmd->Cmd_Object);const pCMD_ITEM ploc = Loc_Command(_cmd);if (NULL == ploc)return ERR_NOCMD;return ploc->_Fun(_cmd);
}
/****************************************
***命令处理区命令的运行区,对每一个命令进行各自的处理****需不断加入功能****每一个函数格式都应为int NAME(pCommand );NAME为函数名注意:!每一个函数都应返回一个运行状态。状态具体内容见上方'运行区命令返回状态'!
****************************************/
int Hello(pCommand b)
{printf("\t\t欢迎来到闲云万能控制台!\n\t Welcome to xianyun Super Console!\n");return OK;
}
int Help(pCommand b)
{Hello(b);printf("\n");printf(" 命令\t\t简单介绍\n");int i;for (i = 0; i < CUR_CMD_NUM; i++){printf(" %s\t\t%s\n", KEEP_CMD[i].Cmd_Name, KEEP_CMD[i].Cmd_Summary);}printf("\n 命令格式: 命令名称 [-參数] [对象] 比如:help -arv hello 參数和对象可省略\n");printf(" 注意參数中每一个字符都算作一个一个參数,即样例中有三个參数a、r、v\n");return OK;
}/**********************************************
***注冊区每一个命令都应在这里注冊********************每一个在命令处理区定义的命令都应仿照_register_one_cmd("命令名称", 映射函数名称, "功能简单介绍");格式在以下注冊。否则将无法识别注意: 命令名称大写和小写敏感!
***********************************************/ void _register_one_cmd(char* _cmd_name, CMD_FUN _fun, char* _cmd_summary); void Register_Cmd() { _register_one_cmd("hello", Hello, "显示欢迎信息"); _register_one_cmd("help", Help, "显示帮助信息"); } void _register_one_cmd(char* _cmd_name, CMD_FUN _fun, char* _cmd_summary) { strcpy(KEEP_CMD[CUR_CMD_NUM].Cmd_Name, _cmd_name); strcpy(KEEP_CMD[CUR_CMD_NUM].Cmd_Summary, _cmd_summary); KEEP_CMD[CUR_CMD_NUM]._Fun = _fun; ++CUR_CMD_NUM; } /********************************************** ***信息提示区 用于各种错误、返回值的处理和交互 ***********************************************/ void ResultVal_Deal(int re) { switch (re) { case OK: return; case NO: printf("命令未能成功运行,请检測您的指令是否正确!\n"); return; case ERR_NOCMD: printf("命令无法识别!\n"); return; case ERR_ARGU: printf("命令參数错误!\n"); return; case ERR_NOOBJ: printf("命令对象错误!\n"); return; case OVER_CMD: printf("命令名称太长!\n"); return; case OVER_ARGU: printf("命令參数太长!\n"); return; case OVER_OBJ: printf("命令对象太长!
\n"); return; } } int main() { char cmd_str[1024]; int result = 0; Command _cmd; Register_Cmd(); Help(&_cmd); while (1) { printf(">"); gets(cmd_str); result = Translate_Command(cmd_str, &_cmd); ResultVal_Deal(result); if (OK == result) { result = Dispatch_Command(&_cmd); ResultVal_Deal(result); } } return 0; }
转载于:https://www.cnblogs.com/mfmdaoyou/p/6719588.html
闲云控制台(一)控制台命令解析框架相关推荐
- 【Java开发】命令解析框架CommandX
雏形代码结构 主要涉及到命令的分发,解析,数据报文的解析 public abstract class BaseProcessor<T> implements CommandHandler ...
- 解析IOS控制台利用GDB命令查看报错堆栈
解析IOS控制台利用GDB命令查看报错堆栈是本文要介绍的内容,在ios开发中,如果提前释放一个指针的内存,在以后还继续使用这个指针,那么程序会立刻crash掉,而且很难有报错信息,我以前都是靠猜测去判 ...
- RT-Thread FinSH控制台添加自定义msh命令原理
FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息.它可以使用串口 / 以太网 / USB 等与 PC 机进行通信. FinSH 提供了 ...
- 帝国霸业服务器无限加载,帝国霸业银河生存控制台的服务器命令是什么_控制台服务器命令一览_3DM单机...
<帝国霸业:银河生存>中控制台的服务器命令是非常厉害的,很多玩家都不太清楚这些命令到底怎么样,今天小编就给大家带来玩家"星耀灬橙花"分享的控制台服务器命令一览,希望能对 ...
- SylixOS DSP upgrade命令解析
SylixOS DSP upgrade命令解析 --SylixOS DSP6678平台下升级BSP 一.适用范围 本升级方案,针对TI官方评估板(TMDSEVM6678LE),主要介绍如何将Sylix ...
- bat使用命令解析-详细(转)
bat命令解析 目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1.REM 和 :: 2.ECHO 和 @ 3.PAUSE 4.ERRORLEVEL 5.TITLE 6.COLOR 7.mo ...
- java 数学公式解析框架有哪些_开源工具 | 推荐几个Gitee火热Java项目
openEA开源周刊 openEA开源社区的官方运营载体 这里每天给大家呈现有价值的开源资讯,欢迎您的来稿与推荐,点击上方蓝色字,加入我们吧! 摘要:OkHttps 是近期开源的对 OkHttp3 轻 ...
- virsh的详细命令解析
virsh的详细命令解析 virsh 有命令模式和交互模式如果直接在vrish后面添加参数是命令模式,如果直接写virsh,就会进入交互模式 virsh list 列出所有的虚拟机,虚拟机的状态有(8 ...
- 自定义协议的命令解析器
文章目录 前言 Switch...case类型命令解析的弊端 程序的改进目标 对命令解析器的分析 命令解析器的代码示例 用于代码工程需要解决的问题 可用于代码工程的命令解析器实现 一些新的认识 前言 ...
最新文章
- Qt中 QString 和int,double等的转换
- 在Android设备部署PyTorch模型
- 力荐联邦学习系统,据说英伟达Clara“上架”新进展!
- 快速卷积与快速相关——MATLAB
- 【kafka】kafka 判断消费组死掉方案 group dead
- Private Bytes,Working Set,Virtual Size的区别
- H3CNE概念思维导图
- 仿秒拍视频网UI主题模板+Emlog内核开发
- 代码写的太烂了,所以我干不下去了
- 小写金额转为中文大写
- 【图床】图床、PicGo进行图片管理与上传
- 洛阳中考实验计算机分数,2018洛阳中考科目及分值
- 解析JPEG文件的GPS信息
- 电脑录屏软件哪个好用?3款屏幕录制大师分享!
- 2022-2027年中国合成纤维行业市场全景评估及发展战略规划报告
- 人工智能如何实现两难抉择?
- gdpr数据处理_关于GDPR下数据同意的知识
- 商城学习01(踏坑)
- 求数组中满足要求的元素和
- jquery日历插件,可自定义日期内容