📄 menulib.c
字号:
/*----------------------------------------------------------------------------* * 功 能: 菜单库文件. * * 版 本: 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 + -