source: trunk/dll/mle.c@ 350

Last change on this file since 350 was 350, checked in by root, 19 years ago

Use Runtime_Error

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 30.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: mle.c 350 2006-07-26 19:01:20Z root $
5
6 MLE text editor/viewer
7
8 Copyright (c) 1993-97 M. Kimes
9 Copyright (c) 2004, 2006 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 16 Apr 06 SHL MLEexportfile: rework to avoid wrap problems
13 14 Jul 06 SHL Use Runtime_Error
14
15***********************************************************************/
16
17#define INCL_DOS
18#define INCL_WIN
19#include <os2.h>
20
21#include <stdlib.h>
22#include <stdio.h>
23#include <string.h>
24#include <ctype.h>
25#include <share.h>
26
27#include "fm3dll.h"
28#include "fm3dlg.h"
29#include "mle.h"
30#include "fm3str.h"
31
32static PSZ pszSrcFile = __FILE__;
33
34#pragma alloc_text(FMMLE,MLEgetlinetext,MLEdeleteline,MLEdeletecurline,MLEdeletetoeol)
35
36#define FAKEROT 1
37#define DOROT13(c) ((FAKEROT==0)?(c):(FAKEROT==1)?(!isalpha((c)))?(c):((((c) >= (char) 'A') && \
38 ((c) <= (char) 'M')) || (((c) >= (char) 'a') && ((c) <= (char) 'm')))?((c) + (char) 0xd)\
39 :((((c) >= (char) 'N') && ((c) <= (char) 'Z')) || (((c) >= (char) 'n') && ((c) <= (char) 'z')))?\
40 ((c) - (char) 0xd):(c):((c) >= (char) '!') ? ((((c) + (char) 47) > (char) '~') ? ((c) - (char) 47) :\
41 ((c) + (char) 47)) : (c))
42
43
44LONG MLEgetlinetext (HWND h,LONG l,CHAR *buf,INT maxlen)
45{
46 /* get text of line l from MLE */
47
48 IPT s,e;
49
50 s = MLEstartofline(h,l);
51 e = MLElinelenleft(h,s);
52 return MLEtextatpos(h,s,buf,min((INT)e,maxlen));
53}
54
55
56LONG MLEdeleteline (HWND h,LONG l)
57{
58 /* delete line l from MLE */
59
60 IPT s,e;
61
62 s = MLEstartofline(h,l);
63 e = MLElinelenleft(h,s);
64 return MLEdelete(h,s,e);
65}
66
67
68LONG MLEdeletecurline (HWND h)
69{
70 /* delete current line from MLE */
71
72 LONG l;
73
74 l = MLEcurline(h);
75 return MLEdeleteline(h,l);
76}
77
78
79LONG MLEdeletetoeol (HWND h)
80{
81 /* delete from cursor pos to end of line */
82
83 IPT s,e;
84
85 s = MLEcurpos(h);
86 e = MLEcurlenleft(h);
87 return MLEdelete(h,s,e);
88}
89
90#pragma alloc_text(FMMLE,MLEclearall,MLEtextatcursor,MLEtextatpos,MLEsizeofsel)
91
92
93VOID MLEclearall (HWND h)
94{
95 /* remove all text from MLE */
96 LONG len;
97
98 len = MLEgetlen(h);
99 if(len)
100 MLEdelete(h,0,len);
101}
102
103
104LONG MLEtextatcursor (HWND h,CHAR *buffer,INT buflen)
105{
106 /* place up to buflen chars of text from cursor pos into buffer
107 * return # of chars imported
108 */
109
110 IPT i;
111
112 i = MLEcurpos(h);
113 return MLEtextatpos(h,i,buffer,buflen);
114}
115
116
117LONG MLEtextatpos (HWND h,IPT i,CHAR *buffer,INT buflen)
118{
119 /* place up to buflen chars of text from pos i in buffer
120 * return # of chars imported
121 */
122
123 WinSendMsg(h,MLM_SETIMPORTEXPORT,MPFROMP(buffer),
124 MPFROMLONG((LONG)buflen));
125 return(LONG)WinSendMsg(h,MLM_EXPORT,
126 MPFROMP(&i),
127 MPFROMLONG((PLONG)&buflen));
128}
129
130
131LONG MLEsizeofsel (HWND h)
132{
133 /* return length of selected text */
134
135 IPT cursor,anchor,test;
136
137 cursor = MLEcurpos(h);
138 anchor = MLEancpos(h);
139 test = min(cursor,anchor);
140 /* MLE fakes us out; get real length in bytes */
141 return (LONG)WinSendMsg(h,MLM_QUERYFORMATTEXTLENGTH,
142 MPFROMLONG(test),
143 MPFROMLONG((LONG)((cursor < anchor) ?
144 (anchor - cursor):
145 (cursor - anchor))));
146}
147
148
149#pragma alloc_text(FMMLE3,MLEdoblock,MLEquotepara,MLEinternet)
150
151VOID MLEinternet (HWND h,BOOL ftp)
152{
153 CHAR *temp = NULL;
154 IPT ancpos,curpos,here;
155 LONG len,oldlen;
156 APIRET rc;
157
158 len = MLEsizeofsel(h);
159 len = min(2048,len);
160 oldlen = len;
161 if (len) {
162 len++;
163 rc = DosAllocMem((PVOID)&temp,4096,
164 PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE);
165 if (rc || !temp)
166 Dos_Error(MB_CANCEL,rc,h,pszSrcFile,__LINE__,GetPString(IDS_OUTOFMEMORY));
167 else {
168 ancpos = MLEancpos(h);
169 curpos = MLEcurpos(h);
170 here = min(curpos,ancpos);
171 WinSendMsg(h,MLM_SETIMPORTEXPORT,MPFROMP(temp),MPFROMLONG(len));
172 len = (LONG)WinSendMsg(h,MLM_EXPORT,MPFROMP(&here),MPFROMP(&len));
173 if (len <= 1)
174 Runtime_Error(pszSrcFile, __LINE__, "len <= 1");
175 else {
176 if(len > oldlen)
177 len--;
178 temp[len] = 0;
179 bstripcr(temp);
180 if(*temp) {
181 if(ftp && *ftprun)
182 runemf2(SEPARATE | WINDOWED,
183 h,
184 NULL,
185 NULL,
186 "%s %s",
187 ftprun,
188 temp);
189 else if(!ftp && *httprun)
190 runemf2(SEPARATE | WINDOWED,
191 h,
192 NULL,
193 NULL,
194 "%s %s",
195 httprun,
196 temp);
197 }
198 }
199 DosFreeMem(temp);
200 }
201 }
202}
203
204
205BOOL MLEdoblock (HWND h,INT action,CHAR *filename)
206{
207 /* perform action on text in selection */
208
209 register CHAR *p;
210 CHAR *sel,*temp = NULL;
211 IPT ancpos,curpos,here;
212 LONG sellen,oldlen;
213 APIRET rc;
214
215 oldlen = MLEsizeofsel(h);
216 if(!oldlen)
217 return TRUE;
218 sel = xmallocz((size_t)(oldlen + 2),pszSrcFile,__LINE__);
219 if (!sel)
220 return FALSE;
221 rc = DosAllocMem((PVOID)&temp,32768L,
222 PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE);
223 if (rc || !temp) {
224 Dos_Error(MB_CANCEL,rc,h,pszSrcFile,__LINE__,GetPString(IDS_OUTOFMEMORY));
225 free(sel);
226 DosPostEventSem(CompactSem);
227 return FALSE;
228 }
229
230 ancpos = MLEancpos(h);
231 curpos = MLEcurpos(h);
232 here = min(curpos,ancpos);
233 p = sel;
234 MLEdisable(h);
235 while(oldlen > 0) {
236 sellen = min(oldlen + 1,32701);
237 WinSendMsg(h,MLM_SETIMPORTEXPORT,MPFROMP(temp),MPFROMLONG(sellen));
238 sellen = (LONG)WinSendMsg(h,MLM_EXPORT,MPFROMP(&here),MPFROMP(&sellen));
239 if (sellen < 1) {
240 Runtime_Error(pszSrcFile, __LINE__, "len < 1");
241 free(sel);
242 DosPostEventSem(CompactSem);
243 return FALSE;
244 }
245 if(sellen > min(oldlen,32700))
246 sellen--;
247 memcpy(p,temp,sellen);
248 p += sellen;
249 oldlen -= sellen;
250 }
251 switch(action) {
252 case APPENDCLIP:
253 SaveToClip(h,sel,TRUE);
254 DosFreeMem(temp);
255 free(sel);
256 MLEenable(h);
257 DosPostEventSem(CompactSem);
258 return TRUE;
259
260 case WRITE:
261 {
262 FILE *fp;
263
264 fp = fopen(filename,"a+");
265 if(!fp)
266 fp = xfopen(filename,"w",pszSrcFile,__LINE__);
267 if (fp) {
268 fseek(fp,0L,SEEK_END);
269 fwrite(sel,1,strlen(sel),fp);
270 fclose(fp);
271 }
272#ifdef __DEBUG_ALLOC__
273 _heap_check();
274#endif
275 DosFreeMem(temp);
276 free(sel);
277 MLEenable(h);
278 DosPostEventSem(CompactSem);
279 return TRUE;
280 }
281
282 case UPPERCASE:
283 p = sel;
284 while(*p) {
285 if(isalpha(*p))
286 *p = toupper(*p);
287 p++;
288 }
289 break;
290
291 case LOWERCASE:
292 p = sel;
293 while(*p) {
294 if(isalpha(*p))
295 *p = tolower(*p);
296 p++;
297 }
298 break;
299
300 case TOGGLECASE:
301 p = sel;
302 while(*p) {
303 if(isalpha(*p)) {
304 if(islower(*p))
305 *p = toupper(*p);
306 else
307 *p = tolower(*p);
308 }
309 p++;
310 }
311 break;
312
313 case ROT13:
314 p = sel;
315 while(*p) {
316 *p = DOROT13(*p);
317 p++;
318 }
319 break;
320
321 case XOR:
322 p = sel;
323 while(*p) {
324 *p = (~*p);
325 p++;
326 }
327 break;
328
329 case FORMAT:
330 p = sel;
331 while(*p) {
332 if(*p == '\r') {
333 memmove(p,p + 1,strlen(p));
334 continue;
335 }
336 if(*p == '\n') {
337 *p = ' ';
338 continue;
339 }
340 p++;
341 }
342 break;
343
344 default: /* unknown action */
345#ifdef __DEBUG_ALLOC__
346 _heap_check();
347#endif
348 DosFreeMem(temp);
349 free(sel);
350 DosPostEventSem(CompactSem);
351 MLEenable(h);
352 return FALSE;
353 }
354
355 /* replace selection with altered text */
356 p = sel;
357 here = min(curpos,ancpos);
358 MLEclear(h); /* delete current selection */
359 sellen = oldlen = strlen(sel); /* actual number of bytes */
360 while(oldlen > 0) {
361 sellen = min(oldlen,32700);
362 memcpy(temp,p,sellen);
363 WinSendMsg(h,
364 MLM_SETIMPORTEXPORT,
365 MPFROMP(temp),
366 MPFROMLONG(sellen));
367 sellen = (LONG)WinSendMsg(h,
368 MLM_IMPORT,
369 MPFROMP(&here),
370 MPFROMLONG(sellen));
371 if (!sellen) {
372 Runtime_Error(pszSrcFile, __LINE__, "sellen 0");
373 break;
374 }
375 p += sellen;
376 oldlen -= sellen;
377 if(oldlen && *p == '\n' /* && *(p - 1) == '\r' */)
378 p--;
379 } // while
380 WinSendMsg(h,MLM_SETSEL,MPFROMLONG(ancpos),MPFROMLONG(curpos));
381 MLEenable(h);
382#ifdef __DEBUG_ALLOC__
383 _heap_check();
384#endif
385 DosFreeMem(temp);
386 free(sel);
387 DosPostEventSem(CompactSem);
388 return TRUE;
389}
390
391
392BOOL MLEquotepara (HWND h,CHAR *initials,BOOL fQuoteOld)
393{
394 LONG num;
395 CHAR lineend[2],line[8],*p;
396
397 if(!initials || !*initials)
398 initials = " > ";
399 num = MLEcurline(h);
400 while(MLElinelen(h,num) < 3L && MLEnumlines(h) >= num)
401 num++;
402 while(MLElinelen(h,num) > 2L && MLEnumlines(h) >= num) {
403 memset(line,0,8);
404 MLEgetlinetext(h,num,line,7L);
405 line[7] = 0;
406 if((p = strchr(line,'>')) == NULL) {
407 MLEsetcurpos(h,MLEstartofline(h,num));
408 MLEinsert(h,initials);
409 MLEsetcurpos(h,(MLEstartofline(h,num) + MLElinelen(h,num)) - 1L);
410 MLEtextatcursor(h,lineend,2L);
411 if(*lineend != '\r' && *lineend != '\n')
412 MLEinsert(h,"\n");
413 }
414 else if(fQuoteOld) {
415 while(isspace(line[strlen(line) - 1]))
416 line[strlen(line) - 1] = 0;
417 MLEsetcurpos(h,MLEstartofline(h,num) + (p - line));
418 MLEinsert(h,">");
419 }
420 num++;
421 }
422 MLEsetcurpos(h,MLEstartofline(h,num));
423 return TRUE;
424}
425
426#pragma alloc_text(FMMLE4,MLEAutoLoad,MLEHexLoad,MLEinsertfile,LoadThread,MLEbackgroundload)
427
428
429BOOL MLEAutoLoad (HWND h,CHAR *filename)
430{
431 XMLEWNDPTR *vw;
432
433 vw = (XMLEWNDPTR *)WinQueryWindowPtr(WinQueryWindow(h,QW_PARENT),0);
434 if(vw && vw->size != sizeof(XMLEWNDPTR))
435 vw = NULL;
436 if(TestBinary(filename)) {
437 if(vw)
438 vw->hex = 1;
439 return MLEHexLoad(h,filename);
440 }
441 if(vw)
442 vw->hex = 2;
443 return MLEloadfile(h,filename);
444}
445
446
447BOOL MLEHexLoad (HWND h,CHAR *filename)
448{
449 /* insert a file into the current position in the MLE */
450
451 HAB hab;
452 CHAR *buffer = NULL,*hexbuff = NULL;
453 IPT iptOffset = -1L;
454 ULONG numread,howmuch,numimport,action,len,left = 0L;
455 BOOL ret = TRUE,first = TRUE;
456 CHAR titletext[512];
457 HWND grandpa;
458 XMLEWNDPTR *vw;
459 HFILE handle;
460 APIRET rc;
461
462 *titletext = 0;
463 hab = WinQueryAnchorBlock(h);
464 vw = (XMLEWNDPTR *)WinQueryWindowPtr(WinQueryWindow(h,QW_PARENT),0);
465 if(vw && vw->size != sizeof(XMLEWNDPTR))
466 vw = NULL;
467 grandpa = GrandparentOf(h);
468 *titletext = 0;
469 WinQueryWindowText(grandpa,512,titletext);
470 rc = DosOpen(filename,&handle,&action,0L,0L,
471 OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS,
472 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
473 OPEN_FLAGS_SEQUENTIAL | OPEN_SHARE_DENYNONE |
474 OPEN_ACCESS_READONLY,0L);
475 if (rc) {
476 ret = FALSE;
477 }
478 else {
479 DosChgFilePtr(handle, 0L, FILE_END, &len);
480 DosChgFilePtr(handle, 0L, FILE_BEGIN, &action);
481 if (len) {
482 rc = DosAllocMem((PVOID)&hexbuff,50001L,
483 PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE);
484 if (rc || !hexbuff) {
485 Dos_Error(MB_CANCEL,rc,h,pszSrcFile,__LINE__,GetPString(IDS_OUTOFMEMORY));
486 ret = FALSE;
487 }
488 else {
489 buffer = xmalloc(10000,pszSrcFile,__LINE__);
490 if (!buffer)
491 ret = FALSE;
492 else {
493 MLEclearall(h);
494 WinSendMsg(h,MLM_SETIMPORTEXPORT,MPFROMP(hexbuff),
495 MPFROMLONG(50000L));
496 if(!DosRead(handle,buffer,min(10000,len),&numread) && numread) {
497
498 CHAR s[81];
499
500 MLEsetwrap(h,FALSE);
501 WinSetSysValue(HWND_DESKTOP,SV_INSERTMODE,FALSE);
502 *hexbuff = 0;
503 numimport = CreateHexDump(buffer,
504 numread,
505 hexbuff,
506 50000,
507 left,
508 TRUE);
509 while(len && numimport) { /* import entire file */
510 left += numread;
511 len -= numread;
512 if(!WinIsWindow(hab,h) || (vw && vw->killme))
513 break;
514 howmuch = (INT)WinSendMsg(h,
515 MLM_IMPORT,
516 MPFROMP(&iptOffset),
517 MPFROMLONG(numimport));
518 if(first && len) {
519 MLEdisable(h);
520 WinEnableWindowUpdate(h,FALSE);
521 first = FALSE;
522 }
523// fprintf(stderr,"%d bytes of %d imported\n",howmuch,numimport);
524 if(howmuch < 1) {
525 numimport = 0;
526 break;
527 }
528 while(howmuch < numimport) {
529 numimport -= howmuch;
530 memmove(hexbuff,hexbuff + howmuch,numimport);
531 DosSleep(0L);
532 if(!WinIsWindow(hab,h) ||
533 (vw &&
534 vw->killme))
535 break;
536 howmuch = (INT)WinSendMsg(h,
537 MLM_IMPORT,
538 MPFROMP(&iptOffset),
539 MPFROMLONG((LONG)numimport));
540 if(howmuch < 1)
541 break;
542 }
543 if(DosRead(handle,buffer,min(10000,len),&numread) || !numread) {
544 numimport = 0;
545 break;
546 }
547 *hexbuff = 0;
548 numimport = CreateHexDump(buffer,numread,hexbuff,50000,left,TRUE);
549 if(numimport < 1 ||
550 !WinIsWindow(hab,h) ||
551 (vw &&
552 vw->killme)) {
553 numimport = 0;
554 break;
555 }
556 sprintf(s,
557 GetPString(IDS_LOADINGMLETEXT),
558 len);
559 WinSetWindowText(grandpa,s);
560 }
561 DosSleep(1L);
562 }
563 else
564 ret = FALSE;
565 free(buffer);
566 }
567 DosFreeMem(hexbuff);
568 }
569 }
570 if(WinIsWindow(hab,h))
571 WinSetWindowText(grandpa,titletext);
572 DosClose(handle);
573 }
574 if(!first) {
575 WinEnableWindowUpdate(h,TRUE);
576 MLEenable(h);
577 }
578 MLEsetchanged(h,FALSE);
579 return ret;
580}
581
582
583//== MLEinsertfile() insert a file into the current position in the MLE ==
584
585BOOL MLEinsertfile (HWND h,CHAR *filename)
586{
587
588 HAB hab;
589 FILE *fp;
590 CHAR *buffer = NULL;
591 INT len;
592 IPT iptOffset = -1L;
593 INT numread,howmuch,tempnum,x;
594 BOOL ret = TRUE,first = TRUE,once = FALSE,dont = FALSE;
595 CHAR titletext[512];
596 HWND grandpa;
597 XMLEWNDPTR *vw;
598 APIRET rc;
599
600 *titletext = 0;
601 hab = WinQueryAnchorBlock(h);
602 vw = (XMLEWNDPTR *)WinQueryWindowPtr(WinQueryWindow(h,QW_PARENT),0);
603 if(vw && vw->size != sizeof(XMLEWNDPTR))
604 vw = NULL;
605 grandpa = GrandparentOf(h);
606 *titletext = 0;
607 WinQueryWindowText(grandpa,
608 512,
609 titletext);
610 fp = _fsopen(filename,"r",SH_DENYNO);
611 if (!fp)
612 ret = FALSE;
613 else {
614 setvbuf(fp,NULL,_IONBF,0);
615 fseek(fp,0L,SEEK_END);
616 len = (INT)ftell(fp);
617 fseek(fp,0L,SEEK_SET);
618 if(len && len != -1) {
619 rc = DosAllocMem((PVOID)&buffer,
620 50000L,
621 PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE);
622 if (rc || !buffer) {
623 Dos_Error(MB_CANCEL,rc,h,pszSrcFile,__LINE__,GetPString(IDS_OUTOFMEMORY));
624 ret = FALSE;
625 }
626 else {
627 WinSendMsg(h,
628 MLM_SETIMPORTEXPORT,
629 MPFROMP(buffer),
630 MPFROMLONG(50000L));
631 numread = fread(buffer,
632 1,
633 min(50000,len),
634 fp);
635 if(numread < 1)
636 ret = FALSE;
637 while(len &&
638 numread > 0) { /* here we go... */
639
640 CHAR s[81];
641
642 while(numread > 0) { /* import entire file */
643 if(!WinIsWindow(hab,h) ||
644 (vw &&
645 vw->killme))
646 break;
647 if(strlen(buffer) < numread) {
648 if(!once && !dont)
649 rc = saymsg(MB_YESNOCANCEL,
650 HWND_DESKTOP,
651 GetPString(IDS_WARNINGTEXT),
652 GetPString(IDS_TEXTNULSTEXT));
653 else if(once)
654 rc = MBID_YES;
655 else if(dont)
656 rc = MBID_NO;
657 if(rc == MBID_YES) {
658 once = FALSE;
659 for(x = 0;x < numread;x++) {
660 if(!buffer[x])
661 buffer[x] = ' ';
662 }
663 }
664 else if(rc == MBID_CANCEL) {
665 len = 0;
666 numread = 0;
667 saymsg(MB_ENTER,
668 HWND_DESKTOP,
669 GetPString(IDS_OBEYTEXT),
670 GetPString(IDS_LOADCANCELLEDTEXT));
671 break;
672 }
673 else if(rc == MBID_NO)
674 dont = TRUE;
675 }
676 howmuch = (INT)WinSendMsg(h,
677 MLM_IMPORT,
678 MPFROMP(&iptOffset),
679 MPFROMLONG((LONG)numread));
680 if(first &&
681 !feof(fp)) {
682 MLEdisable(h);
683 WinEnableWindowUpdate(h,FALSE);
684 first = FALSE;
685 }
686// fprintf(stderr,"%d bytes of %d imported\n",howmuch,numread);
687 if(howmuch < 1) {
688 numread = 0;
689 break;
690 }
691 len -= howmuch;
692 if(howmuch < numread) {
693 numread -= howmuch;
694 memmove(buffer,
695 buffer + howmuch,
696 numread);
697 if(numread &&
698 len) {
699 tempnum = numread;
700 numread = fread(buffer + tempnum,
701 1,
702 min(50000 - tempnum,len),
703 fp);
704 if(numread > 1)
705 numread += tempnum;
706 else
707 numread = tempnum;
708 }
709 DosSleep(0L);
710 }
711 else
712 numread = fread(buffer,
713 1,
714 min(50000,len),
715 fp);
716 if(numread < 1 ||
717 !WinIsWindow(hab,h) ||
718 (vw &&
719 vw->killme)) {
720 numread = 0;
721 break;
722 }
723 sprintf(s,
724 GetPString(IDS_LOADINGMLETEXT),
725 len);
726 WinSetWindowText(grandpa,s);
727 }
728 DosSleep(1L);
729 }
730 DosFreeMem(buffer);
731 }
732 }
733 if(WinIsWindow(hab,h))
734 WinSetWindowText(grandpa,titletext);
735 fclose(fp);
736 }
737 if(!first) {
738 WinEnableWindowUpdate(h,TRUE);
739 MLEenable(h);
740 }
741 return ret;
742}
743
744
745typedef struct {
746 USHORT size;
747 USHORT hex;
748 HWND h;
749 CHAR filename[CCHMAXPATH];
750 HWND hwndReport;
751 HWND msg;
752} BKGLOAD;
753
754
755VOID LoadThread (VOID *arg)
756{
757 BKGLOAD *bkg;
758 BOOL fSuccess;
759 HAB thab;
760 HMQ thmq;
761
762 DosError(FERR_DISABLEHARDERR);
763
764 bkg = (BKGLOAD *)arg;
765 if(bkg) {
766 thab = WinInitialize(0);
767 if(thab) {
768 thmq = WinCreateMsgQueue(thab,0);
769 if(thmq) {
770 WinCancelShutdown(thmq,TRUE);
771 priority_normal();
772 if(bkg->hex == 1)
773 fSuccess = MLEHexLoad(bkg->h,bkg->filename);
774 else if(bkg->hex == 2)
775 fSuccess = MLEloadfile(bkg->h,bkg->filename);
776 else
777 fSuccess = MLEAutoLoad(bkg->h,bkg->filename);
778 priority_bumped();
779 if(bkg->hwndReport && WinIsWindow(thab,bkg->hwndReport))
780 PostMsg(bkg->hwndReport,bkg->msg,MPFROMLONG(fSuccess),
781 MPFROMP(bkg->filename));
782#ifdef __DEBUG_ALLOC__
783 _heap_check();
784#endif
785 free(bkg);
786 WinDestroyMsgQueue(thmq);
787 }
788 WinTerminate(thab);
789 _endthread();
790 }
791 PostMsg(bkg->hwndReport,bkg->msg,MPVOID,MPVOID);
792 }
793}
794
795
796INT MLEbackgroundload (HWND hwndReport,ULONG msg,HWND h,CHAR *filename,
797 INT hex)
798{
799 /* load a file into the MLE in the background (via a separate thread)
800 * return _beginthread status
801 */
802
803 BKGLOAD *bkg;
804 INT rc;
805
806 bkg = xmallocz(sizeof(BKGLOAD),pszSrcFile,__LINE__);
807 if (!bkg)
808 return -1;
809 bkg->size = sizeof(BKGLOAD);
810 bkg->hex = (USHORT)hex;
811 bkg->hwndReport = hwndReport;
812 bkg->msg = msg;
813 bkg->h = h;
814 strcpy(bkg->filename,filename);
815 rc = _beginthread(LoadThread,NULL,65536,bkg);
816 if (rc == -1)
817 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT));
818 return rc;
819}
820
821#pragma alloc_text(FMMLE5,MLEloadfile,MLEexportfile)
822
823BOOL MLEloadfile (HWND h,CHAR *filename)
824{
825 /* load a file into the MLE, getting rid of whatever was already
826 * there. Note this returns without erasing existing text if the
827 * file to load does not exist
828 */
829
830 FILESTATUS3 fsa;
831 BOOL ret;
832
833 if(!DosQueryPathInfo(filename,FIL_STANDARD,&fsa,(ULONG)sizeof(fsa)) &&
834 !(fsa.attrFile & FILE_DIRECTORY)) {
835 MLEclearall(h);
836 ret = MLEinsertfile(h,filename);
837 MLEsetchanged(h,FALSE);
838 return ret;
839 }
840 return FALSE;
841}
842
843
844BOOL MLEexportfile (HWND h,CHAR *filename,INT tabspaces,
845 BOOL striptraillines,BOOL striptrailspaces)
846{
847 /* save the MLE contents as a file. Format the output so that
848 * the file is CR/LF terminated as presented in the MLE.
849 */
850
851 FILE *fp = NULL;
852 CHAR *buffer = NULL;
853 CHAR *p;
854 BOOL ok = TRUE;
855 INT blanklines = 0;
856 BOOL fWrap = MLEgetwrap(h);
857 APIRET rc;
858
859 // saymsg(MB_ENTER,h,DEBUG_STRING,"len = %ld",MLEgetlen(h));
860 if(!MLEgetlen(h)) /* nothing to save; forget it */
861 return TRUE;
862
863 MLEsetwrap(h, FALSE); // Need wrap off to export MLFIE_NOTRANS
864
865 if(striptraillines) {
866
867 register LONG x;
868 LONG numlines;
869
870 numlines = MLEnumlines(h);
871 for(x = numlines;x;x--) {
872 if(MLElinelen(h,x - 1L) < 2)
873 MLEdeleteline(h,x - 1L);
874 else
875 break;
876 }
877 if(!MLEgetlen(h))
878 {
879 /* nothing to save; forget it */
880 MLEsetwrap(h, fWrap); // Restore
881 return TRUE;
882 }
883 }
884
885 rc = DosAllocMem((PVOID)&buffer,4096L,
886 PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE);
887 if (rc || !buffer) {
888 Dos_Error(MB_CANCEL,rc,h,pszSrcFile,__LINE__,GetPString(IDS_OUTOFMEMORY));
889 ok = FALSE;
890 }
891 else
892 {
893 fp = fopen(filename,"a+");
894 if (!fp)
895 fp = xfopen(filename,"w",pszSrcFile,__LINE__);
896 if (!fp)
897 ok = FALSE;
898 else {
899 LONG numlines,ret,len,wl,temp;
900 IPT s;
901
902 fseek(fp,0L,SEEK_END);
903 numlines = MLEnumlines(h);
904
905 WinSendMsg(h,MLM_SETIMPORTEXPORT,MPFROMP(buffer),
906 MPFROMLONG(4095L));
907 for(temp = 0;temp < numlines;temp++) {
908 s = MLEstartofline(h,temp);
909 wl = len = (LONG)MLElinelenleft(h,s);
910 ret = (LONG)WinSendMsg(h,MLM_EXPORT,MPFROMP(&s),
911 MPFROMP(&len));
912 if(ret < 0)
913 break;
914 wl = min(wl,ret);
915 buffer[wl] = 0;
916 if(*buffer) {
917 p = buffer + strlen(buffer) - 1;
918 while(p >= buffer && (*p == '\n' || *p == '\r')) {
919 *p = 0;
920 p--;
921 }
922 }
923 if(tabspaces) {
924 p = buffer;
925 while(*p) {
926 if(*p == '\t') {
927 *p = ' ';
928 memmove((p + tabspaces) - 1,p,strlen(p) + 1);
929 memset(p,' ',tabspaces);
930 }
931 p++;
932 }
933 }
934 if(striptrailspaces && *buffer) {
935 p = buffer + strlen(buffer) - 1;
936 while(p >= buffer && (*p == ' ' || *p == '\t')) {
937 *p = 0;
938 p--;
939 }
940 }
941 if(striptraillines) {
942 if(!*buffer) {
943 blanklines++;
944 continue;
945 }
946 else {
947 while(blanklines) {
948 fwrite("\n",1,1,fp);
949 blanklines--;
950 }
951 }
952 }
953 strcat(buffer,"\n");
954 // buffer = translate_out(buffer,4095,h,filename);
955 if(fwrite(buffer,1,strlen(buffer),fp) < 1) {
956 saymsg(MB_ENTER,
957 h,
958 GetPString(IDS_ARGHTEXT),
959 GetPString(IDS_WRITEERRORTEXT));
960 break;
961 }
962 } // for lines
963 }
964 }
965
966 MLEsetwrap(h, fWrap); // Restore
967
968 if (fp)
969 fclose(fp);
970 if (buffer)
971 DosFreeMem(buffer);
972
973 return ok;
974}
975
976
977#pragma alloc_text(FMMLE3,MLEfindfirst,MLEfindnext,SandRDlgProc)
978
979MRESULT EXPENTRY SandRDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
980{
981 /* initiate search(/replace)s in edit mode */
982
983 SRCHPTR *vw;
984
985 if(msg != WM_INITDLG)
986 vw = (SRCHPTR *)WinQueryWindowPtr(hwnd,0);
987 else
988 vw = NULL;
989
990 switch(msg) {
991 case WM_INITDLG:
992 vw = (SRCHPTR *)mp2;
993 if(!vw) {
994 WinDismissDlg(hwnd,0);
995 break;
996 }
997 WinSetWindowPtr(hwnd,0,(PVOID)mp2);
998 WinSendDlgItemMsg(hwnd,SRCH_SEARCH,EM_SETTEXTLIMIT,
999 MPFROM2SHORT(256,0),MPVOID);
1000 WinSendDlgItemMsg(hwnd,SRCH_REPLACE,EM_SETTEXTLIMIT,
1001 MPFROM2SHORT(256,0),MPVOID);
1002 if(*vw->search)
1003 WinSetDlgItemText(hwnd,SRCH_SEARCH,vw->search);
1004 if(!MLEgetreadonly(vw->hwndmle)) {
1005 if(*vw->replace)
1006 WinSetDlgItemText(hwnd,SRCH_REPLACE,vw->replace);
1007 WinSendDlgItemMsg(hwnd,SRCH_SANDR,BM_SETCHECK,
1008 MPFROM2SHORT(vw->sandr,0),MPVOID);
1009 WinSendDlgItemMsg(hwnd,SRCH_RALL,BM_SETCHECK,
1010 MPFROM2SHORT(vw->rall,0),MPVOID);
1011 }
1012 else {
1013 WinEnableWindow(WinWindowFromID(hwnd,SRCH_SANDR),FALSE);
1014 WinEnableWindow(WinWindowFromID(hwnd,SRCH_RALL),FALSE);
1015 WinEnableWindow(WinWindowFromID(hwnd,SRCH_REPLACE),FALSE);
1016 WinShowWindow(WinWindowFromID(hwnd,SRCH_REPLACE),FALSE);
1017 *vw->replace = 0;
1018 vw->sandr = FALSE;
1019 vw->rall = FALSE;
1020 }
1021 memset(&vw->se,0,sizeof(MLE_SEARCHDATA));
1022 vw->se.cb = sizeof(MLE_SEARCHDATA);
1023 vw->se.pchFind = (PCHAR)vw->search;
1024 vw->se.cchFind = (SHORT)strlen(vw->search);
1025 vw->se.pchReplace = (PCHAR)vw->replace;
1026 vw->se.cchReplace = (SHORT)strlen(vw->replace);
1027 vw->se.iptStart = MLEcurpos(vw->hwndmle);
1028 vw->se.iptStop = -1L;
1029 vw->se.cchFound = 0;
1030 PosOverOkay(hwnd);
1031 break;
1032
1033 case WM_CONTROL:
1034 return 0;
1035
1036 case WM_COMMAND:
1037 switch(SHORT1FROMMP(mp1)) {
1038 case IDM_HELP:
1039 saymsg(MB_ENTER | MB_ICONASTERISK,
1040 hwnd,
1041 NullStr,
1042 GetPString(IDS_ENTERSEARCHSTRINGTEXT),
1043 (MLEgetreadonly(vw->hwndmle)) ?
1044 "." : GetPString(IDS_REPLACESTRINGTEXT));
1045 break;
1046
1047 case DID_CANCEL:
1048 WinDismissDlg(hwnd,0);
1049 break;
1050
1051 case DID_OK:
1052 WinShowWindow(hwnd,FALSE);
1053 {
1054 CHAR temp[257];
1055 APIRET ret;
1056
1057 if((USHORT)WinSendDlgItemMsg(hwnd,SRCH_SANDR,BM_QUERYCHECK,
1058 MPVOID,MPVOID))
1059 vw->sandr = TRUE;
1060 else
1061 vw->sandr = FALSE;
1062 if((USHORT)WinSendDlgItemMsg(hwnd,SRCH_RALL,BM_QUERYCHECK,
1063 MPVOID,MPVOID))
1064 vw->rall = TRUE;
1065 else
1066 vw->rall = FALSE;
1067 *vw->replace = 0;
1068 WinQueryDlgItemText(hwnd,SRCH_REPLACE,256,vw->replace);
1069 vw->se.cchReplace = (SHORT)strlen(vw->replace);
1070 WinQueryDlgItemText(hwnd,SRCH_SEARCH,256,temp);
1071 if(*temp) {
1072 strcpy(vw->search,temp);
1073 vw->se.cchFind = (SHORT)strlen(vw->search);
1074 if(!WinSendMsg(vw->hwndmle,MLM_SEARCH,
1075 MPFROMLONG(MLFSEARCH_SELECTMATCH |
1076 (MLFSEARCH_CASESENSITIVE * (vw->fInsensitive == FALSE)) |
1077 (MLFSEARCH_CHANGEALL * (vw->rall != 0))),
1078 MPFROMP(&vw->se))) {
1079 saymsg(MB_ENTER | MB_ICONASTERISK,
1080 hwnd,
1081 NullStr,
1082 GetPString(IDS_STRINGNOTFOUNDTEXT),
1083 vw->search);
1084 WinDismissDlg(hwnd,0);
1085 break;
1086 }
1087 else if(vw->sandr && !vw->rall) {
1088 ret = saymsg(MB_YESNOCANCEL,
1089 hwnd,
1090 NullStr,
1091 GetPString(IDS_CONFIRMREPLACETEXT),
1092 vw->replace);
1093 if(ret == MBID_YES)
1094 MLEinsert(vw->hwndmle,vw->replace);
1095 else if(ret == MBID_CANCEL) {
1096 WinDismissDlg(hwnd,0);
1097 break;
1098 }
1099 WinDismissDlg(hwnd,1);
1100 break;
1101 }
1102 }
1103 WinDismissDlg(hwnd,0);
1104 }
1105 break;
1106 }
1107 return 0;
1108
1109 case WM_CLOSE:
1110 break;
1111 }
1112
1113 return WinDefDlgProc(hwnd,msg,mp1,mp2);
1114}
1115
1116
1117BOOL MLEfindfirst (HWND hwnd,SRCHPTR *vw)
1118{
1119 if(MLEsizeofsel(vw->hwndmle) < 256L) {
1120 MLEgetseltext(vw->hwndmle,vw->search);
1121 vw->search[255] = 0;
1122 }
1123 if(WinDlgBox(HWND_DESKTOP,hwnd,SandRDlgProc,FM3ModHandle,
1124 SRCH_FRAME,MPFROMP(vw)) && *vw->search)
1125 return TRUE;
1126 return FALSE;
1127}
1128
1129
1130INT MLEfindnext (HWND hwnd,SRCHPTR *vw)
1131{
1132 if(!*vw->search)
1133 return -1;
1134 else {
1135 vw->se.iptStart++;
1136 if(!WinSendMsg(vw->hwndmle,MLM_SEARCH,
1137 MPFROMLONG(MLFSEARCH_SELECTMATCH |
1138 (MLFSEARCH_CASESENSITIVE * (vw->fInsensitive == FALSE)) |
1139 (MLFSEARCH_CHANGEALL * (vw->rall))),
1140 MPFROMP(&vw->se)))
1141 saymsg(MB_ENTER | MB_ICONASTERISK,
1142 hwnd,
1143 NullStr,
1144 GetPString(IDS_STRINGNOTFOUNDTEXT),
1145 vw->search);
1146 else if(vw->sandr && !vw->rall) {
1147
1148 APIRET ret;
1149
1150 ret = saymsg(MB_YESNOCANCEL,
1151 hwnd,
1152 NullStr,
1153 GetPString(IDS_CONFIRMREPLACETEXT),
1154 vw->replace);
1155 if(ret == MBID_YES)
1156 MLEinsert(vw->hwndmle,vw->replace);
1157 if(ret != MBID_CANCEL)
1158 return 1;
1159 }
1160 }
1161 return 0;
1162}
Note: See TracBrowser for help on using the repository browser.