COMMUTIL.MOD 59 KB

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