source: trunk/dll/uudecode.c@ 551

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

Indentation cleanup

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