source: trunk/dll/uudecode.c@ 328

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

Use Runtime_Error

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