source: trunk/dll/uudecode.c@ 404

Last change on this file since 404 was 404, checked in by root, 19 years ago

Use xfgets

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