source: trunk/dll/mle.c@ 528

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

Count thread usage

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