source: trunk/dll/mle.c@ 301

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

MLEexportfile: rework to avoid wrap problems

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