source: trunk/dll/menu.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.4 KB
RevLine 
[2]1/**************************************************************************/
2/* Custom menu support routines for FM/2 */
3/* copyright (c) 1996 by M. Kimes -- all rights reserved */
4/**************************************************************************/
5
6#define INCL_DOS
7#define INCL_WIN
8
9#include <os2.h>
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <share.h>
14#include "fm3dll.h"
15#include "menu.h"
16
17#pragma data_seg(DATA2)
18#pragma alloc_text(MENU,tokenize,FreeMenuList,AddToMenu)
19
20MENU *menuhead = NULL;
21
22
23INT tokenize (CHAR *str,INT max,CHAR **tokens) {
24
25 INT x = 0;
26 CHAR *p;
27
28 if(str && max && tokens) {
29 p = str;
30 for(;;) {
31 p = skip_delim(p," \t");
32 if(!p)
33 break;
34 tokens[x++] = p;
35 if(x == max)
36 break;
37 p = to_delim(p," \t");
38 if(!p)
39 break;
40 *p = 0;
41 p++;
42// saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"\"%s\"\r\r%d",tokens[x - 1],x);
43 if(!*p)
44 break;
45 }
46 }
47 return x;
48}
49
50
51VOID FreeMenuList (MENU *head) {
52
53 MENU *info,*next;
54
55 info = head;
56 while(info) {
57 next = info->next;
58 if(info->text)
59 free(info->text);
60 free(info);
61 info = next;
62 }
63}
64
65
66BOOL AddToMenu (CHAR *filename,HWND hwndMenu) {
67
68 FILE *fp;
69 CHAR s[256];
70 CHAR *tokens[3];
71 INT lines = 0;
72 MENU *info,*last = NULL;
73 BOOL ret = FALSE;
74
75 if(!hwndMenu)
76 return ret;
77 if(!filename)
78 filename = "FM3MENU.DAT";
79 fp = _fsopen(filename,"r",SH_DENYWR);
80 if(fp) {
81 while(!feof(fp)) {
82 if(!fgets(s,256,fp))
83 break;
84 lines++;
85 stripcr(s);
86 lstrip(rstrip(s));
87 if(!*s || *s == ';')
88 continue;
89 if(tokenize(s,3,tokens) == 3 && (USHORT)atoi(tokens[1])) {
90// saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"%s\r\r%s\r\r%s",tokens[0],tokens[1],tokens[2]);
91 info = malloc(sizeof(MENU));
92 if(info) {
93 memset(info,0,sizeof(MENU));
94 info->size = sizeof(MENU);
95 info->text = strdup(tokens[2]);
96 if(info->text) {
97 if(!stricmp(tokens[0],"MENUITEM"))
98 info->cmd = atoi(tokens[1]);
99 else if(!stricmp(tokens[0],"SEPARATOR"))
100 info->type = SEPARATOR;
101 else { /* error! */
102 free(info->text);
103 free(info);
104 info = NULL;
105 }
106 if(info) {
107 if(!menuhead)
108 menuhead = info;
109 else
110 last->next = info;
111 info->next = NULL;
112 last = info;
113 }
114 }
115 else
116 free(info);
117 }
118 }
119 else { /* error! */
120// saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Tokenization failed");
121 }
122 }
123 fclose(fp);
124 if(menuhead) {
125
126 MENUITEM mi;
127
128 memset(&mi,0,sizeof(mi));
129 info = menuhead;
130 WinEnableWindow(hwndMenu,FALSE);
131 while(info) {
132 mi.iPosition = MIT_END;
133 mi.id = info->cmd;
134 mi.afStyle = (info->type == SEPARATOR) ? MIS_BREAKSEPARATOR : MIS_TEXT;
135 if(WinSendMsg(hwndMenu, MM_INSERTITEM, MPFROMP(&mi),
136 MPFROMP(info->text)))
137 ret = TRUE;
138 info = info->next;
139 }
140 WinEnableWindow(hwndMenu,TRUE);
141 FreeMenuList(menuhead);
142 menuhead = NULL;
143 }
144 }
145// else saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,"Couldn't open %s",filename);
146 return ret;
147}
Note: See TracBrowser for help on using the repository browser.