/*********************************************************************** $Id: menu.c 406 2006-07-29 20:02:17Z root $ Custom menu support routines for FM/2 Copyright (c) 1996-98 M. Kimes Copyright (c) 2004, 2006 Steven H.Levine 01 Aug 04 SHL Rework lstrip/rstrip usage 22 Jul 06 SHL Check more run time errors 29 Jul 06 SHL Use xfgets_bstripcr ***********************************************************************/ #define INCL_DOS #define INCL_WIN #include #include #include #include #include #include "fm3dll.h" #include "menu.h" #pragma data_seg(DATA2) static PSZ pszSrcFile = __FILE__; #pragma alloc_text(MENU,tokenize,FreeMenuList,AddToMenu) MENU *menuhead = NULL; INT tokenize (CHAR *str,INT max,CHAR **tokens) { INT x = 0; CHAR *p; if(str && max && tokens) { p = str; for(;;) { p = skip_delim(p," \t"); if(!p) break; tokens[x++] = p; if(x == max) break; p = to_delim(p," \t"); if(!p) break; *p = 0; p++; // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"\"%s\"\r\r%d",tokens[x - 1],x); if(!*p) break; } } return x; } VOID FreeMenuList (MENU *head) { MENU *info,*next; info = head; while(info) { next = info->next; if(info->text) free(info->text); free(info); info = next; } } BOOL AddToMenu (CHAR *filename,HWND hwndMenu) { FILE *fp; CHAR s[256]; CHAR *tokens[3]; INT lines = 0; MENU *info,*last = NULL; BOOL ret = FALSE; // fixme to complain? if (!hwndMenu) { Runtime_Error(pszSrcFile, __LINE__, "no data"); return ret; } if (!filename) filename = "FM3MENU.DAT"; fp = _fsopen(filename,"r",SH_DENYWR); if (!fp) { // else saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Couldn't open %s",filename); } else { while (!feof(fp)) { if (!xfgets_bstripcr(s,sizeof(s),fp,pszSrcFile,__LINE__)) break; lines++; if(!*s || *s == ';') continue; if (tokenize(s,3,tokens) == 3 && (USHORT)atoi(tokens[1])) { info = xmallocz(sizeof(MENU),pszSrcFile,__LINE__); if (info) { info->size = sizeof(MENU); info->text = xstrdup(tokens[2],pszSrcFile,__LINE__); if (!info->text) free(info); else { if (!stricmp(tokens[0],"MENUITEM")) info->cmd = atoi(tokens[1]); else if (!stricmp(tokens[0],"SEPARATOR")) info->type = SEPARATOR; else { /* error! */ free(info->text); free(info); info = NULL; } if (info) { if(!menuhead) menuhead = info; else last->next = info; info->next = NULL; last = info; } } } } else { // fixme to complain? // saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Tokenization failed"); } } fclose(fp); if (menuhead) { MENUITEM mi; memset(&mi,0,sizeof(mi)); info = menuhead; WinEnableWindow(hwndMenu,FALSE); while (info) { mi.iPosition = MIT_END; mi.id = info->cmd; mi.afStyle = (info->type == SEPARATOR) ? MIS_BREAKSEPARATOR : MIS_TEXT; if (WinSendMsg(hwndMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(info->text))) ret = TRUE; info = info->next; } WinEnableWindow(hwndMenu,TRUE); FreeMenuList(menuhead); menuhead = NULL; } } return ret; }