/**************************************************************************************************/
/* Copyright (C) LS, 2014-2015 */
/* FILE NAME : linktable.h */
/* PRINCIPAL AUTHOR : ls */
/* SUBSYSTEM NAME : menu */
/* MODULE NAME : linktalbe */
/* LANGUAGE : C */
/* TAGRGET ENVIRONMENT : ANY */
/* DATE OF FIRST RELEASE : 2014/12/28 */
/* DESCRIPTION : interface of Link Table */
/**************************************************************************************************/
/*
* Revision log:
*
* Created by ls, 2014/12/28
*
*/
#ifndef _LINK_TABLE_H_
#define _LINK_TABLE_H_
#define SUCCESS 0
#define FAILURE (-1)
#include <stdio.h>
#include <stdlib.h>
/*
* LinkTable Node Type
*/
typedef struct LinkTableNode
{
struct LinkTableNode *pNext;
}tLinkTableNode;
/*
* LinkTable Type
*/
typedef struct LinkTable
{
tLinkTableNode *pHead;
tLinkTableNode *pTail;
int SumOfNode;
}tLinkTable;
/*
* Create a LinkTable
*/
tLinkTable * CreateLinkTable();
/*
* Delete a LinkTalbe
*/
int DeleteLinkTable(tLinkTable *pLinkTable);
/*
* Add a LinkTableNode to LinkTable
*/
int AddLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode);
/*
* Delete a LinkTableNode from LinkTable
*/
int DelLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode);
/*
* Get LinkTableHead
*/
tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable);
/*
* Get next LinkTableNode
*/
tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode);
#endif /* _LINK_TABLE_H_ */
/**************************************************************************************************/
/* Copyright (C) LS, 2014-2015 */
/* FILE NAME : linktable.c */
/* PRINCIPAL AUTHOR : ls */
/* SUBSYSTEM NAME : menu */
/* MODULE NAME : linktalbe */
/* LANGUAGE : C */
/* TAGRGET ENVIRONMENT : ANY */
/* DATE OF FIRST RELEASE : 2014/12/28 */
/* DESCRIPTION : interface of Link Table */
/**************************************************************************************************/
/*
* Revision log:
*
* Created by ls, 2014/12/28
*
*/
#include "linktable.h"
/*
* Create a LinkTable
*/
tLinkTable * CreateLinkTable()
{
tLinkTable *pTable = (tLinkTable*)malloc(sizeof(tLinkTable));
pTable->pHead = NULL;
pTable->pTail = NULL;
pTable->SumOfNode = 0;
return pTable;
}
/*
* Delete a LinkTable
*/
int DeleteLinkTable(tLinkTable *pLinkTable)
{
free(pLinkTable);
return 0;
}
/*
* Add LinkTableNode to LinkTable
*/
int AddLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode)
{
if (pLinkTable == NULL)
{
printf("The table is empty and cannot add this node!\n");
exit(0);
}
if (pNode == NULL)
{
printf("The node is empty and cannot add this node!\n");
return 0;
}
if (pLinkTable->pHead == NULL)
{
pLinkTable->pHead = pNode;
pLinkTable->pTail = pNode;
pLinkTable->SumOfNode = 1;
}else
{
pLinkTable->pTail->pNext = pNode;
pLinkTable->pTail = pNode;
pLinkTable->SumOfNode++;
}
return 0;
}
/*
* Delete a LinkTableNode from LinkTable
*/
int DelLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode)
{
/* if (pLinkTable == NULL)
{
printf("The table is empty and cannot delete this node!\n");
exit(0);
}
if (pNode == NULL)
{
printf("The node is empty and cannot delete this node!\n");
return 0;
}
tLinkTableNode *p = pLinkTable->pHead;
while */
}
/*
* Get LinkTableHead
*/
tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable)
{
if (pLinkTable == NULL)
{
printf("The table is empty!\n");
exit(0);
}
return pLinkTable->pHead;
}
/*
* Get Next LinkTableNode
*/
tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode)
{
if (pLinkTable == NULL)
{
printf("The table is empty!\n");
exit(0);
}
if (pNode == NULL)
{
printf("The node is empty and cannot get next node!\n");
exit(0);
}
return pNode->pNext;
}
/**************************************************************************************************/
/* Copyright (C) LS, 2014-2015 */
/* FILE NAME : linklist.h */
/* PRINCIPAL AUTHOR : ls */
/* SUBSYSTEM NAME : menu */
/* MODULE NAME : linklist */
/* LANGUAGE : C */
/* TAGRGET ENVIRONMENT : ANY */
/* DATE OF FIRST RELEASE : 2014/12/21 */
/* DESCRIPTION : linklist for menu progrom */
/**************************************************************************************************/
/*
* Revision log:
*
* Created by ls, 2014/12/28
*
*/
#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_
#include "linktable.h"
/* data struct and its operations */
typedef struct DataNode
{
tLinkTableNode *pNext;
char* cmd;
char* desc;
int (*handler)();
} tDataNode;
/* find a cmd in the linklist and return the data node pointer */
tDataNode * FindCmd(tLinkTable *head, char *cmd);
/* show all cmd in linklist */
int ShowAllCmd(tLinkTable *head);
#endif /*_Link_LIST_H_*/
/**************************************************************************************************/
/* Copyright (C) LS, 2014-2015 */
/* FILE NAME : linklist.c */
/* PRINCIPAL AUTHOR : LISUN */
/* SUBSYSTEM NAME : menu */
/* MODULE NAME : linklist */
/* LANGUAGE : C */
/* TAGRGET ENVIRONMENT : ANY */
/* DATE OF FIRST RELEASE : 2014/12/21 */
/* DESCRIPTION : linklist for the menu progrom */
/**************************************************************************************************/
/*
* Revision log:
*
* Created by ls, 2014/12/28
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
tDataNode* FindCmd(tLinkTable * head, char* cmd)
{
if (head == NULL || cmd == NULL)
{
return NULL;
}
tDataNode *p = (tDataNode*)GetLinkTableHead(head);
while (p != NULL)
{
if (strcmp(p->cmd, cmd) == 0)
{
return p;
}
p = (tDataNode*)GetNextLinkTableNode(head, (tLinkTableNode*)p);
}
return NULL;
}
/* Show all the cmd in Listlist */
int ShowAllCmd(tLinkTable * head)
{
printf("Menu List:\n");
tDataNode *p = (tDataNode*)GetLinkTableHead(head);
while (p != NULL)
{
printf("%s - %s\n", p->cmd, p->desc);
p = (tDataNode*)GetNextLinkTableNode(head, (tLinkTableNode*)p);
}
return 0;
}
/**************************************************************************************************/
/* Copyright (C) LS, 2014-2015 */
/* FILE NAME : menu.c */
/* PRINCIPAL AUTHOR : ls */
/* SUBSYSTEM NAME : menu */
/* MODULE NAME : menu */
/* LANGUAGE : C */
/* TAGRGET ENVIRONMENT : ANY */
/* DATE OF FIRST RELEASE : 2014/12/21 */
/* DESCRIPTION : This is a menu progrom */
/**************************************************************************************************/
/*
* Revision log:
*
* Created by ls, 2014/12/28
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
#include "linktable.h"
int Help();
int Quit();
#define CMD_MAX_LEN 128
#define DESC_LEN 1024
#define CMD_NUM 10
int InitMenuData(tLinkTable ** ppLinkTable)
{
*ppLinkTable = CreateLinkTable();
tDataNode * pNode = (tDataNode*)malloc(sizeof(tDataNode));
pNode->cmd = "help";
pNode->desc = "Menu List:";
pNode->handler = Help;
AddLinkTableNode(*ppLinkTable, (tLinkTableNode*)pNode);
pNode = (tDataNode*)(tDataNode*)malloc(sizeof(tDataNode));
pNode->cmd = "version";
pNode->desc = "Menu Program V1.0";
pNode->handler = NULL;
AddLinkTableNode(*ppLinkTable, (tLinkTableNode*)pNode);
pNode = (tDataNode*)malloc(sizeof(tDataNode));
pNode->cmd = "quit";
pNode->desc = "Quit from Menu Program V1.0";
pNode->handler = Quit;
AddLinkTableNode(*ppLinkTable, (tLinkTableNode*)pNode);
return 0;
}
tLinkTable * head = NULL;
int main ()
{
InitMenuData(&head);
/* cmd line begins */
while (1)
{
char cmd[CMD_MAX_LEN];
printf("Input a cmd number > ");
scanf("%s", cmd);
tDataNode *p = FindCmd(head, cmd);
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();
}
}
}
int Help()
{
ShowAllCmd(head);
}
int Quit()
{
exit(0);
}