Listing: 1 (* Release 3.10 *) 2 (*-------------------------------------------------------------------------* 3 * * 4 * COMMUTIL.MOD - COMMS Toolkit utility functions * 5 * * 6 * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. * 7 * All Rights Reserved * 8 * * 9 *--------------------------------------------------------------------------*) 10 11 IMPLEMENTATION MODULE CommUtil; 12 (*%F _OS2*) 13 IMPORT ComSetup,Filenames,FIO,FTSupport,IO,Kermit,Lib,MenuLib,MPRINTF,RS232, 14 ScriptProcessor,SPRINTF,Str,SYSTEM,Term,Timer,Window,WXModem,XModem,YModem; 15 FROM Window IMPORT Color; 16 FROM ScriptProcessor IMPORT ScriptStates; 17 18 CONST 19 BuffSize = 1024; 20 MaxHistory = 128; 21 Template = Window.WinDef(0,0,0,0,Yellow,Black,TRUE,FALSE,FALSE,TRUE,Window.SingleFrame,LightGray,Black); 22 23 TYPE 24 Addr = RECORD 25 CASE :BOOLEAN OF 26 TRUE : a : ADDRESS; | 27 FALSE : Offset, 28 Segment : CARDINAL; | 29 END; 30 END; 31 32 VAR 33 LastC,OldChar : CHAR; 34 Log,Prn : FIO.File; 35 Continue : PROC; 36 LastClock : Timer.ClockRec; 37 CRReceived : BOOLEAN; 38 BuffPtr,HistPtr : CARDINAL; 39 CBuffer : ARRAY[0..BuffSize-1] OF CHAR; 40 Buffer : ARRAY[0..260] OF CHAR; 41 History : ARRAY[0..MaxHistory] OF CHAR; 42 43 (*................................................*) 44 45 PROCEDURE Read(VAR c:CHAR); 46 BEGIN 47 IF ReadAgain THEN 48 c:=OldChar; 49 ReadAgain:=FALSE; 50 RETURN; 51 END; 52 FuncKeyTyped := NotRecognised; 53 c := IO.RdKey(); 54 IF (c<>CHR(13)) AND ((c<' ') OR (c>'~')) THEN 55 IF c=0C THEN 56 c := IO.RdKey(); 57 CASE ORD(c) OF 58 72 : FuncKeyTyped:=Cup; | 59 80 : FuncKeyTyped:=Cdown; | 60 75 : FuncKeyTyped:=Cleft; | 61 77 : FuncKeyTyped:=Cright; | 62 82 : FuncKeyTyped:=InsertKey; | 63 83 : FuncKeyTyped:=DeleteKey; | 64 15 : FuncKeyTyped:=BackTab; | 65 71 : FuncKeyTyped:=HomeKey; | 66 79 : FuncKeyTyped:=EndKey; | 67 73 : FuncKeyTyped:=PageUp; | 68 81 : FuncKeyTyped:=PageDown; | 69 59..68 : FuncKeyTyped:=FKey; 70 c:=CHR(ORD(c)-58); | 71 ELSE 72 FuncKeyTyped:=AltKey; 73 END; 74 ELSIF c=CHR(8) THEN 75 FuncKeyTyped := BackSpace; 76 ELSIF c=3C THEN 77 FuncKeyTyped := Etx; 78 ELSIF c=CHR(27) THEN 79 FuncKeyTyped := Escape; 80 ELSIF c=CHR(127) THEN 81 FuncKeyTyped := Del; 82 ELSIF c=CHR(9) THEN 83 FuncKeyTyped := Tab; 84 END; 85 END; 86 END Read; 87 88 (*........................................*) 89 90 PROCEDURE TwoDigits(c:CARDINAL); 91 BEGIN 92 IO.WrChar(CHR((c DIV 10)+48)); 93 IO.WrChar(CHR((c MOD 10)+48)); 94 END TwoDigits; 95 96 (*...............................................*) 97 98 PROCEDURE StatusLine(which:StatusFields); 99 VAR 100 Drive,Ext : ARRAY[0..3] OF CHAR; 101 Path : ARRAY[0..80] OF CHAR; 102 Name : ARRAY[0..12] OF CHAR; 103 BEGIN 104 Window.Use(StatW); 105 CASE which OF 106 logo : Window.GotoXY(1,1); 107 IO.WrStr(' JPI-Comms Toolkit 3.0 ³ ') | 108 carrier : Window.GotoXY(26,1); 109 IF RS232.CarrierDetect() THEN 110 IO.WrStr('DCD ³ '); 111 ELSE 112 IO.WrStr(' ³ '); 113 END; | 114 script : Name:=''; 115 IF ScriptFile[0]<>0C THEN 116 IF Filenames.ParseFilename(ScriptFile,Drive,Path,Name,Ext) THEN 117 Drive:=''; 118 Path:=''; 119 Filenames.MakeFilename(Drive,Path,Name,Ext,Name); 120 END; 121 END; 122 Window.GotoXY(32,1); 123 MPRINTF.PrintF1('%-12s ³ ',Name); | 124 capture : Name:=''; 125 Window.GotoXY(47,1); 126 IF CaptureFile[0]<>0C THEN 127 IF Filenames.ParseFilename(CaptureFile,Drive,Path,Name,Ext) THEN 128 Drive:=''; 129 Path:=''; 130 Filenames.MakeFilename(Drive,Path,Name,Ext,Name); 131 END; 132 END; 133 MPRINTF.PrintF1('%-12s ³ ',Name); | 134 emul : Window.GotoXY(62,1); 135 CASE Term.Emulation() OF 136 Term.EmVT100 : IO.WrStr('VT100 ³ ') | 137 Term.EmVT52 : IO.WrStr('VT52 ³ ') | 138 Term.EmANSI : IO.WrStr('ANSI ³ ') | 139 END; | 140 time : IF LastClock.Seconds<>Timer.Clock.Seconds THEN 141 Window.GotoXY(70,1); 142 TwoDigits(Timer.Clock.Hours); 143 IO.WrStr(':'); 144 TwoDigits(Timer.Clock.Minutes); 145 IO.WrStr('.'); 146 TwoDigits(Timer.Clock.Seconds); 147 END; | 148 END; 149 Window.Use(TermW); 150 END StatusLine; 151 152 (*................................................*) 153 154 PROCEDURE CheckHistory(VAR s:ARRAY OF CHAR):BOOLEAN; 155 VAR 156 hc,c : CHAR; 157 HistLnth,Lnth : CARDINAL; 158 BEGIN 159 Lnth := Str.Length(s); 160 HistLnth:=HistPtr; 161 IF (HistLnth0 DO 165 DEC(Lnth); 166 DEC(HistLnth); 167 IF CAP(s[Lnth])<>CAP(History[HistLnth]) THEN 168 RETURN(FALSE); 169 END; 170 END; 171 HistPtr := 0; 172 RETURN TRUE; 173 END CheckHistory; 174 175 (*.............................................*) 176 177 PROCEDURE GetHistoryString(VAR s:ARRAY OF CHAR):CARDINAL; 178 VAR 179 Lnth : CARDINAL; 180 BEGIN 181 IF HistPtr>10 THEN 182 Lnth:=10; 183 ELSE 184 Lnth:=HistPtr; 185 END; 186 Lib.Move(ADR(History[HistPtr-Lnth]),ADR(s),Lnth); 187 s[Lnth] := 0C; 188 HistPtr := 0; 189 CRReceived := FALSE; 190 RETURN Lnth; 191 END GetHistoryString; 192 193 (*.............................................*) 194 195 PROCEDURE StoreHistory(c:CHAR); 196 BEGIN 197 IF HistPtr0C) AND (c<>CHR(26)) THEN 229 IF c=CHR(8) THEN 230 IF BuffPtr>0 THEN 231 DEC(BuffPtr); 232 END; 233 IF HistPtr>0 THEN 234 DEC(HistPtr); 235 END; 236 ELSE 237 IF (c=CHR(10)) AND (LastC<>CHR(13)) THEN 238 StoreChar(CHR(13)); 239 END; 240 StoreHistory(c); 241 LastC := c; 242 CBuffer[BuffPtr] := c; 243 INC(BuffPtr); 244 IF BuffPtr=BuffSize THEN 245 IF LogMode=OpenLogging THEN 246 FIO.WrBin(Log,CBuffer,HalfBuffer); 247 END; 248 Lib.Move(ADR(CBuffer[HalfBuffer]),ADR(CBuffer),HalfBuffer); 249 BuffPtr := HalfBuffer; 250 END; 251 END; 252 END; 253 END StoreChar; 254 255 (*................................................*) 256 257 PROCEDURE FlushBuffer; 258 BEGIN 259 IF BuffPtr>0 THEN 260 IF LogMode=OpenLogging THEN 261 FIO.WrBin(Log,CBuffer,BuffPtr); 262 END; 263 BuffPtr := 0; 264 END; 265 END FlushBuffer; 266 267 (*................................................*) 268 269 PROCEDURE SetLogMode(Cmd:LogCommands); 270 BEGIN 271 CASE Cmd OF 272 OpenLogging : IF LogMode=CloseLogging THEN 273 Log := FIO.Open(CaptureFile); 274 IF FIO.IOresult()=0 THEN 275 FIO.Seek(Log,FIO.Size(Log)) 276 ELSE 277 Log := FIO.Create(CaptureFile) 278 END; 279 FlushBuffer; 280 LogMode := OpenLogging; 281 StatusLine(capture); 282 END; | 283 CloseLogging : IF LogMode<>CloseLogging THEN 284 FlushBuffer; 285 FIO.Close(Log); 286 LogMode := CloseLogging; 287 CaptureFile := ''; 288 StatusLine(capture); 289 END; | 290 SuspendLogging : IF LogMode=OpenLogging THEN 291 FlushBuffer; 292 LogMode:=Cmd; 293 END; | 294 ResumeLogging : IF LogMode=SuspendLogging THEN 295 FlushBuffer; 296 LogMode:=OpenLogging; 297 END; | 298 END; 299 END SetLogMode; 300 301 (*................................................*) 302 303 PROCEDURE Screen(Ch:CHAR); 304 VAR 305 i,oldx : CARDINAL; 306 BEGIN 307 oldx := Window.WhereX(); 308 Ch := CHR(CARDINAL(BITSET(ORD(Ch))*BITSET(7FH))); 309 StoreChar(Ch); 310 IF Printing AND (Ch<>CHR(10)) THEN 311 FIO.WrChar(Prn,Ch); 312 END; 313 WrChar(Ch); 314 END Screen; 315 316 (*................................................*) 317 318 PROCEDURE Printer(OnOff:BOOLEAN); 319 BEGIN 320 IF OnOff THEN 321 IF NOT Printing THEN 322 Prn := FIO.Open('PRN:'); 323 Printing:=TRUE; 324 END 325 ELSIF Printing THEN 326 FIO.Close(Prn); 327 Printing:=FALSE; 328 END; 329 END Printer; 330 331 (*................................................*) 332 333 PROCEDURE ErrorMessage(s:ARRAY OF CHAR); 334 CONST 335 EscapeMsg = ' - Press '; 336 ErrTemplate = Window.WinDef(0,0,0,0,White,Red,TRUE,FALSE,FALSE,TRUE,Window.SingleFrame,White,Red); 337 VAR 338 c : CHAR; 339 ErrWinDef : Window.WinDef; 340 ErrWin : Window.WinType; 341 x,y,Lnth : CARDINAL; 342 BEGIN 343 Lnth := Str.Length(s)+Str.Length(EscapeMsg)+4; 344 x := Window.WhereX(); 345 y := Window.WhereY(); 346 Window.ConvertCoords(Window.Used(),x,y,x,y); 347 IF x+Lnth>79 THEN 348 x:=80-Lnth; 349 END; 350 IF y+3>23 THEN 351 y:=21; 352 END; 353 ErrWinDef := ErrTemplate; 354 ErrWinDef.Foreground := Colors.ErrFore; 355 ErrWinDef.Background := Colors.ErrBack; 356 ErrWinDef.FrameFore := Colors.ErrFrFore; 357 ErrWinDef.FrameBack := Colors.ErrFrBack; 358 WITH ErrWinDef DO 359 X1:=x; 360 Y1:=y; 361 X2:=x+Lnth-1; 362 Y2:=y+2; 363 END; 364 ErrWin := Window.Open(ErrWinDef); 365 Window.GotoXY(2,1); 366 IO.WrStr(s); 367 IO.WrStr(EscapeMsg); 368 c := IO.RdKey(); 369 Window.Close(ErrWin); 370 END ErrorMessage; 371 372 (*................................................*) 373 374 PROCEDURE SendString(s:ARRAY OF CHAR); 375 VAR 376 c : CHAR; 377 i,p,Lnth : CARDINAL; 378 BEGIN 379 i:=0; 380 p:=0; 381 Lnth:=Str.Length(s); 382 WHILE i='@') AND (c<='_') THEN 393 c:=CHR(ORD(c)-64); 394 END; 395 ELSIF c='|' THEN 396 c := CHR(13); 397 ELSIF c='~' THEN 398 IF p>0 THEN 399 RS232.SerialWrite(FTSupport.FBuff,p); 400 END; 401 p:=0FFFFH; 402 Lib.Delay(500); 403 END; 404 IF p=0FFFFH THEN 405 p:=0; 406 ELSE 407 FTSupport.FBuff[p]:=c; 408 INC(p); 409 END; 410 END; 411 IF p>0 THEN 412 RS232.SerialWrite(FTSupport.FBuff,p); 413 END; 414 END SendString; 415 416 (*............................................*) 417 418 PROCEDURE TransmitMacro(MacroNo:CARDINAL); 419 BEGIN 420 SendString(ComSetup.Setup.Macros[MacroNo]); 421 END TransmitMacro; 422 423 (*............................................*) 424 425 PROCEDURE SelectFile(MenuX,MenuY:CARDINAL; Title,Wild:ARRAY OF CHAR;VAR f:ARRAY OF CHAR):INTEGER; 426 TYPE 427 ExtName = ARRAY[0..3] OF CHAR; 428 VAR 429 Menu : MenuLib.MenuRec; 430 Result : INTEGER; 431 Cnt,Base,Choice, 432 MenuItems : INTEGER; 433 List : ARRAY[0..99] OF FIO.PathTail; 434 Ext : ARRAY[0..99] OF ExtName; 435 Temp : ARRAY[0..14] OF CHAR; 436 437 (*. . . . . . . . . . . . . . . . . . . . . . . . .*) 438 439 PROCEDURE SortList; 440 (* Ok, I know.. A horrible little bubblesort - good enough for this*) 441 (* job though.. *) 442 VAR 443 i,Max : CARDINAL; 444 Swapped : BOOLEAN; 445 Temp : FIO.PathTail; 446 BEGIN 447 Max:=Cnt-1; 448 Swapped:=TRUE; 449 WHILE (Max>0) AND (Swapped) DO 450 i:=0; 451 Swapped:=FALSE; 452 WHILE i0 THEN 454 Temp:=List[i]; 455 List[i]:=List[i+1]; 456 List[i+1]:=Temp; 457 Swapped := TRUE; 458 END; 459 INC(i); 460 END; 461 DEC(Max); 462 END; 463 END SortList; 464 465 (*. . . . . . . . . . . . . . . . . . . . . . . . .*) 466 467 PROCEDURE GetList(VAR Wild:ARRAY OF CHAR):CARDINAL; 468 VAR 469 Found,GotExt : BOOLEAN; 470 i,Lnth,ExtLnth : CARDINAL; 471 Entry : FIO.DirEntry; 472 c : CHAR; 473 BEGIN 474 Cnt := 0; 475 Found := FIO.ReadFirstEntry(Wild,FIO.FileAttr{},Entry); 476 WHILE Found DO 477 i:=0; 478 GotExt:=FALSE; 479 ExtLnth:=0; 480 List[Cnt] := Entry.Name; 481 Lnth := Str.Length(List[Cnt]); 482 WHILE i0 THEN 500 SortList; 501 END; 502 RETURN Cnt; 503 END GetList; 504 505 (*. . . . . . . . . . . . . . . . . . . . . . . . .*) 506 507 PROCEDURE FillMenu; 508 VAR 509 i : INTEGER; 510 BEGIN 511 Menu.NumUsed := 0; 512 i:=0; 513 WHILE (Base+i0 THEN 525 IF Cnt>8 THEN 526 MenuItems:=8; 527 ELSE 528 MenuItems:=Cnt; 529 END; 530 Base:=0; 531 MenuLib.InitMenu(Menu,Title,MenuX,MenuY,14); 532 Menu.EscapeOK := TRUE; 533 Menu.ExitOnChar := TRUE; 534 Menu.PageKeysOK := (Cnt>8); 535 FillMenu; 536 MenuLib.DispMenu(Menu); 537 LOOP 538 Choice := MenuLib.MenuDrive(Menu); 539 IF Choice>=0 THEN 540 Filenames.MakeFilename('','',List[Base+Choice],Ext[Base+Choice],f); 541 Result := Choice; 542 EXIT; 543 ELSIF (Choice=-2) THEN (* PageUp *) 544 IF (Base>0) THEN 545 IF Base>=8 THEN 546 DEC(Base,8); 547 ELSE 548 Base:=0; 549 END; 550 FillMenu; 551 MenuLib.RepaintMenu(Menu); 552 END; 553 ELSIF (Choice=-3) THEN (* PageDn *) 554 IF (Base+8Cnt THEN 557 Base:=Cnt-8; 558 END; 559 FillMenu; 560 MenuLib.RepaintMenu(Menu); 561 END; 562 ELSE 563 Result:=Choice; EXIT (* escape *) 564 END; 565 END; 566 MenuLib.KillMenu(Menu); 567 RETURN Result; 568 ELSE 569 RETURN -999; (* no files! *) 570 END; 571 END SelectFile; 572 573 (*................................................*) 574 575 PROCEDURE ReadLine(VAR s:ARRAY OF CHAR; Max:CARDINAL); 576 VAR 577 Ch : CHAR; 578 Showit,FirstTime : BOOLEAN; 579 cx,x,y,Lnth : CARDINAL; 580 Temps : ARRAY[0..90] OF CHAR; 581 BEGIN 582 Lib.Fill(ADR(Temps),SIZE(Temps),' '); 583 Lib.Move(ADR(s),ADR(Temps),Str.Length(s)); 584 x:=Window.WhereX(); y:=Window.WhereY(); Lnth:=Str.Length(s); 585 cx:=0; Showit:=TRUE; FirstTime:=TRUE; 586 REPEAT 587 IF Showit THEN 588 Window.GotoXY(x,y); IO.WrStr(Temps); 589 Showit := FALSE; 590 END; 591 IF cx>Lnth THEN cx:=Lnth END; 592 Window.GotoXY(x+cx,y); 593 Read(Ch); 594 CASE FuncKeyTyped OF 595 NotRecognised : IF (((Ch=' ') AND SpacesOK) OR ((Ch>' ') AND (Ch<='~'))) AND (cx0) THEN 597 Lib.Fill(ADR(Temps),SIZE(Temps),' '); 598 Lnth := 0; 599 Showit := TRUE; 600 END; 601 IF cx0 THEN 612 DEC(cx); 613 END; | 614 Cright : IF cx0 THEN 628 Showit := TRUE; 629 DEC(cx); 630 Lib.Move(ADR(Temps[cx+1]),ADR(Temps[cx]),Max-cx-1); 631 Temps[Max-1] := ' '; 632 DEC(Lnth); 633 END; | 634 END; (* cases *) 635 FirstTime := FALSE; 636 UNTIL Ch = CHR(13); 637 Temps[Lnth] := 0C; 638 Lib.Move(ADR(Temps),ADR(s),Lnth+1); 639 SpacesOK := FALSE; 640 END ReadLine; 641 642 (*.........................................................*) 643 644 PROCEDURE PushBack(c:CHAR); 645 BEGIN 646 OldChar := c; 647 ReadAgain := TRUE; 648 END PushBack; 649 650 (*.........................................................*) 651 652 PROCEDURE ReadString(x,y:CARDINAL;Title,Prompt:ARRAY OF CHAR;VAR Result:ARRAY OF CHAR); 653 VAR 654 Def : Window.WinDef; 655 Win : Window.WinType; 656 BEGIN 657 Def := Template; 658 WITH Def DO 659 X1:=x; 660 Y1:=y; 661 X2:=X1+69; 662 Y2:=Y1+2; 663 Foreground := Colors.PromptFore; 664 Background := Colors.PromptBack; 665 FrameFore := Colors.PromptFrFore; 666 FrameBack := Colors.PromptFrBack; 667 END; 668 Win := Window.Open(Def); 669 IF Title[0]<>0C THEN 670 Window.SetTitle(Win,Title,Window.LeftUpperTitle); 671 END; 672 Window.TextColor(Colors.PromptFore); 673 Window.GotoXY(1,1); 674 IO.WrStr(Prompt); 675 Window.TextColor(Colors.PromptHigh); 676 ReadLine(Result,HIGH(Result)+1); 677 Window.Close(Win); 678 END ReadString; 679 680 (*........................................*) 681 682 PROCEDURE PrepareTransferMenu(VAR Menu:MenuLib.MenuRec; Download:BOOLEAN); 683 VAR 684 Title : ARRAY[0..20] OF CHAR; 685 BEGIN 686 IF Download THEN 687 Title := 'Download Menu'; 688 ELSE 689 Title := 'Upload Menu'; 690 END; 691 MenuLib.InitMenu(Menu,Title,1,1,18); 692 Menu.EscapeOK := TRUE; 693 Menu.ExitOnChar := TRUE; 694 IF NOT Download THEN 695 MenuLib.AddOption(Menu,' A - ASCII '); 696 END; 697 MenuLib.AddOption(Menu,' X - Xmodem '); 698 MenuLib.AddOption(Menu,' W - WXmodem '); 699 MenuLib.AddOption(Menu,' Y - Ymodem '); 700 MenuLib.AddOption(Menu,' B - Batch Ymodem '); 701 MenuLib.AddOption(Menu,' K - Kermit '); 702 IF Download THEN 703 MenuLib.AddOption(Menu,' G - Ymodem-g '); 704 END; 705 MenuLib.DispMenu(Menu); 706 END PrepareTransferMenu; 707 708 (*................................................*) 709 710 PROCEDURE DoUpload; 711 VAR 712 Selection : INTEGER; 713 Result : CARDINAL; 714 DoIt : BOOLEAN; 715 Menu : MenuLib.MenuRec; 716 BEGIN 717 PrepareTransferMenu(Menu,FALSE); 718 REPEAT 719 Selection := MenuLib.MenuDrive(Menu); 720 IF Selection<0 THEN 721 DoIt := TRUE 722 ELSE 723 TransferFile[0]:=0C; 724 ReadString(2,Selection+3,'',' File? ',TransferFile); 725 DoIt := TransferFile[0]<>0C; 726 END; 727 UNTIL DoIt; 728 MenuLib.KillMenu(Menu); 729 CASE Selection OF 730 -1 : (* escape *); | 731 0 : Result := FTSupport.ASCIISend(TransferFile); | 732 1 : Result := XModem.XModemSend(TransferFile); | 733 2 : Result := WXModem.WXModemSend(TransferFile); | 734 3 : Result := YModem.YModemSend(TransferFile); | 735 4 : Result := YModem.YModemBatchSend(TransferFile); | 736 5 : Result := Kermit.KermitSend(TransferFile); | 737 END; 738 END DoUpload; 739 740 (*................................................*) 741 742 PROCEDURE DoDownload; 743 VAR 744 Selection : INTEGER; 745 Result : CARDINAL; 746 DoIt : BOOLEAN; 747 Menu : MenuLib.MenuRec; 748 BEGIN 749 PrepareTransferMenu(Menu,TRUE); 750 REPEAT 751 Selection := MenuLib.MenuDrive(Menu); 752 IF Selection<0 THEN 753 DoIt := TRUE; 754 ELSE 755 DoIt := TRUE; 756 IF Selection<3 THEN 757 TransferFile[0]:=0C; 758 ReadString(2,Selection+3,'',' File? ',TransferFile); 759 DoIt := TransferFile[0]<>0C; 760 END; 761 END; 762 UNTIL DoIt; 763 MenuLib.KillMenu(Menu); 764 CASE Selection OF 765 -1 : ; | 766 0 : Result := XModem.XModemReceive(TransferFile); | 767 1 : Result := WXModem.WXModemReceive(TransferFile); | 768 2 : Result := YModem.YModemReceive(TransferFile); | 769 3 : Result := YModem.YModemBatchReceive() | 770 4 : Result := Kermit.KermitReceive(); | 771 5 : Result := YModem.YModemGReceive() | 772 END; 773 END DoDownload; 774 775 (*................................................*) 776 777 PROCEDURE InitUtil; 778 BEGIN 779 (* Default IO routines *) 780 WrChar := IO.WrChar; 781 ScriptFile:=''; 782 CaptureFile:=''; 783 LogMode := CloseLogging; 784 HistPtr := 0; 785 BuffPtr := 0; 786 Printing := FALSE; 787 CRReceived := FALSE; 788 LastClock.Seconds := 0FFFFH; 789 LastC:=0C; 790 END InitUtil; 791 792 (*............................................*) 793 794 795 PROCEDURE IsColor () : BOOLEAN ; 796 VAR 797 R : SYSTEM.Registers ; 798 BEGIN 799 R.AH := 15 ; 800 Lib.Intr(R,10H) ; 801 RETURN (R.AL <> 0)AND(R.AL<> 2)AND(R.AL <> 5)AND(R.AL <> 6)AND(R.AL <> 7) ; 802 END IsColor ; 803 804 CONST 805 ColorColorDef = ColorDef(LightGray,Black, (* TermFore/Back *) 806 White,Blue, (* StatFore/Back *) 807 White,Blue, (* GenFore/Back *) 808 White,Blue, (* GenFrFore/Back *) 809 LightCyan,Black, (* PromptFore/Back *) 810 Yellow, (* PromptHigh *) 811 LightGray,Black, (* PromptFrFore/Back *) 812 White,Red, (* ErrFore/Back *) 813 White,Red, (* ErrFrFore/Back *) 814 Yellow,Black, (* MacroFore/Back *) 815 LightGray,Black, (* MacroFrFore/Back *) 816 White,Blue, (* MacroHighFore/Back *) 817 LightCyan,Black, (* MacroLowFore/Back *) 818 LightCyan,Black, (* FTStatFore/Back *) 819 LightGray,Black, (* FTStatFrFore/Back *) 820 Yellow,Red, (* FTStatHigh/Bar *) 821 LightCyan,Black, (* MenuFore/Back *) 822 LightGray,Black, (* MenuFrFore/Back *) 823 Yellow,Black, (* MenuHighFore/Back *) 824 White,Blue, (* MenuSelFore/Back *) 825 Yellow,Blue); (* MenuHSelFore/Back *) 826 MonoColorDef = ColorDef(LightGray,Black, (* TermFore/Back *) 827 Black,LightGray, (* StatFore/Back *) 828 Black,LightGray, (* GenFore/Back *) 829 White,Blue, (* GenFrFore/Back *) 830 LightGray,Black, (* PromptFore/Back *) 831 White, (* PromptHigh *) 832 LightGray,Black, (* PromptFrFore/Back *) 833 White,Black, (* ErrFore/Back *) 834 White,Black, (* ErrFrFore/Back *) 835 White,Black, (* MacroFore/Back *) 836 LightGray,Black, (* MacroFrFore/Back *) 837 Blue,Black, (* MacroHighFore/Back *) 838 LightGray,Black, (* MacroLowFore/Back *) 839 LightGray,Black, (* FTStatFore/Back *) 840 LightGray,Black, (* FTStatFrFore/Back *) 841 Yellow,Red, (* FTStatHigh/Bar *) 842 White,Black, (* MenuFore/Back *) 843 LightGray,Black, (* MenuFrFore/Back *) 844 White,Black, (* MenuHighFore/Back *) 845 Blue,Black, (* MenuSelFore/Back *) 846 Blue,Black); (* MenuHSelFore/Back *) 847 848 (*............................................*) 849 850 PROCEDURE Alarm; 851 VAR 852 i : CARDINAL; 853 BEGIN 854 FOR i:=0 TO 7 DO 855 Lib.Sound(300); 856 Lib.Delay(50); 857 Lib.NoSound; 858 Lib.Delay(50); 859 Lib.Sound(300); 860 Lib.Delay(50); 861 Lib.NoSound; 862 Lib.Delay(300); 863 END; 864 END Alarm; 865 866 (*...............................................*) 867 868 BEGIN (* CommUtil *) 869 IF IsColor() THEN 870 Colors := ColorColorDef; 871 ELSE 872 Colors := MonoColorDef; 873 END; 874 WITH Colors DO 875 MenuLib.MenuColors.NormFore := MenuFore; 876 MenuLib.MenuColors.NormBack := MenuBack; 877 MenuLib.MenuColors.FrameFore := MenuFrFore; 878 MenuLib.MenuColors.FrameBack := MenuFrBack; 879 MenuLib.MenuColors.HighFore := MenuHighFore; 880 MenuLib.MenuColors.HighBack := MenuHighBack; 881 MenuLib.MenuColors.SelFore := MenuSelFore; 882 MenuLib.MenuColors.SelBack := MenuSelBack; 883 MenuLib.MenuColors.HSelFore := MenuHSelFore; 884 MenuLib.MenuColors.HSelBack := MenuHSelBack; 885 END; 886 SpacesOK := FALSE; 887 ReadAgain := FALSE; 888 END CommUtil. 889 890 (*%E*) 891 (*%T _OS2*) 892 (* OS/2 version *) 893 IMPORT ComSetup,Filenames,FIO,FTSupport,IO,Kermit,Lib,MenuLib,MPRINTF, 894 RS232,ScriptProcessor,SPRINTF,Str,SYSTEM,Term,Timer,Vio,Window, 895 WXModem,XModem,YModem; 896 FROM Window IMPORT Color; ***** ^ duplicate identifier 897 FROM ScriptProcessor IMPORT ScriptStates; ***** ^ duplicate identifier 898 899 CONST 900 BuffSize = 1024; 901 MaxHistory = 128; 902 Template = Window.WinDef(0,0,0,0,Yellow,Black,TRUE,FALSE,FALSE,TRUE,Window.SingleFrame,LightGray,Black); ***** ^ not supported yet ***** ^ not supported yet ***** ^ undeclared identifier ***** ^ undeclared identifier ***** ^ not supported yet ***** ^ not supported yet ***** ^ undeclared identifier ***** ^ undeclared identifier 903 904 TYPE 905 Addr = RECORD 906 CASE :BOOLEAN OF ***** ^ not supported yet ***** ^ 'POINTER' expected 907 TRUE : a : ADDRESS; | 908 FALSE : Offset, 909 Segment : CARDINAL; | 910 END; 911 END; 912 913 VAR 914 LastC,OldChar : CHAR; 915 Log,Prn : FIO.File; 916 Continue : PROC; 917 LastClock : Timer.ClockRec; 918 CRReceived : BOOLEAN; 919 BuffPtr,HistPtr : CARDINAL; 920 CBuffer : ARRAY[0..BuffSize-1] OF CHAR; 921 Buffer : ARRAY[0..260] OF CHAR; 922 History : ARRAY[0..MaxHistory] OF CHAR; 923 924 (*................................................*) 925 926 PROCEDURE Read(VAR c:CHAR); 927 BEGIN 928 IF ReadAgain THEN 929 c:=OldChar; 930 ReadAgain:=FALSE; 931 RETURN; 932 END; 933 FuncKeyTyped := NotRecognised; 934 c := IO.RdKey(); 935 IF (c<>CHR(13)) AND ((c<' ') OR (c>'~')) THEN 936 IF c=0C THEN 937 c := IO.RdKey(); 938 CASE ORD(c) OF 939 72 : FuncKeyTyped:=Cup; | 940 80 : FuncKeyTyped:=Cdown; | 941 75 : FuncKeyTyped:=Cleft; | 942 77 : FuncKeyTyped:=Cright; | 943 82 : FuncKeyTyped:=InsertKey; | 944 83 : FuncKeyTyped:=DeleteKey; | 945 15 : FuncKeyTyped:=BackTab; | 946 71 : FuncKeyTyped:=HomeKey; | 947 79 : FuncKeyTyped:=EndKey; | 948 73 : FuncKeyTyped:=PageUp; | 949 81 : FuncKeyTyped:=PageDown; | 950 59..68 : FuncKeyTyped:=FKey; 951 c := CHR(ORD(c)-58); | 952 ELSE 953 FuncKeyTyped:=AltKey; 954 END; 955 ELSIF c=CHR(8) THEN 956 FuncKeyTyped := BackSpace; 957 ELSIF c=3C THEN 958 FuncKeyTyped := Etx; 959 ELSIF c=CHR(27) THEN 960 FuncKeyTyped := Escape; 961 ELSIF c=CHR(127) THEN 962 FuncKeyTyped := Del; 963 ELSIF c=CHR(9) THEN 964 FuncKeyTyped := Tab; 965 END; 966 END; 967 END Read; 968 969 (*........................................*) 970 971 PROCEDURE TwoDigits(c:CARDINAL); 972 BEGIN 973 IO.WrChar(CHR((c DIV 10)+48)); 974 IO.WrChar(CHR((c MOD 10)+48)); 975 END TwoDigits; 976 977 (*...............................................*) 978 979 PROCEDURE StatusLine(which:StatusFields); 980 VAR 981 Drive,Ext : ARRAY[0..3] OF CHAR; 982 Path : ARRAY[0..80] OF CHAR; 983 Name : ARRAY[0..12] OF CHAR; 984 BEGIN 985 Window.Use(StatW); 986 CASE which OF 987 logo : Window.GotoXY(1,1); 988 IO.WrStr(' JPI-Comms Toolkit 3.0 ³ '); | 989 carrier : Window.GotoXY(26,1); 990 IF RS232.CarrierDetect() THEN 991 IO.WrStr('DCD ³ '); 992 ELSE 993 IO.WrStr(' ³ '); 994 END; | 995 script : Name:=''; 996 IF ScriptFile[0]<>0C THEN 997 IF Filenames.ParseFilename(ScriptFile,Drive,Path,Name,Ext) THEN 998 Drive:=''; 999 Path:=''; 1000 Filenames.MakeFilename(Drive,Path,Name,Ext,Name); 1001 END; 1002 END; 1003 Window.GotoXY(32,1); 1004 MPRINTF.PrintF1('%-12s ³ ',Name); | 1005 capture : Name:=''; 1006 Window.GotoXY(47,1); 1007 IF CaptureFile[0]<>0C THEN 1008 IF Filenames.ParseFilename(CaptureFile,Drive,Path,Name,Ext) THEN 1009 Drive:=''; 1010 Path:=''; 1011 Filenames.MakeFilename(Drive,Path,Name,Ext,Name); 1012 END; 1013 END; 1014 MPRINTF.PrintF1('%-12s ³ ',Name); | 1015 emul : Window.GotoXY(62,1); 1016 CASE Term.Emulation() OF 1017 Term.EmVT100 : IO.WrStr('VT100 ³ '); | 1018 Term.EmVT52 : IO.WrStr('VT52 ³ '); | 1019 Term.EmANSI : IO.WrStr('ANSI ³ '); | 1020 END; | 1021 time : IF LastClock.Seconds<>Timer.Clock.Seconds THEN 1022 Window.GotoXY(70,1); 1023 TwoDigits(Timer.Clock.Hours); 1024 IO.WrStr(':'); 1025 TwoDigits(Timer.Clock.Minutes); 1026 IO.WrStr('.'); 1027 TwoDigits(Timer.Clock.Seconds); 1028 END; | 1029 END; 1030 Window.Use(TermW); 1031 END StatusLine; 1032 1033 (*................................................*) 1034 1035 PROCEDURE CheckHistory(VAR s:ARRAY OF CHAR):BOOLEAN; 1036 VAR 1037 hc,c : CHAR; 1038 HistLnth,Lnth : CARDINAL; 1039 BEGIN 1040 Lnth := Str.Length(s); 1041 HistLnth:=HistPtr; 1042 IF (HistLnth0 DO 1046 DEC(Lnth); 1047 DEC(HistLnth); 1048 IF CAP(s[Lnth])<>CAP(History[HistLnth]) THEN 1049 RETURN(FALSE); 1050 END; 1051 END; 1052 HistPtr := 0; 1053 RETURN TRUE; 1054 END CheckHistory; 1055 1056 (*.............................................*) 1057 1058 PROCEDURE GetHistoryString(VAR s:ARRAY OF CHAR):CARDINAL; 1059 VAR 1060 Lnth : CARDINAL; 1061 BEGIN 1062 IF HistPtr>10 THEN 1063 Lnth:=10; 1064 ELSE 1065 Lnth:=HistPtr; 1066 END; 1067 Lib.Move(ADR(History[HistPtr-Lnth]),ADR(s),Lnth); 1068 s[Lnth] := 0C; 1069 HistPtr := 0; 1070 CRReceived := FALSE; 1071 RETURN Lnth; 1072 END GetHistoryString; 1073 1074 (*.............................................*) 1075 1076 PROCEDURE StoreHistory(c:CHAR); 1077 BEGIN 1078 IF HistPtr0C) AND (c<>CHR(26)) THEN 1110 IF c=CHR(8) THEN 1111 IF BuffPtr>0 THEN 1112 DEC(BuffPtr); 1113 END; 1114 IF HistPtr>0 THEN 1115 DEC(HistPtr); 1116 END; 1117 ELSE 1118 IF (c=CHR(10)) AND (LastC<>CHR(13)) THEN 1119 StoreChar(CHR(13)); 1120 END; 1121 StoreHistory(c); 1122 LastC := c; 1123 CBuffer[BuffPtr] := c; 1124 INC(BuffPtr); 1125 IF BuffPtr=BuffSize THEN 1126 IF LogMode=OpenLogging THEN 1127 FIO.WrBin(Log,CBuffer,HalfBuffer); 1128 END; 1129 Lib.Move(ADR(CBuffer[HalfBuffer]),ADR(CBuffer),HalfBuffer); 1130 BuffPtr := HalfBuffer; 1131 END; 1132 END; 1133 END; 1134 END StoreChar; 1135 1136 (*................................................*) 1137 1138 PROCEDURE FlushBuffer; 1139 BEGIN 1140 IF BuffPtr>0 THEN 1141 IF LogMode=OpenLogging THEN 1142 FIO.WrBin(Log,CBuffer,BuffPtr); 1143 END; 1144 BuffPtr := 0; 1145 END; 1146 END FlushBuffer; 1147 1148 (*................................................*) 1149 1150 PROCEDURE SetLogMode(Cmd:LogCommands); 1151 BEGIN 1152 CASE Cmd OF 1153 OpenLogging : IF LogMode=CloseLogging THEN 1154 Log := FIO.Open(CaptureFile); 1155 IF FIO.IOresult()=0 THEN 1156 FIO.Seek(Log,FIO.Size(Log)) 1157 ELSE 1158 Log := FIO.Create(CaptureFile) 1159 END; 1160 FlushBuffer; 1161 LogMode := OpenLogging; 1162 StatusLine(capture); 1163 END; | 1164 CloseLogging : IF LogMode<>CloseLogging THEN 1165 FlushBuffer; 1166 FIO.Close(Log); 1167 LogMode := CloseLogging; 1168 CaptureFile := ''; 1169 StatusLine(capture); 1170 END; | 1171 SuspendLogging : IF LogMode=OpenLogging THEN 1172 FlushBuffer; 1173 LogMode:=Cmd 1174 END; | 1175 ResumeLogging : IF LogMode=SuspendLogging THEN 1176 FlushBuffer; 1177 LogMode:=OpenLogging 1178 END; | 1179 1180 END; 1181 END SetLogMode; 1182 1183 (*................................................*) 1184 1185 PROCEDURE Screen(Ch:CHAR); 1186 VAR 1187 i,oldx : CARDINAL; 1188 BEGIN 1189 oldx := Window.WhereX(); 1190 Ch := CHR(CARDINAL(BITSET(ORD(Ch))*BITSET(7FH))); 1191 StoreChar(Ch); 1192 IF Printing AND (Ch<>CHR(10)) THEN 1193 FIO.WrChar(Prn,Ch); 1194 END; 1195 WrChar(Ch); 1196 END Screen; 1197 1198 (*................................................*) 1199 1200 PROCEDURE Printer(OnOff:BOOLEAN); 1201 BEGIN 1202 IF OnOff THEN 1203 IF NOT Printing THEN 1204 Prn := FIO.Open('PRN:'); 1205 Printing:=TRUE 1206 END 1207 ELSIF Printing THEN 1208 FIO.Close(Prn); 1209 Printing:=FALSE; 1210 END; 1211 END Printer; 1212 1213 (*................................................*) 1214 1215 PROCEDURE ErrorMessage(s:ARRAY OF CHAR); 1216 CONST 1217 EscapeMsg = ' - Press '; 1218 ErrTemplate = Window.WinDef(0,0,0,0,Window.White,Window.Red,TRUE,FALSE,FALSE,TRUE,Window.SingleFrame,Window.White,Window.Red); 1219 VAR 1220 c : CHAR; 1221 ErrWinDef : Window.WinDef; 1222 ErrWin : Window.WinType; 1223 x,y,Lnth : CARDINAL; 1224 BEGIN 1225 Lnth := Str.Length(s)+Str.Length(EscapeMsg)+4; 1226 x := Window.WhereX(); 1227 y := Window.WhereY(); 1228 Window.ConvertCoords(Window.Used(),x,y,x,y); 1229 IF x+Lnth>79 THEN 1230 x:=80-Lnth; 1231 END; 1232 IF y+3>23 THEN 1233 y:=21; 1234 END; 1235 ErrWinDef := ErrTemplate; 1236 ErrWinDef.Foreground := Colors.ErrFore; 1237 ErrWinDef.Background := Colors.ErrBack; 1238 ErrWinDef.FrameFore := Colors.ErrFrFore; 1239 ErrWinDef.FrameBack := Colors.ErrFrBack; 1240 WITH ErrWinDef DO 1241 X1:=x; 1242 Y1:=y; 1243 X2:=x+Lnth-1; 1244 Y2:=y+2; 1245 END; 1246 ErrWin := Window.Open(ErrWinDef); 1247 Window.GotoXY(2,1); 1248 IO.WrStr(s); 1249 IO.WrStr(EscapeMsg); 1250 c := IO.RdKey(); 1251 Window.Close(ErrWin); 1252 END ErrorMessage; 1253 1254 (*................................................*) 1255 1256 PROCEDURE SendString(s:ARRAY OF CHAR); 1257 VAR 1258 c : CHAR; 1259 i,p,Lnth : CARDINAL; 1260 BEGIN 1261 i:=0; 1262 p:=0; 1263 Lnth:=Str.Length(s); 1264 WHILE i='@') AND (c<='_') THEN 1275 c:=CHR(ORD(c)-64); 1276 END; 1277 ELSIF c='|' THEN 1278 c := CHR(13); 1279 ELSIF c='~' THEN 1280 IF p>0 THEN 1281 RS232.SerialWrite(FTSupport.FBuff,p); 1282 END; 1283 p:=0FFFFH; 1284 Lib.Delay(500); 1285 END; 1286 IF p=0FFFFH THEN 1287 p:=0 1288 ELSE 1289 FTSupport.FBuff[p]:=c; INC(p) 1290 END; 1291 END; 1292 IF p>0 THEN 1293 RS232.SerialWrite(FTSupport.FBuff,p); 1294 END; 1295 END SendString; 1296 1297 (*............................................*) 1298 1299 PROCEDURE TransmitMacro(MacroNo:CARDINAL); 1300 BEGIN 1301 SendString(ComSetup.Setup.Macros[MacroNo]); 1302 END TransmitMacro; 1303 1304 (*............................................*) 1305 1306 PROCEDURE SelectFile(MenuX,MenuY:CARDINAL; Title,Wild:ARRAY OF CHAR;VAR f:ARRAY OF CHAR):INTEGER; 1307 TYPE 1308 ExtName = ARRAY[0..3] OF CHAR; 1309 VAR 1310 Menu : MenuLib.MenuRec; 1311 Result : INTEGER; 1312 Cnt,Base,Choice, 1313 MenuItems : INTEGER; 1314 List : ARRAY[0..99] OF FIO.PathTail; 1315 Ext : ARRAY[0..99] OF ExtName; 1316 Temp : ARRAY[0..14] OF CHAR; 1317 1318 (*. . . . . . . . . . . . . . . . . . . . . . . . .*) 1319 1320 PROCEDURE SortList; 1321 (* Ok, I know.. A horrible little bubblesort - good enough for this job though.. *) 1322 VAR 1323 i,Max : CARDINAL; 1324 Swapped : BOOLEAN; 1325 Temp : FIO.PathTail; 1326 BEGIN 1327 Max:=Cnt-1; 1328 Swapped:=TRUE; 1329 WHILE (Max>0) AND (Swapped) DO 1330 i:=0; 1331 Swapped:=FALSE; 1332 WHILE i0 THEN 1334 Temp:=List[i]; 1335 List[i]:=List[i+1]; 1336 List[i+1]:=Temp; 1337 Swapped := TRUE; 1338 END; 1339 INC(i); 1340 END; 1341 DEC(Max); 1342 END; 1343 END SortList; 1344 1345 (*. . . . . . . . . . . . . . . . . . . . . . . . .*) 1346 1347 PROCEDURE GetList(VAR Wild:ARRAY OF CHAR):CARDINAL; 1348 VAR 1349 Found,GotExt : BOOLEAN; 1350 i,Lnth,ExtLnth : CARDINAL; 1351 Entry : FIO.DirEntry; 1352 c : CHAR; 1353 BEGIN 1354 Cnt := 0; 1355 Found := FIO.ReadFirstEntry(Wild,FIO.FileAttr{},Entry); 1356 WHILE Found DO 1357 i:=0; 1358 GotExt:=FALSE; 1359 ExtLnth:=0; 1360 List[Cnt] := Entry.Name; 1361 Lnth := Str.Length(List[Cnt]); 1362 WHILE i0 THEN 1379 SortList; 1380 END; 1381 RETURN Cnt; 1382 END GetList; 1383 1384 (*. . . . . . . . . . . . . . . . . . . . . . . . .*) 1385 1386 PROCEDURE FillMenu; 1387 VAR 1388 i : INTEGER; 1389 BEGIN 1390 Menu.NumUsed := 0; 1391 i:=0; 1392 WHILE (Base+i0 THEN 1404 IF Cnt>8 THEN 1405 MenuItems:=8; 1406 ELSE 1407 MenuItems:=Cnt; 1408 END; 1409 Base:=0; 1410 MenuLib.InitMenu(Menu,Title,MenuX,MenuY,14); 1411 Menu.EscapeOK := TRUE; 1412 Menu.ExitOnChar := TRUE; 1413 Menu.PageKeysOK := (Cnt>8); 1414 FillMenu; 1415 MenuLib.DispMenu(Menu); 1416 LOOP 1417 Choice := MenuLib.MenuDrive(Menu); 1418 IF Choice>=0 THEN 1419 Filenames.MakeFilename('','',List[Base+Choice],Ext[Base+Choice],f); 1420 Result := Choice; 1421 EXIT 1422 ELSIF (Choice=-2) THEN (* PageUp *) 1423 IF (Base>0) THEN 1424 IF Base>=8 THEN 1425 DEC(Base,8); 1426 ELSE 1427 Base:=0; 1428 END; 1429 FillMenu; 1430 MenuLib.RepaintMenu(Menu); 1431 END 1432 ELSIF (Choice=-3) THEN (* PageDn *) 1433 IF (Base+8Cnt THEN 1436 Base:=Cnt-8; 1437 END; 1438 FillMenu; 1439 MenuLib.RepaintMenu(Menu); 1440 END 1441 ELSE 1442 Result:=Choice; 1443 EXIT; (* escape *) 1444 END; 1445 END; 1446 MenuLib.KillMenu(Menu); 1447 RETURN Result 1448 ELSE 1449 RETURN -999 (* no files! *) 1450 END; 1451 END SelectFile; 1452 1453 (*................................................*) 1454 1455 PROCEDURE ReadLine(VAR s:ARRAY OF CHAR; Max:CARDINAL); 1456 VAR 1457 Ch : CHAR; 1458 Showit,FirstTime : BOOLEAN; 1459 cx,x,y,Lnth : CARDINAL; 1460 Temps : ARRAY[0..90] OF CHAR; 1461 BEGIN 1462 Lib.Fill(ADR(Temps),SIZE(Temps),' '); 1463 Lib.Move(ADR(s),ADR(Temps),Str.Length(s)); 1464 x := Window.WhereX(); 1465 y := Window.WhereY(); 1466 Lnth:=Str.Length(s); 1467 cx:=0; 1468 Showit:=TRUE; 1469 FirstTime:=TRUE; 1470 REPEAT 1471 IF Showit THEN 1472 Window.GotoXY(x,y); 1473 IO.WrStr(Temps); 1474 Showit := FALSE; 1475 END; 1476 IF cx>Lnth THEN 1477 cx:=Lnth; 1478 END; 1479 Window.GotoXY(x+cx,y); 1480 Read(Ch); 1481 CASE FuncKeyTyped OF 1482 NotRecognised : IF (((Ch=' ') AND SpacesOK) OR ((Ch>' ') AND (Ch<='~'))) AND (cx0) THEN 1484 Lib.Fill(ADR(Temps),SIZE(Temps),' '); 1485 Lnth := 0; 1486 Showit := TRUE; 1487 END; 1488 IF cx0 THEN 1499 DEC(cx); 1500 END; | 1501 Cright : IF cx0 THEN 1515 Showit := TRUE; 1516 DEC(cx); 1517 Lib.Move(ADR(Temps[cx+1]),ADR(Temps[cx]),Max-cx-1); 1518 Temps[Max-1] := ' '; 1519 DEC(Lnth); 1520 END; | 1521 END; (*CASE*) 1522 FirstTime := FALSE; 1523 UNTIL Ch = CHR(13); 1524 Temps[Lnth] := 0C; 1525 Lib.Move(ADR(Temps),ADR(s),Lnth+1); 1526 SpacesOK := FALSE; 1527 END ReadLine; 1528 1529 (*.........................................................*) 1530 1531 PROCEDURE PushBack(c:CHAR); 1532 BEGIN 1533 OldChar := c; 1534 ReadAgain := TRUE; 1535 END PushBack; 1536 1537 (*.........................................................*) 1538 1539 PROCEDURE ReadString(x,y:CARDINAL; Title,Prompt:ARRAY OF CHAR;VAR Result:ARRAY OF CHAR); 1540 VAR 1541 Def : Window.WinDef; 1542 Win : Window.WinType; 1543 BEGIN 1544 Def := Template; 1545 WITH Def DO 1546 X1:=x; 1547 Y1:=y; 1548 X2:=X1+69; 1549 Y2:=Y1+2; 1550 Foreground := Colors.PromptFore; 1551 Background := Colors.PromptBack; 1552 FrameFore := Colors.PromptFrFore; 1553 FrameBack := Colors.PromptFrBack; 1554 END; 1555 Win := Window.Open(Def); 1556 IF Title[0]<>0C THEN 1557 Window.SetTitle(Win,Title,Window.LeftUpperTitle); 1558 END; 1559 Window.TextColor(Colors.PromptFore); 1560 Window.GotoXY(1,1); IO.WrStr(Prompt); 1561 Window.TextColor(Colors.PromptHigh); 1562 ReadLine(Result,HIGH(Result)+1); 1563 Window.Close(Win); 1564 END ReadString; 1565 1566 (*........................................*) 1567 1568 PROCEDURE PrepareTransferMenu(VAR Menu:MenuLib.MenuRec; Download:BOOLEAN); 1569 VAR 1570 Title : ARRAY[0..20] OF CHAR; 1571 BEGIN 1572 IF Download THEN 1573 Title := 'Download Menu' 1574 ELSE 1575 Title := 'Upload Menu' 1576 END; 1577 MenuLib.InitMenu(Menu,Title,1,1,18); 1578 Menu.EscapeOK := TRUE; 1579 Menu.ExitOnChar := TRUE; 1580 IF NOT Download THEN 1581 MenuLib.AddOption(Menu,' A - ASCII '); 1582 END; 1583 MenuLib.AddOption(Menu,' X - Xmodem '); 1584 MenuLib.AddOption(Menu,' W - WXmodem '); 1585 MenuLib.AddOption(Menu,' Y - Ymodem '); 1586 MenuLib.AddOption(Menu,' B - Batch Ymodem '); 1587 MenuLib.AddOption(Menu,' K - Kermit '); 1588 IF Download THEN 1589 MenuLib.AddOption(Menu,' G - Ymodem-g '); 1590 END; 1591 MenuLib.DispMenu(Menu); 1592 END PrepareTransferMenu; 1593 1594 (*................................................*) 1595 1596 PROCEDURE DoUpload; 1597 VAR 1598 Selection : INTEGER; 1599 Result : CARDINAL; 1600 DoIt : BOOLEAN; 1601 Menu : MenuLib.MenuRec; 1602 BEGIN 1603 PrepareTransferMenu(Menu,FALSE); 1604 REPEAT 1605 Selection := MenuLib.MenuDrive(Menu); 1606 IF Selection < 0 THEN 1607 DoIt := TRUE 1608 ELSE 1609 TransferFile[0]:=0C; 1610 ReadString(2,Selection+3,'',' File? ',TransferFile); 1611 DoIt := TransferFile[0] # 0C; 1612 END; 1613 UNTIL DoIt; 1614 MenuLib.KillMenu(Menu); 1615 CASE Selection OF 1616 -1 : (* escape *); | 1617 0 : Result := FTSupport.ASCIISend(TransferFile); | 1618 1 : Result := XModem.XModemSend(TransferFile); | 1619 2 : Result := WXModem.WXModemSend(TransferFile); | 1620 3 : Result := YModem.YModemSend(TransferFile); | 1621 4 : Result := YModem.YModemBatchSend(TransferFile); | 1622 5 : Result := Kermit.KermitSend(TransferFile); | 1623 END; 1624 END DoUpload; 1625 1626 (*................................................*) 1627 1628 PROCEDURE DoDownload; 1629 VAR 1630 Selection : INTEGER; 1631 Result : CARDINAL; 1632 DoIt : BOOLEAN; 1633 Menu : MenuLib.MenuRec; 1634 BEGIN 1635 PrepareTransferMenu(Menu,TRUE); 1636 REPEAT 1637 Selection := MenuLib.MenuDrive(Menu); 1638 IF Selection<0 THEN 1639 DoIt := TRUE 1640 ELSE 1641 DoIt := TRUE; 1642 IF Selection<3 THEN 1643 TransferFile[0]:=0C; 1644 ReadString(2,Selection+3,'',' File? ',TransferFile); 1645 DoIt := TransferFile[0]<>0C; 1646 END; 1647 END; 1648 UNTIL DoIt; 1649 MenuLib.KillMenu(Menu); 1650 CASE Selection OF 1651 -1 : ; | 1652 0 : Result := XModem.XModemReceive(TransferFile); | 1653 1 : Result := WXModem.WXModemReceive(TransferFile); | 1654 2 : Result := YModem.YModemReceive(TransferFile); | 1655 3 : Result := YModem.YModemBatchReceive() | 1656 4 : Result := Kermit.KermitReceive(); | 1657 5 : Result := YModem.YModemGReceive() | 1658 END; 1659 END DoDownload; 1660 1661 (*................................................*) 1662 1663 PROCEDURE InitUtil; 1664 BEGIN 1665 (* Default IO routines *) 1666 WrChar := IO.WrChar; 1667 ScriptFile:=''; 1668 CaptureFile:=''; 1669 LogMode := CloseLogging; 1670 HistPtr := 0; 1671 BuffPtr := 0; 1672 Printing := FALSE; 1673 CRReceived := FALSE; 1674 LastClock.Seconds := 0FFFFH; 1675 LastC:=0C; 1676 END InitUtil; 1677 1678 (*............................................*) 1679 1680 PROCEDURE IsColor () : BOOLEAN ; 1681 VAR 1682 m : Vio.MODEINFO; 1683 r : CARDINAL; 1684 BEGIN 1685 m.b := SIZE(m); 1686 r := Vio.GetMode(m,0); 1687 RETURN NOT (2 IN BITSET(m.type)); 1688 END IsColor ; 1689 1690 CONST 1691 ColorColorDef = ColorDef(LightGray,Black,White,Blue,White,Blue,White,Blue,LightCyan,Black,Yellow,LightGray,Black,White,Red, 1692 White,Red,Yellow,Black,LightGray,Black,White,Blue,LightCyan,Black,LightCyan,Black,LightGray,Black, 1693 Yellow,Red,LightCyan,Black,LightGray,Black,Yellow,Black,White,Blue,Yellow,Blue); 1694 MonoColorDef = ColorDef(LightGray,Black,Black,LightGray,Black,LightGray,Black,LightGray,LightGray,Black,White,LightGray, 1695 Black,White,Black,White,Black,White,Black,LightGray,Black,Blue,Black,LightGray,Black,LightGray, 1696 Black,LightGray,Black,White,Black,LightGray,Black,LightGray,Black,White,Black,Blue,Black,Blue,Black); 1697 1698 (*...............................................*) 1699 1700 PROCEDURE Alarm; 1701 VAR 1702 i : CARDINAL; 1703 BEGIN 1704 FOR i:=0 TO 7 DO 1705 Lib.Speaker(300,50); 1706 Lib.Delay(50); 1707 Lib.Speaker(300,50); 1708 Lib.Delay(300); 1709 END; 1710 END Alarm; 1711 1712 (*...............................................*) 1713 1714 BEGIN (* CommUtil *) 1715 IF IsColor() THEN 1716 Colors := ColorColorDef 1717 ELSE 1718 Colors := MonoColorDef 1719 END; 1720 WITH Colors DO 1721 MenuLib.MenuColors.NormFore := MenuFore; 1722 MenuLib.MenuColors.NormBack := MenuBack; 1723 MenuLib.MenuColors.FrameFore := MenuFrFore; 1724 MenuLib.MenuColors.FrameBack := MenuFrBack; 1725 MenuLib.MenuColors.HighFore := MenuHighFore; 1726 MenuLib.MenuColors.HighBack := MenuHighBack; 1727 MenuLib.MenuColors.SelFore := MenuSelFore; 1728 MenuLib.MenuColors.SelBack := MenuSelBack; 1729 MenuLib.MenuColors.HSelFore := MenuHSelFore; 1730 MenuLib.MenuColors.HSelBack := MenuHSelBack; 1731 END; 1732 SpacesOK := FALSE; 1733 ReadAgain := FALSE; 1734 END CommUtil. 1735 (*%E*) 1736 12 errors