source: trunk/dll/uudecode.c@ 486

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

Back to fgets for now - avoid excess error messages

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