source: trunk/dll/menu.c@ 1402

Last change on this file since 1402 was 1402, checked in by Gregg Young, 16 years ago

Remove variable aurgs from docopy & unlinkf (not used); Move more strings to PCSZs and string table; Move PCSZs to compile time initialization; Fix hang on startup caused by a drive scan and a dircnr scan trying to update a drive in the tree at the same time (related to the "treeswitch options); Code cleanup mainly removal of old printfs, SayMsgs, DbgMsg and unneeded %s.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1/***********************************************************************
2
3 $Id: menu.c 1402 2009-03-14 17:17:59Z gyoung $
4
5 Custom menu support routines for FM/2
6
7 Copyright (c) 1996-98 M. Kimes
8 Copyright (c) 2004, 2008 Steven H.Levine
9
10 01 Aug 04 SHL Rework lstrip/rstrip usage
11 22 Jul 06 SHL Check more run time errors
12 29 Jul 06 SHL Use xfgets_bstripcr
13 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
14 29 Feb 08 GKY Use xfree where appropriate
15
16***********************************************************************/
17
18#include <stdlib.h>
19#include <string.h>
20#include <share.h>
21
22#define INCL_WIN
23#define INCL_LONGLONG // dircnrs.h
24
25#include "fm3dll.h"
26#include "menu.h"
27#include "errutil.h" // Dos_Error...
28#include "delims.h" // skip_delim
29#include "wrappers.h" // xfgets_bstripcr
30#include "fortify.h"
31
32#pragma data_seg(DATA2)
33
34static PSZ pszSrcFile = __FILE__;
35
36MENU *menuhead = NULL;
37
38INT tokenize(CHAR * str, INT max, CHAR ** tokens)
39{
40 INT x = 0;
41 CHAR *p;
42
43 if (str && max && tokens) {
44 p = str;
45 for (;;) {
46 p = skip_delim(p, " \t");
47 if (!p)
48 break;
49 tokens[x++] = p;
50 if (x == max)
51 break;
52 p = to_delim(p, " \t");
53 if (!p)
54 break;
55 *p = 0;
56 p++;
57 if (!*p)
58 break;
59 }
60 }
61 return x;
62}
63
64VOID FreeMenuList(MENU * head)
65{
66 MENU *info, *next;
67
68 info = head;
69 while (info) {
70 next = info->next;
71 xfree(info->text, pszSrcFile, __LINE__);
72 free(info);
73 info = next;
74 }
75}
76
77// fixme why do I exist since the only call passes no filename and FM3MENU.DAT doesn't exist. GKY 1-30-09
78BOOL AddToMenu(CHAR * filename, HWND hwndMenu)
79{
80 FILE *fp;
81 CHAR s[256];
82 CHAR *tokens[3];
83 INT lines = 0;
84 MENU *info, *last = NULL;
85 BOOL ret = FALSE;
86
87 // fixme to complain?
88 if (!hwndMenu) {
89 Runtime_Error(pszSrcFile, __LINE__, NULL);
90 return ret;
91 }
92 if (!filename)
93 filename = "FM3MENU.DAT";
94 fp = _fsopen(filename, "r", SH_DENYWR);
95 if (fp) {
96 while (!feof(fp)) {
97 if (!xfgets_bstripcr(s, sizeof(s), fp, pszSrcFile, __LINE__))
98 break;
99 lines++;
100 if (!*s || *s == ';')
101 continue;
102 if (tokenize(s, 3, tokens) == 3 && (USHORT) atoi(tokens[1])) {
103 info = xmallocz(sizeof(MENU), pszSrcFile, __LINE__);
104 if (info) {
105 info->size = sizeof(MENU);
106 info->text = xstrdup(tokens[2], pszSrcFile, __LINE__);
107 if (!info->text)
108 free(info);
109 else {
110 if (!stricmp(tokens[0], "MENUITEM"))
111 info->cmd = atoi(tokens[1]);
112 else if (!stricmp(tokens[0], "SEPARATOR"))
113 info->type = SEPARATOR;
114 else {
115 /* error! */
116 xfree(info->text, pszSrcFile, __LINE__);
117 free(info);
118 info = NULL;
119 }
120 if (info) {
121 if (!menuhead)
122 menuhead = info;
123 else
124 last->next = info;
125 info->next = NULL;
126 last = info;
127 }
128 }
129 }
130 }
131 }
132 fclose(fp);
133
134 if (menuhead) {
135 MENUITEM mi;
136
137 memset(&mi, 0, sizeof(mi));
138 info = menuhead;
139 WinEnableWindow(hwndMenu, FALSE);
140 while (info) {
141 mi.iPosition = MIT_END;
142 mi.id = info->cmd;
143 mi.afStyle =
144 (info->type == SEPARATOR) ? MIS_BREAKSEPARATOR : MIS_TEXT;
145 if (WinSendMsg
146 (hwndMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(info->text)))
147 ret = TRUE;
148 info = info->next;
149 }
150 WinEnableWindow(hwndMenu, TRUE);
151 FreeMenuList(menuhead);
152 menuhead = NULL;
153 }
154 }
155 return ret;
156}
157
158#pragma alloc_text(MENU,tokenize,FreeMenuList,AddToMenu)
Note: See TracBrowser for help on using the repository browser.