/* user_interface.h */
#ifndef __USERINTERFACE__H__
#define __USERINTERFACE__H__
/**********public definition**********/
//打印提示符
#define PROMPT {printf("/r/033[K/033[32m[command]:");fflush(stdout);}
/**********type definition**********/
typedef void (*FUNC)(int argc, char *argv[]);
typedef struct {
char *cmd_name; //命令字符串
FUNC func_tret; //命令执行
}CMD_STRUCT;
/**********funtion announce**********/
//命令处理
int cmd_treat(char *);
/*======================================
// 执行命令列表
========================================*/
void say_cmd(int argc, char *argv[]); //聊天命令
void list_cmd(int argc, char *argv[]); //列表命令
void help_cmd(int argc, char *argv[]); //帮助命令
void cls_cmd(int argc, char *argv[]); //清屏命令
void exit_cmd(int argc, char *argv[]); //退出命令
#endif//__USERINTERFACE__H__
/* user_interface.c */
/**********include contain**********/
#include"user_interface.h"
/**********standard contain**********/
#include<stdio.h>//printf(),
#include<stdlib.h>//exit(), atoi(), malloc(), free(),
#include<string.h>//strlen(), strcpy(), strchr(), strtok(),
/**********debug action**********/
#define DEBUG//测试
#ifdef DEBUG
#define debug(x...) {printf("/r/033[K");printf(x);fflush(stdout);}
#else
#define debug(x...)
#endif
/**********global announce**********/
//命令结构数组:用来保存 命令名 和 处理函数名
CMD_STRUCT cmd_list[]={
{"say", say_cmd}, //聊天命令
{"sendto", say_cmd}, //聊天命令
{"ls", list_cmd}, //列表命令
{"list", list_cmd}, //列表命令
{"help", help_cmd}, //帮助命令
{"cls", cls_cmd}, //清屏命令
{"clear", cls_cmd}, //清屏命令
{"exit", exit_cmd}, //退出
{"quit", exit_cmd}, //退出
};
//帮助菜单
char *help= "********************************************/n"/
"* say/sendto : 聊天命令 */n"/
"* ls/list : 列表命令 */n"/
"* help : 帮助命令 */n"/
"* cls/clear : 清屏命令 */n"/
"* exit/quit : 退出命令 */n"/
"********************************************/n";
/**********function achieve**********/
//命令处理
int cmd_treat(char *cmd_buf)
{
char *argv[10] = {NULL};
int argc = 0;
int i = 0;
//命令串为空则退出
if (strlen(cmd_buf) == 0) {
return 0;
}
//用空格和制表符切割命令字符串
/***注意:此种方法受限于 *argv[] 的初始化, 必须确保此指针数组默认全NULL***/
argv[argc] = cmd_buf;//命令缓存存入第一参数指针
while ((argv[argc] = strtok(argv[argc], " /t")) != NULL) {//将命令缓存依次切割并存入参数指针
debug("argv[%d]:%s/n", argc, argv[argc]);
argc++;
}
//查找执行命令
for (i=0; i<(sizeof(cmd_list)/sizeof(CMD_STRUCT)); i++) {
//查找命令
if (strcmp(cmd_list[i].cmd_name, argv[0]) == 0) {
//执行命令
cmd_list[i].func_tret(argc, argv);
return 1;
}
}
return -1;
}
/*======================================
// 执行命令列表
========================================*/
//聊天命令
void say_cmd(int argc, char *argv[])
{
debug("say_cmd/n");
}
//列表命令
void list_cmd(int argc, char *argv[])
{
debug("list_cmd/n");
}
// 帮助命令
void help_cmd(int argc, char *argv[])
{
//打印帮助菜单
printf("%s", help);
}
//清屏命令
void cls_cmd(int argc, char *argv[])
{
debug("cls_cmd/n");
printf("/033[2J/033[0;0H");
}
//退出命令
void exit_cmd(int argc, char *argv[])
{
debug("exit_cmd/n");
exit(0);
}