source: trunk/dll/uudecode.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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