[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 */
|
---|
| 14 | static BOOL decode (FILE *in, FILE *out);
|
---|
| 15 | static 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 |
|
---|
| 24 | int 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 | */
|
---|
| 115 | static 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 | */
|
---|
| 145 | static 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 |
|
---|
| 161 | MRESULT 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 | }
|
---|