COMMUTIL.LST 70 KB

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