source: trunk/dll/uudecode.c@ 1398

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

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.2 KB
Line 
1
2/***********************************************************************
3
4 $Id: uudecode.c 1398 2009-02-21 17:43:00Z gyoung $
5
6 uudecode
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2008 Steven H. Levine
10
11 06 Jun 05 SHL Indent -i2
12 06 Jun 05 SHL Drop unused code
13 17 Jul 06 SHL Use Runtime_Error
14 29 Jul 06 SHL Use xfgets
15 01 Sep 06 SHL Back to fgets for now - avoid excess error messages
16 22 Mar 07 GKY Use QWL_USER
17 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
18 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
19
20***********************************************************************/
21
22#include <stdlib.h>
23#include <string.h>
24#include <share.h>
25
26#define INCL_DOS
27#define INCL_WIN
28#define INCL_LONGLONG // dircnrs.h
29
30#include "fm3dll.h"
31#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
32#include "worker.h" // typedef WORKER
33#include "notebook.h" // Data declaration(s)
34#include "fm3dlg.h"
35#include "fm3str.h"
36#include "makelist.h" // AddToList
37#include "errutil.h" // Dos_Error...
38#include "strutil.h" // GetPString
39#include "defview.h"
40#include "uudecode.h"
41#include "getnames.h" // export_filename
42#include "valid.h" // IsFile
43#include "misc.h" // PaintRecessedWindow
44#include "wrappers.h" // xfgets
45
46static PSZ pszSrcFile = __FILE__;
47
48/* prototypes */
49static BOOL decode(FILE * in, FILE * out);
50static void outdec(char *p, FILE * f, int n);
51
52/* single character decode */
53#define DEC(c) (((c) - ' ') & 077)
54
55int UUD(char *filename, CHAR * dest)
56{
57 FILE *in, *out;
58 int mode, ret = 0;
59 char buf[80];
60 char fakedest[CCHMAXPATH];
61
62 if (!dest)
63 dest = fakedest;
64 in = _fsopen(filename, "r", SH_DENYWR);
65 if (!in) {
66 saymsg(MB_CANCEL,
67 HWND_DESKTOP,
68 GetPString(IDS_ERRORTEXT),
69 GetPString(IDS_COMPCANTOPENTEXT), filename);
70 return ret;
71 }
72
73 /* search for header line */
74 for (;;) {
75 if (!fgets(buf, sizeof(buf), in)) {
76 fclose(in);
77 saymsg(MB_CANCEL,
78 HWND_DESKTOP,
79 GetPString(IDS_ERRORTEXT),
80 GetPString(IDS_UUDNOBEGINTEXT), filename);
81 return ret;
82 }
83 if (!strncmp(buf, "begin ", 6))
84 break;
85 } // for
86 *dest = 0;
87 sscanf(buf, "begin %o %259s", &mode, dest);
88 dest[CCHMAXPATH - 1] = 0;
89 {
90 /* place dest in same directory as filename by default... */
91 char build[CCHMAXPATH], *p;
92
93 strcpy(build, filename);
94 p = strrchr(build, '\\');
95 if (p) {
96 p++;
97 *p = 0;
98 }
99 else
100 strcat(build, "\\");
101 strncat(build, dest, CCHMAXPATH - strlen(dest));
102 strcpy(dest, build);
103 }
104
105 if (!export_filename(HWND_DESKTOP, dest, FALSE)) {
106 fclose(in);
107 return ret;
108 }
109
110 /* create output file */
111 out = _fsopen(dest, "ab+", SH_DENYWR);
112 if (!out) {
113 fclose(in);
114 saymsg(MB_CANCEL,
115 HWND_DESKTOP,
116 GetPString(IDS_ERRORTEXT),
117 GetPString(IDS_UUDCANTOPENFORTEXT), dest, filename);
118 return ret;
119 }
120
121 ret = 1;
122 decode(in, out);
123
124 xfgets(buf, sizeof(buf), in, pszSrcFile, __LINE__);
125
126 fclose(in);
127 fclose(out);
128 return ret;
129}
130
131/*
132 * copy from in to out, decoding as you go along.
133 */
134static BOOL decode(FILE * in, FILE * out)
135{
136 char buf[80];
137 char *bp;
138 int n;
139
140 for (;;) {
141 /* for each input line */
142 if (!xfgets(buf, sizeof(buf), in, pszSrcFile, __LINE__))
143 return FALSE;
144 n = DEC(buf[0]);
145 if (n <= 0)
146 break;
147 bp = &buf[1];
148 while (n > 0) {
149 outdec(bp, out, n);
150 bp += 4;
151 n -= 3;
152 }
153 }
154 return TRUE;
155}
156
157/*
158 * output a group of 3 bytes (4 input characters).
159 * the input chars are pointed to by p, they are to
160 * be output to file f. n is used to tell us not to
161 * output all of them at the end of the file.
162 */
163static void outdec(char *p, FILE * f, int n)
164{
165 INT c1, c2, c3;
166
167 c1 = DEC(*p) << 2 | (UINT) DEC(p[1]) >> 4;
168 c2 = DEC(p[1]) << 4 | (UINT) DEC(p[2]) >> 2;
169 c3 = DEC(p[2]) << 6 | DEC(p[3]);
170 if (n >= 1)
171 putc(c1, f);
172 if (n >= 2)
173 putc(c2, f);
174 if (n >= 3)
175 putc(c3, f);
176}
177
178MRESULT EXPENTRY MergeDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
179{
180 WORKER *wk;
181
182 switch (msg) {
183 case WM_INITDLG:
184 if (mp2) {
185 WinSetWindowPtr(hwnd, QWL_USER, mp2);
186 wk = (WORKER *) mp2;
187 if (wk->li && wk->li->list && wk->li->list[0]) {
188 WinSendDlgItemMsg(hwnd, MRG_TARGETNAME, EM_SETTEXTLIMIT,
189 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
190 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
191 }
192 else
193 WinDismissDlg(hwnd, 0);
194 }
195 else
196 WinDismissDlg(hwnd, 0);
197 break;
198
199 case UM_UNDO:
200 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
201 wk = WinQueryWindowPtr(hwnd, QWL_USER);
202 if (wk) {
203 INT x, numfiles = 0;
204 SHORT start;
205 CHAR *p;
206
207 WinSetDlgItemText(hwnd, MRG_TARGETNAME, wk->li->targetpath);
208 start = 0;
209 p = strrchr(wk->li->targetpath, '\\');
210 if (p)
211 start = (p + 1) - wk->li->targetpath;
212 WinSendDlgItemMsg(hwnd, MRG_TARGETNAME, EM_SETSEL,
213 MPFROM2SHORT(start, CCHMAXPATH), MPVOID);
214 for (x = 0; wk->li->list[x]; x++) {
215 if (IsFile(wk->li->list[x]) == 1) {
216 numfiles++;
217 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_INSERTITEM,
218 MPFROM2SHORT(LIT_END, 0),
219 MPFROMP(wk->li->list[x]));
220 }
221 }
222 WinCheckButton(hwnd, MRG_BINARY, (wk->li->type == IDM_MERGEBINARY));
223 if (!numfiles) {
224 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
225 hwnd,
226 GetPString(IDS_SILLYERRORTEXT),
227 GetPString(IDS_MERGEWASTETEXT));
228 WinDismissDlg(hwnd, 0);
229 }
230 }
231 return 0;
232
233 case WM_CONTROL:
234 switch (SHORT1FROMMP(mp1)) {
235 case MRG_LISTBOX:
236 switch (SHORT2FROMMP(mp1)) {
237 case LN_ENTER:
238 {
239 SHORT x;
240 CHAR szBuffer[CCHMAXPATH];
241
242 x = (SHORT) WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_QUERYSELECTION,
243 MPFROMSHORT(LIT_FIRST), MPVOID);
244 if (x >= 0) {
245 *szBuffer = 0;
246 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_QUERYITEMTEXT,
247 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
248 if (*szBuffer)
249 QuickEdit(hwnd, szBuffer);
250 }
251 }
252 break;
253 }
254 break;
255 }
256 break;
257
258 case WM_ADJUSTWINDOWPOS:
259 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
260 break;
261
262 case UM_SETDIR:
263 PaintRecessedWindow(WinWindowFromID(hwnd, MRG_HELP), (HPS) 0, FALSE,
264 TRUE);
265 return 0;
266
267 case WM_COMMAND:
268 switch (SHORT1FROMMP(mp1)) {
269 case IDM_UNDO:
270 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
271 break;
272
273 case MRG_CHANGETARGET:
274 wk = WinQueryWindowPtr(hwnd, QWL_USER);
275 if (wk) {
276 CHAR filename[CCHMAXPATH];
277
278 strcpy(filename, wk->li->targetpath);
279 if (export_filename(HWND_DESKTOP, filename, FALSE) && *filename) {
280 strcpy(wk->li->targetpath, filename);
281 WinSetDlgItemText(hwnd, MRG_TARGETNAME, wk->li->targetpath);
282 }
283 }
284 break;
285
286 case MRG_REMOVE:
287 {
288 SHORT x;
289
290 x = (SHORT) WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_QUERYSELECTION,
291 MPFROMSHORT(LIT_FIRST), MPVOID);
292 if (x >= 0)
293 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_DELETEITEM,
294 MPFROMSHORT(x), MPVOID);
295 }
296 break;
297
298 case MRG_BOTTOM:
299 case MRG_TOP:
300 {
301 SHORT x;
302 CHAR szBuffer[CCHMAXPATH];
303
304 x = (SHORT) WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_QUERYSELECTION,
305 MPFROMSHORT(LIT_FIRST), MPVOID);
306 if (x >= 0) {
307 *szBuffer = 0;
308 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_QUERYITEMTEXT,
309 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
310 if (*szBuffer) {
311 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_DELETEITEM,
312 MPFROMSHORT(x), MPVOID);
313 if (SHORT1FROMMP(mp1) == MRG_TOP)
314 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_INSERTITEM,
315 MPFROM2SHORT(0, 0), MPFROMP(szBuffer));
316 else
317 WinSendDlgItemMsg(hwnd, MRG_LISTBOX, LM_INSERTITEM,
318 MPFROM2SHORT(LIT_END, 0), MPFROMP(szBuffer));
319 }
320 }
321 }
322 break;
323
324 case DID_CANCEL:
325 WinDismissDlg(hwnd, 0);
326 break;
327
328 case IDM_HELP:
329 if (hwndHelp)
330 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
331 MPFROM2SHORT(HELP_MERGE, 0), MPFROMSHORT(HM_RESOURCEID));
332 break;
333
334 case DID_OK:
335 wk = WinQueryWindowPtr(hwnd, QWL_USER);
336 if (wk) {
337 BOOL append, binary;
338 CHAR **list = NULL, **test, szBuffer[CCHMAXPATH];
339 UINT numfiles = 0, numalloc = 0;
340 INT error;
341 SHORT x, y;
342
343 *szBuffer = 0;
344 WinQueryDlgItemText(hwnd, MRG_TARGETNAME, CCHMAXPATH, szBuffer);
345 if (!*szBuffer) {
346 if (!fAlertBeepOff)
347 DosBeep(50, 100);
348 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, MRG_TARGETNAME));
349 break;
350 }
351 if (DosQueryPathInfo(szBuffer,
352 FIL_QUERYFULLNAME,
353 wk->li->targetpath, CCHMAXPATH)) {
354 if (!fAlertBeepOff)
355 DosBeep(50, 100);
356 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, MRG_TARGETNAME));
357 break;
358 }
359 WinSetDlgItemText(hwnd, MRG_TARGETNAME, szBuffer);
360 append = WinQueryButtonCheckstate(hwnd, MRG_APPEND);
361 binary = WinQueryButtonCheckstate(hwnd, MRG_BINARY);
362 wk->li->type = (append && binary) ? IDM_MERGEBINARYAPPEND :
363 (append) ? IDM_MERGETEXTAPPEND :
364 (binary) ? IDM_MERGEBINARY : IDM_MERGETEXT;
365 x = (SHORT) WinSendDlgItemMsg(hwnd,
366 MRG_LISTBOX,
367 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
368 for (y = 0; y < x; y++) {
369 *szBuffer = 0;
370 WinSendDlgItemMsg(hwnd,
371 MRG_LISTBOX,
372 LM_QUERYITEMTEXT,
373 MPFROM2SHORT(y, CCHMAXPATH), MPFROMP(szBuffer));
374 if (*szBuffer) {
375 error = AddToList(szBuffer, &list, &numfiles, &numalloc);
376 if (error) {
377 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
378 break;
379 }
380 }
381 }
382 if (numfiles && list && numfiles + 1 < numalloc) {
383 test =
384 xrealloc(list, sizeof(CHAR *) * (numfiles + 1), pszSrcFile,
385 __LINE__);
386 if (test)
387 list = test;
388 }
389 if (!list || !list[0]) {
390 Runtime_Error(pszSrcFile, __LINE__, NULL);
391 break;
392 }
393 else {
394 FreeList(wk->li->list);
395 wk->li->list = list;
396 }
397 }
398 WinDismissDlg(hwnd, 1);
399 break;
400 } // switch WM_COMMAND mp1
401 return 0;
402 } // switch msg
403 return WinDefDlgProc(hwnd, msg, mp1, mp2);
404}
405
406#pragma alloc_text(UUD,UUD,decode,outdec)
407#pragma alloc_text(MERGE,MergeDlgProc)
Note: See TracBrowser for help on using the repository browser.