source: trunk/dll/uudecode.c@ 1183

Last change on this file since 1183 was 1183, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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