source: trunk/dll/uudecode.c@ 858

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