source: trunk/dll/uudecode.c@ 195

Last change on this file since 195 was 195, checked in by root, 20 years ago

Indent -i2

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