MENU可重用的子系统
来源:互联网 发布:ic layout软件 编辑:程序博客网 时间:2024/04/29 12:08
/**************************************************************************************************//* Copyright (C) mc2lab.com, SSE@USTC, 2014-2015 *//* *//* FILE NAME : menu.h *//* PRINCIPAL AUTHOR : Ls *//* SUBSYSTEM NAME : menu *//* MODULE NAME : menu *//* LANGUAGE : C *//* TARGET ENVIRONMENT : ANY *//* DATE OF FIRST RELEASE : 2014/08/31 *//* DESCRIPTION : This is a menu program *//**************************************************************************************************//* * Revision log: * * Created by Ls, 2015/01/18 * */#ifndef MENU_H#define MENU_H /* add cmd to menu */int MenuConfig(char * cmd, char * desc, int (*handler)());/* Menu Engine Execute */int ExecuteMenu();#endif //MENU_H
/**************************************************************************************************//* Copyright (C) mc2lab.com, SSE@USTC, 2014-2015 *//* *//* FILE NAME : menu.c *//* PRINCIPAL AUTHOR : Ls *//* SUBSYSTEM NAME : menu *//* MODULE NAME : menu *//* LANGUAGE : C *//* TARGET ENVIRONMENT : ANY *//* DATE OF FIRST RELEASE : 2014/08/31 *//* DESCRIPTION : This is a menu program *//**************************************************************************************************//* * Revision log: * * Created by Ls, 2015/01/18 * */#include <stdio.h>#include <stdlib.h>#include "linktable.h"#include "menu.h"tLinkTable * head = NULL;int Help(int argc, char *argv[]);#define CMD_MAX_LEN 1024#define CMD_MAX_ARGV_NUM 32#define DESC_LEN 1024#define CMD_NUM 10/* data struct and its operations */typedef struct DataNode{ tLinkTableNode * pNext; char* cmd; char* desc; int (*handler)(int argc, char *argv[]);} tDataNode;int SearchCondition(tLinkTableNode * pLinkTableNode, void * args){ char * cmd = (char*) args; tDataNode * pNode = (tDataNode *)pLinkTableNode; if(strcmp(pNode->cmd, cmd) == 0) { return SUCCESS; } return FAILURE; }/* find a cmd in the linklist and return the datanode pointer */tDataNode* FindCmd(tLinkTable * head, char * cmd){ return (tDataNode*)SearchLinkTableNode(head,SearchCondition, (void *) cmd);}/* show all cmd in listlist */int ShowAllCmd(tLinkTable * head){ tDataNode * pNode = (tDataNode*)GetLinkTableHead(head); while(pNode != NULL) { printf("%s - %s\n", pNode->cmd, pNode->desc); pNode = (tDataNode*)GetNextLinkTableNode(head,(tLinkTableNode *)pNode); } return 0;}/* add cmd to menu */int MenuConfig(char * cmd, char *desc, int (*handler)(int argc, char *argv[])){ tDataNode * pNode = NULL; if (head == NULL) { head = CreateLinkTable(); pNode = (tDataNode *)malloc(sizeof(tDataNode));pNode->cmd = "help"; pNode->desc = "Menu List";pNode->handler = Help;AddLinkTableNode(head, (tLinkTableNode *)pNode); } pNode = (tDataNode *)malloc(sizeof(tDataNode)); pNode->cmd = cmd; pNode->desc = desc; pNode->handler = handler; AddLinkTableNode(head, (tLinkTableNode *)pNode); return 0;}/* Menu Engine Execute */int ExecuteMenu(){ /* cmd line begins */ while(1) { int argc = 0; char *argv[CMD_MAX_ARGV_NUM]; char cmd[CMD_MAX_LEN]; char *pcmd = NULL; printf("Input a cmd > "); //scanf("%s", cmd); pcmd = fgets(cmd, CMD_MAX_LEN, stdin); if(pcmd == NULL) { continue; } /* convert cmd to argc/argv */// printf("%s\n", pcmd); pcmd = strtok(pcmd, " "); while(pcmd != NULL && argc < CMD_MAX_ARGV_NUM) { argv[argc++] = pcmd;// printf("%s\n", pcmd); pcmd = strtok(NULL, " "); }// if(argc == 1)// { int len = strlen(argv[argc-1]); *(argv[argc-1] + len - 1) = '\0';// } tDataNode *p = FindCmd(head, argv[0]); if( p == NULL) { printf("This is a wrong cmd!\n "); continue; } printf("%s - %s\n", p->cmd, p->desc); if(p->handler != NULL) { p->handler(argc, argv); } } return 0;}int Help(int argc, char *argv[]){ ShowAllCmd(head); return 0; }
## # Makefile for Menu Program#CC_PTHREAD_FLAGS= -lpthreadCC_FLAGS= -cCC_OUTPUT_FLAGS= -oCC= gccRM= rmRM_FLAGS= -fTARGET= testOBJS= linktable.o menu.o test.oall:$(OBJS)$(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS).c.o:$(CC) $(CC_FLAGS) $<clean:$(RM) $(RM_FLAGS) $(OBJS) $(TARGET) *.bakgcc linktable.c menu.c test.c -o menu
0 0
- MENU可重用的子系统
- 将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 将menu设计为可重用的子系统
- 将menu设计为可重用的子系统
- 实验7 将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 实验七:将menu设计为可重用的子系统
- 子系统的可重用设计
- 实验报告七:将menu设计为可重用的子系统
- 高级软件工程实验7-----将menu设计为可重用的子系统
- [leetcode]Evaluate Reverse Polish Notation题解
- java中模拟c/c++中unsigned
- cursor
- (cocos2dx) 一、 环境搭建
- PHP笔记
- MENU可重用的子系统
- Java类中的equals方法和hashCode方法
- php的continue使用简单案例
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况
- Hashtable和HashMap和Map和List和Set的区别?
- php常用函数详解
- linux 学习笔记入门(1)
- 草根创业前夕(一)开篇
- php __FUNCTION__ __METHOD__ 区别