source: branches/ticket_150/dll/uudecode.c@ 869

Last change on this file since 869 was 793, checked in by Gregg Young, 18 years ago

Move #pragma alloc_text to end for OpenWatcom compat

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