⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menulib.c

📁 用C语言实现的字符型的菜单界面
💻 C
📖 第 1 页 / 共 3 页
字号:
/*----------------------------------------------------------------------------* * 功    能: 菜单库文件.                                                      * * 版    本: 2.00                                                             * * 运行环境: SCO UNIX V3.2.4 以上版本.                                        * * 历史记录: 日      期	作  者	备    注                                      * *----------------------------------------------------------------------------* *           1999/10/20	赖正兴	创建                                          * *           1999/12/22	赖正兴	完成第一版                                    * *           2000/01/22	赖正兴	完成第二版                                    * *----------------------------------------------------------------------------* * All rights reserved. Copyright (C) 1999-20001.                             * *----------------------------------------------------------------------------*/#include "menulib.h"/* * External function define. */extern window_t *create_window(uchar sy,uchar sx,uchar row,uchar col,chtype tattr,chtype battr,chtype style);char MenuTitle[128];char DefaultMsg[128];/*  * Local constant define. */typedef struct {	int code;	char eng_msg[30];	char chn_msg[20];} error_code_t;const error_code_t error_code[]={	{ERR_OPEN_FILE,"Don't open file","打开文件错误"},	{ERR_READ_FILE,"Read file failure","读文件错误"},	{ERR_FORMAT,"Menu file's format error","菜单文件格式错误"},	{ERR_MEMORY,"Memory not enough or error","内存不够"},	{ERR_LEVEL,"Exceed max level","超过最大层数"},	{ERR_NO_SYMBOL,"No the symbol","无此符号"},	{ERR_NO_KEYWORD,"No the keyword","无此关键字"},	{ERR_CREATE_WINDOW,"Create window failure","创建窗口失败"},	{ERR_CREATE_MENU,"Create menu failure","创建菜单失败"},	{0,"No error code","无此错误代码"} /* always at last */};typedef struct {	char name[50];	long value;} menu_symbol_t;const menu_symbol_t menu_symbol[]={	{"BEGIN",KEYWORD_BEGIN},	{"END",KEYWORD_END},	{"POPUP",KEYWORD_POPUP},	{"MENUITEM",KEYWORD_MENUITEM},	{"WINDOWSTYLE",KEYWORD_WINDOWSTYLE},	{"WINDOW_CHINESE",WINDOW_CHINESE},	{"WINDOW_ENGLISH",WINDOW_ENGLISH},	{"WINDOW_SHADE",WINDOW_SHADE},	{"MENUATTR",KEYWORD_MENUATTR},	{"MENUTITLE",KEYWORD_MENUTITLE},	{"MENUCOPYRIGHT",KEYWORD_MENUCOPYRIGHT},	{"MENUSTYLE",KEYWORD_MENUSTYLE},	{"MENUPROMPT",KEYWORD_MENUPROMPT},	{"MENU_POPUP",MENU_POPUP},	{"MENU_PULLDOWN",MENU_PULLDOWN},	{"MENU_SITE_RIGHT",MENU_SITE_RIGHT},	{"MENU_SITE_CENTER",MENU_SITE_CENTER},	{"MENU_SITE_LEFT",MENU_SITE_LEFT},	{"MENU_ACCEPT_RIGHT",MENU_ACCEPT_RIGHT},	{"MENU_ACCEPT_NUMBER",MENU_ACCEPT_NUMBER},	{"MENU_DISP_NUMBER",MENU_DISP_NUMBER},	{"MENU_DIRECT_ACCEPT",MENU_DIRECT_ACCEPT},	{"MENU_RETURN_ID",MENU_RETURN_ID},	{"MENU_EXEC_FUNC",MENU_EXEC_FUNC},	{"MENU_EXEC_PROC",MENU_EXEC_PROC},	{"MENU_BOX",MENU_BOX},	{"MENUCOLOR",KEYWORD_MENUCOLOR},	{"BLACK",BLACK},	{"RED",RED},	{"GREEN",GREEN},	{"BROWN",BROWN},	{"BLUE",BLUE},	{"MAGENTA",MAGENTA},	{"CYAN",CYAN},	{"WHITE",WHITE},	{"GRAY",GRAY},	{"LT_RED",LT_RED},	{"LT_GREEN",LT_GREEN},	{"YELLOW",YELLOW},	{"LT_BLUE",LT_BLUE},	{"LT_MAGENTA",LT_MAGENTA},	{"LT_CYAN",LT_CYAN},	{"HI_WHITE",HI_WHITE},	{"GRAYED",MF_GRAYED},	{"CHECKED",MF_CHECKED},	{"ENABLED",MF_ENABLED},	{"UNCHECKED",MF_UNCHECKED},	{"EEE",-1}};/* * Local variables define. */static menuhead_t menuhead;static uchar title_sy=0,title_sx=0;static uchar copyright_sy=0,copyright_sx=0,copyright_row=0,copyright_col=0;/* * Local function decleare. */int get_menuhandle(menu_t *menu,uchar index);int get_menuitem(char *str,char *menutext);int in_symbol_table(char *str);int get_id(char *str);/*----------------------------------------------------------------------------* * Function: 初始化菜单. * Argument:  *           char *menufile - 菜单数据文件. * Return  :  *           >= 0 成功. *           <  0 失败. *----------------------------------------------------------------------------*/int menu_init(char *menufile){	int  ret=0,i,level,prev_keyword,curr_keyword,item_num,item_len,flag;	char buf[1024],color_buf[128],str[512];	uchar index[MAX_MENU_LEVEL];	chtype fcol,bcol;	menu_t *ptr[MAX_MENU_LEVEL],*newptr;	menuitem_t *item_newptr;	FILE *fp;	/*	 * Set default values.	 */	memset(&menuhead,'\0',sizeof(menuhead));	memset(MenuTitle,'\0',sizeof(MenuTitle));	memset(DefaultMsg,'\0',sizeof(DefaultMsg));	screen.mstyle = MENU_PULLDOWN|MENU_SITE_RIGHT|MENU_ACCEPT_NUMBER;	menuhead.status = 0;	menuhead.sy = 0;	menuhead.sx = 0;	menuhead.interval = 2;	if( screen.mstyle & MENU_POPUP )	{		menuhead.sy = 1;	}	if( (fp=fopen(menufile,"rt")) == NULL )	{		return ERR_OPEN_FILE;	}	if( !fgets(buf,128,fp) )	{		fclose(fp);		return ERR_READ_FILE;	}	if( buf[strlen(buf)-1] == '\x0a' )		buf[strlen(buf)-1] = '\0';	ltrim(buf);	rtrim(buf);	if( memcmp(buf,"IDR_MAINFRAME MENU PRELOAD DISCARDABLE",38) )	{		fclose(fp);		return ERR_FORMAT;	}			/*-----------------------------------------------------------------------*/	while(1)	{		if( !fgets(buf,128,fp) )		{			fclose(fp);			return ERR_READ_FILE;		}		if( buf[strlen(buf)-1] == '\x0a' )			buf[strlen(buf)-1] = '\0';		ltrim(buf);		rtrim(buf);		if( buf[0] == '#' )		{			continue;		}		curr_keyword=get_keyword(buf);		if( curr_keyword == KEYWORD_WINDOWSTYLE )		{			strcpy(buf,get_item(buf,' ',1));			item_num = get_item_num(buf,',');			screen.wstyle = 0;			if( item_num == 0 )			{				if( in_symbol_table(buf) >= 0 )					screen.wstyle |= in_symbol_table(buf);				else				{					fclose(fp);					return ERR_NO_SYMBOL;				}			}			else			for(i=0;i<item_num;i++)			{				if( in_symbol_table(get_item(buf,',',i)) >= 0 )					screen.wstyle |= in_symbol_table(get_item(buf,',',i));				else				{					fclose(fp);					return ERR_NO_SYMBOL;				}			}		}		else if( curr_keyword == KEYWORD_MENUATTR )		{			strcpy(buf,get_item(buf,' ',1));			item_num = get_item_num(buf,',');			if( item_num == 0 )			{				fclose(fp);				return ERR_FORMAT;			}			for(i=0;i<item_num;i++)			{				switch(i)				{				case 0:					menuhead.sy = atoi(get_item(buf,',',i));					break;				case 1:					menuhead.sx = atoi(get_item(buf,',',i));					break;				case 2:					menuhead.interval = atoi(get_item(buf,',',i));					break;				case 3:					menuhead.status = atoi(get_item(buf,',',i));					break;				case 4:					if( not_color == 1 )						break;					not_color = atoi(get_item(buf,',',i));					if( not_color == 0 )						not_color = 1;					else						not_color = 0;					break;				default:					break;				}			}		}		else if( curr_keyword == KEYWORD_MENUPROMPT )		{			strcpy(str,get_item(buf,' ',1));			strcpy(color_buf,get_item(str,',',0));			if( in_symbol_table(color_buf) < 0 )			{				fclose(fp);				return ERR_NO_SYMBOL;			}			fcol = in_symbol_table(color_buf);			strcpy(color_buf,get_item(str,',',1));			if( in_symbol_table(color_buf) < 0 )			{				fclose(fp);				return ERR_NO_SYMBOL;			}			bcol = in_symbol_table(color_buf);			screen.prompt = COL(fcol,bcol);			strcpy(buf,get_item(buf,'"',1));			strcpy(DefaultMsg,buf);		}		else if( curr_keyword == KEYWORD_MENUTITLE )		{			strcpy(str,get_item(buf,' ',1));			title_sy = atoi(get_item(str,',',0));			title_sx = atoi(get_item(str,',',1));			strcpy(color_buf,get_item(buf,',',2));			if( in_symbol_table(color_buf) < 0 )			{				fclose(fp);				return ERR_NO_SYMBOL;			}			fcol = in_symbol_table(color_buf);			strcpy(color_buf,get_item(buf,',',3));			if( in_symbol_table(color_buf) < 0 )			{				fclose(fp);				return ERR_NO_SYMBOL;			}			bcol = in_symbol_table(color_buf);			screen.title = COL(fcol,bcol);			strcpy(buf,get_item(buf,'"',1));			strcpy(MenuTitle,buf);		}		else if( curr_keyword == KEYWORD_MENUCOPYRIGHT )		{			strcpy(str,get_item(buf,' ',1));			menuhead.disp_copyright_flag = atoi(get_item(str,',',0));			if( get_item_num(buf,'"') == 2 )				flag = 0;			else				flag = 1;			strcpy(buf,get_item(buf,'"',1));			item_len = strlen(buf)+2;			if( (menuhead.copyright = (char *)malloc(item_len)) == NULL )			{				return ERR_MEMORY;			}			strcpy(menuhead.copyright,buf);			if( flag == 1 ) continue;			strcat(menuhead.copyright,"\n");			do{				fgets(buf,128,fp);				item_len += strlen(buf);				if( (menuhead.copyright = (char *)realloc(menuhead.copyright,item_len)) == NULL )				{					return ERR_MEMORY;				}				strcat(menuhead.copyright,buf);			} while(get_item_num(buf,'"') == 0 );		}		else if( curr_keyword == KEYWORD_MENUSTYLE )		{			strcpy(buf,get_item(buf,' ',1));			item_num = get_item_num(buf,',');			screen.mstyle = 0;			if( item_num == 0 )			{				if( in_symbol_table(buf) >= 0 )					screen.mstyle |= in_symbol_table(buf);				else				{					fclose(fp);					return ERR_NO_SYMBOL;				}			}			else			for(i=0;i<item_num;i++)			{				if( in_symbol_table(get_item(buf,',',i)) >= 0 )					screen.mstyle |= in_symbol_table(get_item(buf,',',i));				else				{					fclose(fp);					return ERR_NO_SYMBOL;				}			}		}		else if( curr_keyword == KEYWORD_MENUCOLOR )		{			strcpy(buf,get_item(buf,' ',1));			item_num = get_item_num(buf,',');			for(i=0;i<item_num;i++)			{				strcpy(color_buf,get_item(buf,',',i));				if( in_symbol_table(color_buf) < 0 )				{					fclose(fp);					return ERR_NO_SYMBOL;				}				switch(i)				{				case 0:					fcol = in_symbol_table(color_buf);					break;				case 1:					bcol = in_symbol_table(color_buf);					screen.text = COL(fcol,bcol);					break;				case 2:					fcol = in_symbol_table(color_buf);					break;				case 3:					bcol = in_symbol_table(color_buf);					screen.board = COL(fcol,bcol);					break;				case 4:					fcol = in_symbol_table(color_buf);					break;				case 5:					bcol = in_symbol_table(color_buf);					screen.client = COL(fcol,bcol);					break;				case 6:					fcol = in_symbol_table(color_buf);					break;				case 7:					bcol = in_symbol_table(color_buf);					screen.select = COL(fcol,bcol);					break;				case 8:					fcol = in_symbol_table(color_buf);					break;				case 9:					bcol = in_symbol_table(color_buf);					screen.hotkey = COL(fcol,bcol);					break;				case 10:					fcol = in_symbol_table(color_buf);					break;				case 11:					bcol = in_symbol_table(color_buf);					screen.prompt = COL(fcol,bcol);					break;				case 12:					fcol = in_symbol_table(color_buf);					break;				case 13:					bcol = in_symbol_table(color_buf);					screen.edit = COL(fcol,bcol);					break;				default:;				}			}		}		else if( curr_keyword == KEYWORD_BEGIN )		{			level = 0;			/*------------------------------------------------------------*/			if( (newptr=(menu_t *)malloc(sizeof(menu_t))) == NULL )			{				ret = ERR_MEMORY;				break;			}			memset(newptr,'\0',sizeof(menu_t));			menuhead.menu = newptr;			ptr[level] = newptr;	/* for save */			/*------------------------------------------------------------*/			break;		}		else		{			fclose(fp);			return ERR_FORMAT;		}	}	/*--------------------------------------------------------------------*/	/*--------------------------------------------------------------------*/	while(1)	{		if( !fgets(buf,128,fp) )		{			ret = ERR_READ_FILE;			break;		}		if( buf[strlen(buf)-1] == '\x0a' )			buf[strlen(buf)-1] = '\0';		ltrim(buf);		rtrim(buf);		if( buf[0] == '#' )		{			continue;		}		prev_keyword = curr_keyword;		curr_keyword=get_keyword(buf);		if( curr_keyword == KEYWORD_BEGIN )		{			if( prev_keyword != KEYWORD_POPUP )			{				ret = ERR_FORMAT;				break;			}			/*------------------------------------------------------------*/			if( (newptr=(menu_t *)malloc(sizeof(menu_t))) == NULL )			{				ret = ERR_MEMORY;				break;			}			memset(newptr,'\0',sizeof(menu_t));			newptr->parent = ptr[level];				ptr[level]->citem->child = newptr;			/*------------------------------------------------------------*/			level++;			if( level >= MAX_MENU_LEVEL )			{				ret = ERR_LEVEL;				break;			}			ptr[level] = newptr; /* for save */		}		else if( curr_keyword == KEYWORD_POPUP )		{			/*------------------------------------------------------------*/			if( (item_newptr=(menuitem_t *)malloc(sizeof(menuitem_t))) == NULL )			{				ret = ERR_MEMORY;				break;			}			memset(item_newptr,'\0',sizeof(menuitem_t));			/*------------------------------------------------------------*/			/* This is the first item in the level */			if( ptr[level]->citem == NULL ) 			{				ptr[level]->hitem = item_newptr;				if( level == 0 && screen.mstyle & MENU_PULLDOWN )					item_newptr->site = 0;	/* x */				else					item_newptr->site = 1;	/* y */				index[level] = 1;			}			else			{				ptr[level]->citem->next = item_newptr;				item_newptr->prev = ptr[level]->citem;				if( level == 0 && screen.mstyle & MENU_PULLDOWN )					item_newptr->site = item_newptr->prev->site+strlen(item_newptr->prev->text)+menuhead.interval;	/* x */				else					item_newptr->site = item_newptr->prev->site+1;	/* y */			}			ptr[level]->citem = item_newptr;			item_newptr->index = index[level];			index[level] ++;						item_newptr->id = NONE;					item_len=get_menuitem(buf,str);			if( (item_newptr->text=(char *)malloc(item_len+1)) == NULL )				return FALSE;			strcpy(item_newptr->text,str);			if( get_item_num(buf,',') > 0 ) /* Have help text */			{				strcpy(str,get_item(buf,'"',3));				item_len = strlen(str);				if( item_len > 0 )				{					if( (item_newptr->htext=(char *)malloc(item_len+1)) == NULL )						return FALSE;					strcpy(item_newptr->htext,str);				}				else					item_newptr->htext=NULL;			}			item_newptr->flag = NONE;		}		else if( curr_keyword == KEYWORD_MENUITEM )		{			/*------------------------------------------------------------*/			if( (item_newptr=(menuitem_t *)malloc(sizeof(menuitem_t))) == NULL )			{				ret = ERR_MEMORY;				break;			}			memset(item_newptr,'\0',sizeof(menuitem_t));			/*------------------------------------------------------------*/			/* This is the first item in the level */			if( ptr[level]->citem == NULL ) 			{				ptr[level]->hitem = item_newptr;				if( level == 0 && screen.mstyle & MENU_PULLDOWN )					item_newptr->site = 0;	/* x */				else					item_newptr->site = 1;	/* y */				index[level] = 1;			}			else			{				ptr[level]->citem->next = item_newptr;				item_newptr->prev = ptr[level]->citem;				if( level == 0 && screen.mstyle & MENU_PULLDOWN )					item_newptr->site = item_newptr->prev->site+strlen(item_newptr->prev->text)+menuhead.interval;	/* x */				else					item_newptr->site = item_newptr->prev->site+1;	/* y */			}			ptr[level]->citem = item_newptr;			if( memcmp(get_item(buf,' ',1),"SEPARATOR",9) == 0 )			{				item_newptr->index = 0;				item_newptr->id = 0;				continue;			}			else			{				item_newptr->index = index[level];				index[level]++;				if( screen.mstyle & MENU_RETURN_ID )				{					if( (item_newptr->id=get_id(buf)) < 0 )					{						ret = ERR_NO_SYMBOL;						break;					}				}				else if( screen.mstyle & MENU_EXEC_PROC )				{					strcpy(str,get_item(buf,',',1));					trim(str);					item_len=strlen(str);					if( (item_newptr->proc=(char *)malloc(item_len+1)) == NULL )						return FALSE;					strcpy(item_newptr->proc,str);				}				else				{				}			}					item_len=get_menuitem(buf,str);			if( (item_newptr->text=(char *)malloc(item_len+1)) == NULL )				return FALSE;			strcpy(item_newptr->text,str);			/*------------------------------------------------------------*/			item_num = get_item_num(buf,',');			for(i=2;i<item_num;i++)			{				strcpy(str,get_item(buf,',',i));				if( is_in(str,'"') >= 0 )				{					strcpy(str,get_item(buf,'"',3));					item_len=strlen(str);					if( item_len > 0 )					{						if( (item_newptr->htext=(char *)malloc(item_len+1)) == NULL )							return FALSE;						strcpy(item_newptr->htext,str);					}					else						item_newptr->htext=NULL;					break;				} else if( in_symbol_table(get_item(buf,',',i)) >= 0 )				{					item_newptr->flag |= in_symbol_table(get_item(buf,',',i));				}				else				{					fclose(fp);					return ERR_NO_SYMBOL;				}			}			/*------------------------------------------------------------*/		}		else if( curr_keyword == KEYWORD_END )		{			if( prev_keyword == KEYWORD_POPUP )			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -