SCRIPTCO.MOD 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * SCRIPTCO.MOD - COMMS Toolkit Script compiler *
  5. * *
  6. * COPYRIGHT (C) 1988..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. IMPLEMENTATION MODULE ScriptCompiler; (* Compile a Procomm type Script *)
  11. IMPORT CommUtil,FIO,IO,Lib,Scanner,Storage,Str;
  12. FROM Scanner IMPORT Symbols;
  13. CONST
  14. MaxStringLnth = 80;
  15. MaxLabels = 20;
  16. TYPE
  17. SymSet = SET OF Scanner.Symbols;
  18. LabelDef = RECORD
  19. Label : Scanner.Alpha;
  20. Defined : BOOLEAN;
  21. Addr : CARDINAL;
  22. END;
  23. VAR
  24. StatBegSyms : SymSet;
  25. LblCnt : CARDINAL;
  26. Labels : ARRAY[0..MaxLabels-1] OF LabelDef;
  27. (*..............................................*)
  28. PROCEDURE FindLabel(VAR Lbl:Scanner.Alpha; PC:CARDINAL):CARDINAL;
  29. VAR
  30. Found : BOOLEAN;
  31. i,a : CARDINAL;
  32. BEGIN
  33. i:=0;
  34. Found:=FALSE;
  35. WHILE (NOT Found) AND (i<LblCnt) DO
  36. IF Scanner.StrCompare(Lbl,Labels[i].Label)=0 THEN
  37. Found:=TRUE;
  38. ELSE
  39. INC(i);
  40. END;
  41. END;
  42. WITH Labels[i] DO
  43. IF Found THEN
  44. IF Defined THEN
  45. RETURN Addr;
  46. ELSE
  47. a := Addr;
  48. Addr := PC;
  49. RETURN a;
  50. END
  51. ELSE
  52. Label := Lbl;
  53. Defined:=FALSE;
  54. Addr:=PC;
  55. INC(LblCnt);
  56. RETURN 0FFFFH;
  57. END;
  58. END;
  59. END FindLabel;
  60. (************************************************)
  61. PROCEDURE Statement(TermSyms:SymSet);
  62. (*..............................................*)
  63. PROCEDURE Value(VAR s:ARRAY OF CHAR):CARDINAL;
  64. VAR
  65. i,x : CARDINAL;
  66. c : CHAR;
  67. BEGIN
  68. x := 0;
  69. FOR i:=0 TO HIGH(s) DO
  70. c := s[i];
  71. IF c=0C THEN
  72. RETURN x
  73. ELSIF (c>='0') AND (c<='9') THEN
  74. x := x*10+ORD(c)-48;
  75. END;
  76. END;
  77. RETURN x;
  78. END Value;
  79. (*..............................................*)
  80. PROCEDURE Gen(op:SHORTCARD);
  81. BEGIN
  82. CodeBuff^[PC] := op;
  83. INC(PC);
  84. END Gen;
  85. (*..............................................*)
  86. PROCEDURE GenW(op:CARDINAL);
  87. BEGIN
  88. Gen(SHORTCARD(op MOD 100H));
  89. Gen(SHORTCARD(op DIV 100H));
  90. END GenW;
  91. (*..............................................*)
  92. PROCEDURE PatchW(Addr,op:CARDINAL);
  93. VAR
  94. Temp : CARDINAL;
  95. BEGIN
  96. Temp:=PC;
  97. PC:=Addr;
  98. GenW(op);
  99. PC:=Temp;
  100. END PatchW;
  101. (*..............................................*)
  102. PROCEDURE GenS(VAR op:ARRAY OF CHAR);
  103. VAR
  104. Lnth : CARDINAL;
  105. BEGIN
  106. Lnth := Str.Length(op)+1;
  107. Gen(255);
  108. Lib.Move(ADR(op),ADR(CodeBuff^[PC]),Lnth);
  109. INC(PC,Lnth);
  110. END GenS;
  111. (*..............................................*)
  112. PROCEDURE StringVar(VAR StringNo:SHORTCARD):BOOLEAN;
  113. VAR
  114. c : CHAR;
  115. BEGIN
  116. IF (Scanner.Sy=Ident) AND (Str.Length(Scanner.Id)=2) AND (CAP(Scanner.Id[0])='S') THEN
  117. c := Scanner.Id[1];
  118. IF (c>='0') AND (c<='9') THEN
  119. StringNo:=SHORTCARD(ORD(c)-48);
  120. RETURN TRUE
  121. END;
  122. END;
  123. RETURN FALSE;
  124. END StringVar;
  125. (*..............................................*)
  126. PROCEDURE String;
  127. VAR
  128. Sno : SHORTCARD;
  129. BEGIN
  130. IF StringVar(Sno) THEN
  131. Gen(Sno)
  132. ELSIF Scanner.Sy=StringConst THEN
  133. GenS(Scanner.LastStringConst)
  134. ELSE
  135. Scanner.Error(6);
  136. END;
  137. Scanner.GetSym;
  138. END String;
  139. (*..............................................*)
  140. PROCEDURE DefineLabel(VAR Lbl:Scanner.Alpha; PC:CARDINAL);
  141. VAR
  142. Found : BOOLEAN;
  143. i,nextp,p : CARDINAL;
  144. BEGIN
  145. i:=0;
  146. Found:=FALSE;
  147. WHILE (NOT Found) AND (i<LblCnt) DO
  148. IF Scanner.StrCompare(Lbl,Labels[i].Label)=0 THEN
  149. Found:=TRUE;
  150. ELSE
  151. INC(i);
  152. END;
  153. END;
  154. WITH Labels[i] DO
  155. IF Found THEN
  156. IF Defined THEN
  157. Scanner.Error(11);
  158. ELSE
  159. (* Chain through patch list, fixing addresses *)
  160. nextp := Addr;
  161. WHILE nextp<>0FFFFH DO
  162. p:=nextp;
  163. nextp := CARDINAL(CodeBuff^[p])+CARDINAL(CodeBuff^[p+1])*100H;
  164. PatchW(p,PC);
  165. END;
  166. END
  167. ELSE
  168. Label:=Lbl;
  169. INC(LblCnt);
  170. END;
  171. Defined:=TRUE;
  172. Addr:=PC;
  173. END;
  174. END DefineLabel;
  175. (*..............................................*)
  176. PROCEDURE Label;
  177. BEGIN
  178. IF Scanner.Sy=Colon THEN
  179. DefineLabel(Scanner.Id,PC);
  180. Scanner.GetSym;
  181. ELSE
  182. Scanner.Error(12);
  183. END;
  184. END Label;
  185. (*..............................................*)
  186. PROCEDURE SimpleCommand(Op,Default:SHORTCARD);
  187. VAR
  188. x : CARDINAL;
  189. BEGIN
  190. Gen(Op);
  191. IF Scanner.Sy=IntConst THEN
  192. x := Value(Scanner.LastNumConst);
  193. IF x<=255 THEN
  194. Gen(SHORTCARD(x));
  195. ELSE
  196. Scanner.Error(4);
  197. END;
  198. Scanner.GetSym;
  199. ELSE
  200. Gen(Default); (* default to three second alarm *)
  201. END;
  202. END SimpleCommand;
  203. (*..............................................*)
  204. PROCEDURE Assign;
  205. VAR
  206. SNo : SHORTCARD;
  207. BEGIN
  208. IF StringVar(SNo) THEN
  209. Gen(1);
  210. Gen(SNo);
  211. Scanner.GetSym;
  212. String;
  213. ELSE
  214. Scanner.Error(5);
  215. END;
  216. END Assign;
  217. (*..............................................*)
  218. PROCEDURE Clear;
  219. VAR
  220. Bg,Fg : CARDINAL;
  221. BEGIN
  222. IF Scanner.Sy=IntConst THEN
  223. Bg := Value(Scanner.LastNumConst);
  224. IF Bg<=7 THEN
  225. Scanner.GetSym;
  226. IF Scanner.Sy=IntConst THEN
  227. Fg:=Value(Scanner.LastNumConst);
  228. IF Fg<=15 THEN
  229. Gen(7);
  230. Gen(SHORTCARD(Bg*16+Fg));
  231. ELSE
  232. Scanner.Error(7);
  233. END;
  234. ELSE
  235. Scanner.Error(8);
  236. END;
  237. ELSE
  238. Scanner.Error(7);
  239. END;
  240. Scanner.GetSym;
  241. ELSE
  242. Gen(6);
  243. END;
  244. END Clear;
  245. (*..............................................*)
  246. PROCEDURE Locate;
  247. VAR
  248. y,x : CARDINAL;
  249. BEGIN
  250. IF Scanner.Sy=IntConst THEN
  251. y := Value(Scanner.LastNumConst);
  252. IF y<=23 THEN
  253. Scanner.GetSym;
  254. IF Scanner.Sy=IntConst THEN
  255. x:=Value(Scanner.LastNumConst);
  256. IF x<=79 THEN
  257. Gen(35);
  258. Gen(SHORTCARD(y));
  259. Gen(SHORTCARD(x));
  260. ELSE
  261. Scanner.Error(7);
  262. END;
  263. ELSE
  264. Scanner.Error(8);
  265. END;
  266. ELSE
  267. Scanner.Error(7);
  268. END;
  269. Scanner.GetSym;
  270. ELSE
  271. Scanner.Error(8);
  272. END;
  273. END Locate;
  274. (*..............................................*)
  275. PROCEDURE DosOrRun(op:SHORTCARD);
  276. VAR
  277. SNo : SHORTCARD;
  278. BEGIN
  279. Gen(op);
  280. IF NOT StringVar(SNo) THEN
  281. SNo:=255;
  282. END;
  283. Scanner.GetSym;
  284. IF Scanner.Sy=WaitSy THEN
  285. Gen(1);
  286. ELSE
  287. Gen(0);
  288. END;
  289. IF SNo=255 THEN
  290. GenS(Scanner.LastStringConst);
  291. ELSE
  292. Gen(SNo);
  293. END;
  294. IF Scanner.Sy=WaitSy THEN
  295. Scanner.GetSym;
  296. END;
  297. END DosOrRun;
  298. (*..............................................*)
  299. PROCEDURE WaitFor;
  300. VAR
  301. SNo : SHORTCARD;
  302. x : CARDINAL;
  303. BEGIN
  304. Gen(11);
  305. IF NOT StringVar(SNo) THEN
  306. SNo:=255;
  307. END;
  308. Scanner.GetSym;
  309. IF Scanner.Sy=IntConst THEN
  310. x := Value(Scanner.LastNumConst);
  311. IF x<=255 THEN
  312. Gen(SHORTCARD(x));
  313. ELSE
  314. Scanner.Error(4);
  315. END;
  316. ELSE
  317. Gen(30);
  318. END;
  319. IF SNo=255 THEN
  320. GenS(Scanner.LastStringConst);
  321. ELSE
  322. Gen(SNo);
  323. END;
  324. IF Scanner.Sy=IntConst THEN
  325. Scanner.GetSym;
  326. END;
  327. END WaitFor;
  328. (*..............................................*)
  329. PROCEDURE If;
  330. VAR
  331. ElseAllowed : BOOLEAN;
  332. JumpOp : SHORTCARD;
  333. StartPC,JumpPC : CARDINAL;
  334. BEGIN
  335. StartPC := PC;
  336. IF Scanner.Sy=NotSy THEN
  337. JumpOp:=18;
  338. Scanner.GetSym;
  339. ELSE
  340. JumpOp:=19;
  341. END;
  342. CASE Scanner.Sy OF
  343. LinkedSy : Gen(12); |
  344. SuccessSy : Gen(13); |
  345. FailureSy : Gen(14); |
  346. FoundSy : Gen(15); |
  347. ConnectSy : Gen(16); |
  348. WaitForSy : Gen(17); |
  349. ELSE
  350. Scanner.Error(3);
  351. END;
  352. Scanner.GetSym;
  353. ElseAllowed := (Scanner.Sy<>ElseSy);
  354. IF Scanner.Sy=ElseSy THEN (* Empty if, but we have an else clause *)
  355. IF JumpOp=18 THEN
  356. JumpOp:=19;
  357. ELSE
  358. JumpOp:=18;
  359. END;
  360. Scanner.GetSym;
  361. END;
  362. IF Scanner.Sy=EndifSy THEN
  363. PC := StartPC; (* completely empty if statement - optimise out *)
  364. ELSE
  365. Gen(JumpOp);
  366. JumpPC:=PC;
  367. GenW(0);
  368. Statement(SymSet{ElseSy,EndifSy});
  369. IF Scanner.GotError THEN
  370. RETURN;
  371. END;
  372. IF (ElseAllowed) AND (Scanner.Sy=ElseSy) THEN
  373. Scanner.GetSym;
  374. IF Scanner.Sy<>EndifSy THEN
  375. PatchW(JumpPC,PC+3);
  376. Gen(3);
  377. JumpPC:=PC;
  378. GenW(0);
  379. Statement(SymSet{ElseSy,EndifSy});
  380. IF Scanner.GotError THEN
  381. RETURN;
  382. END;
  383. PatchW(JumpPC,PC);
  384. END
  385. ELSE
  386. PatchW(JumpPC,PC);
  387. END;
  388. END;
  389. IF Scanner.Sy=EndifSy THEN
  390. Scanner.GetSym;
  391. ELSE
  392. Scanner.Error(3);
  393. END;
  394. END If;
  395. (*..............................................*)
  396. PROCEDURE Emulate;
  397. BEGIN
  398. Gen(22);
  399. IF Scanner.Sy=Ident THEN
  400. GenS(Scanner.Id);
  401. Scanner.GetSym;
  402. ELSE
  403. String;
  404. END;
  405. END Emulate;
  406. (*..............................................*)
  407. PROCEDURE Find;
  408. VAR
  409. sno : SHORTCARD;
  410. BEGIN
  411. Gen(24);
  412. IF StringVar(sno) THEN
  413. Gen(sno);
  414. Scanner.GetSym;
  415. String;
  416. ELSE
  417. Scanner.Error(5);
  418. END;
  419. END Find;
  420. (*..............................................*)
  421. PROCEDURE Get(op:SHORTCARD);
  422. VAR
  423. sno : SHORTCARD;
  424. x : CARDINAL;
  425. BEGIN
  426. Gen(op);
  427. IF StringVar(sno) THEN
  428. Gen(sno);
  429. Scanner.GetSym;
  430. IF Scanner.Sy=IntConst THEN
  431. x := Value(Scanner.LastNumConst);
  432. IF x<256 THEN
  433. Gen(SHORTCARD(x));
  434. ELSE
  435. Scanner.Error(4);
  436. END;
  437. Scanner.GetSym;
  438. ELSE
  439. Gen(80);
  440. END;
  441. ELSE
  442. Scanner.Error(5);
  443. END;
  444. END Get;
  445. (*..............................................*)
  446. PROCEDURE RGet;
  447. VAR
  448. x : CARDINAL;
  449. BEGIN
  450. Get(47);
  451. IF Scanner.Sy=IntConst THEN
  452. x:=Value(Scanner.LastNumConst);
  453. Scanner.GetSym;
  454. IF x<256 THEN
  455. Gen(SHORTCARD(x));
  456. ELSE
  457. Scanner.Error(4);
  458. END;
  459. ELSE
  460. Gen(30);
  461. END;
  462. END RGet;
  463. (*..............................................*)
  464. PROCEDURE FileTransfer(op:SHORTCARD; FileRequired:BOOLEAN);
  465. VAR
  466. sno : SHORTCARD;
  467. Dummy : ARRAY[0..1] OF CHAR;
  468. BEGIN
  469. Gen(op);
  470. IF (Scanner.Sy>=FTAscii) AND (Scanner.Sy<=FTBYmodem) THEN
  471. Gen(SHORTCARD(ORD(Scanner.Sy)-ORD(FTAscii)));
  472. Scanner.GetSym;
  473. IF StringVar(sno) OR (Scanner.Sy=StringConst) THEN
  474. String
  475. ELSIF FileRequired THEN
  476. Scanner.Error(6);
  477. ELSE
  478. Dummy[0]:=0C;
  479. GenS(Dummy);
  480. (**** Scanner.GetSym; shouldn't advance here ****)
  481. END;
  482. ELSE
  483. Scanner.Error(10);
  484. END;
  485. END FileTransfer;
  486. (*..............................................*)
  487. PROCEDURE ReferenceLabel(op:SHORTCARD);
  488. BEGIN
  489. Gen(op);
  490. IF Scanner.Sy=Ident THEN
  491. GenW(FindLabel(Scanner.Id,PC));
  492. Scanner.GetSym;
  493. ELSE
  494. Scanner.Error(13);
  495. END;
  496. END ReferenceLabel;
  497. (*..............................................*)
  498. PROCEDURE Log;
  499. VAR
  500. sno : SHORTCARD;
  501. Dummy : ARRAY[0..1] OF CHAR;
  502. BEGIN
  503. Dummy[0] := 0C;
  504. CASE Scanner.Sy OF
  505. OpenSy : Gen(36);
  506. Scanner.GetSym;
  507. IF StringVar(sno) OR (Scanner.Sy=StringConst) THEN
  508. String
  509. ELSE
  510. GenS(Dummy);
  511. END; |
  512. CloseSy : Gen(37);
  513. Scanner.GetSym; |
  514. SuspendSy : Gen(38);
  515. Scanner.GetSym; |
  516. ResumeSy : Gen(39);
  517. Scanner.GetSym; |
  518. ELSE
  519. Scanner.Error(3);
  520. END;
  521. END Log;
  522. (*..............................................*)
  523. PROCEDURE Macro;
  524. VAR
  525. x : CARDINAL;
  526. BEGIN
  527. IF Scanner.Sy=IntConst THEN
  528. Gen(40);
  529. x:=Value(Scanner.LastNumConst);
  530. IF x<10 THEN
  531. Gen(SHORTCARD(x));
  532. ELSE
  533. Scanner.Error(7);
  534. END;
  535. Scanner.GetSym;
  536. ELSE
  537. Gen(41);
  538. String;
  539. END;
  540. END Macro;
  541. (*..............................................*)
  542. PROCEDURE OnOff(opOn,opOff:SHORTCARD);
  543. BEGIN
  544. IF Scanner.Sy=OnSy THEN
  545. Gen(opOn);
  546. ELSIF Scanner.Sy=OffSy THEN
  547. Gen(opOff);
  548. ELSE
  549. Scanner.Error(3);
  550. END;
  551. Scanner.GetSym;
  552. END OnOff;
  553. (*..............................................*)
  554. PROCEDURE Switch;
  555. VAR
  556. sno : SHORTCARD;
  557. GotDefault : BOOLEAN;
  558. (*. . . . . . . . . . . . . . . . . . . . . . . *)
  559. PROCEDURE CaseSelection;
  560. VAR
  561. PatchLoc : CARDINAL;
  562. BEGIN
  563. IF (NOT GotDefault) AND (Scanner.Sy=CaseSy) THEN
  564. Scanner.GetSym;
  565. Gen(52);
  566. Gen(sno);
  567. String;
  568. IF NOT Scanner.GotError THEN
  569. Gen(19);
  570. PatchLoc:=PC;
  571. GenW(0);
  572. Statement(SymSet{EndCaseSy});
  573. IF Scanner.Sy=EndCaseSy THEN
  574. Scanner.GetSym;
  575. ELSE
  576. Scanner.Error(3);
  577. END;
  578. PatchW(PatchLoc,PC+3);
  579. Gen(3);
  580. PatchLoc:=PC;
  581. GenW(0);
  582. CaseSelection;
  583. PatchW(PatchLoc,PC);
  584. END
  585. ELSIF Scanner.Sy=DefaultSy THEN
  586. IF GotDefault THEN
  587. Scanner.Error(14);
  588. RETURN;
  589. END;
  590. GotDefault := TRUE;
  591. Scanner.GetSym;
  592. Statement(SymSet{EndCaseSy});
  593. IF Scanner.Sy=EndCaseSy THEN
  594. Scanner.GetSym;
  595. ELSE
  596. Scanner.Error(3);
  597. END;
  598. END;
  599. END CaseSelection;
  600. (*. . . . . . . . . . . . . . . . . . . . . . . *)
  601. BEGIN (* Switch *)
  602. GotDefault := FALSE;
  603. IF StringVar(sno) THEN
  604. Scanner.GetSym;
  605. CaseSelection;
  606. IF Scanner.Sy=EndSwitchSy THEN
  607. Scanner.GetSym;
  608. ELSE
  609. Scanner.Error(3);
  610. END;
  611. ELSE
  612. Scanner.Error(5);
  613. END;
  614. END Switch;
  615. (*..............................................*)
  616. VAR
  617. Sym : Scanner.Symbols;
  618. BEGIN (* Statement *)
  619. WHILE (NOT Scanner.GotError) AND (Scanner.Sy IN StatBegSyms) DO
  620. Sym:=Scanner.Sy;
  621. Scanner.GetSym;
  622. CASE Sym OF
  623. Ident : Label; |
  624. AlarmSy : SimpleCommand(0,3); |
  625. AssignSy : Assign; |
  626. BreakSy : SimpleCommand(4,1); |
  627. ChDirSy : Gen(5);
  628. String; |
  629. ClearSy : Clear; |
  630. CWhenSy : Gen(54); |
  631. DialSy : Scanner.Error(9); |
  632. DosSy : DosOrRun(8); |
  633. EmulateSy : Emulate; |
  634. ExecuteSy : Gen(23);
  635. String; |
  636. ExitSy : Gen(20); |
  637. FindSy : Find; |
  638. GetSy : Get(25); |
  639. MGetSy : Get(26); |
  640. GetFileSy : FileTransfer(27,FALSE); |
  641. GosubSy : ReferenceLabel(29); |
  642. GotoSy : ReferenceLabel(30); |
  643. HangupSy : Gen(31); |
  644. IfSy : If; |
  645. IsFileSy : Gen(33);
  646. String; |
  647. KermServSy : |
  648. KFlushSy : Gen(34); |
  649. LocateSy : Locate; |
  650. LogSy : Log; |
  651. MacroSy : Macro; |
  652. MessageSy : Gen(9);
  653. String; |
  654. MLoadSy : Gen(42);
  655. String; |
  656. PauseSy : SimpleCommand(21,1); |
  657. PrinterSy : OnOff(43,44); |
  658. QuitSy : Gen(45); |
  659. ReturnSy : Gen(32); |
  660. RFlushSy : Gen(46); |
  661. RGetSy : RGet; |
  662. RunSy : DosOrRun(48); |
  663. SendFileSy : FileTransfer(28,TRUE); |
  664. SetSy : |
  665. SnapshotSy : Gen(49); |
  666. SwitchSy : Switch; |
  667. TraceSy : OnOff(50,51); |
  668. TransmitSy : Gen(10);
  669. String; |
  670. WaitForSy : WaitFor; |
  671. WhenSy : Gen(53);
  672. String;
  673. String; |
  674. END;
  675. END;
  676. IF NOT (Scanner.Sy IN TermSyms) THEN
  677. Scanner.Error(3);
  678. END;
  679. END Statement;
  680. (************************************************)
  681. PROCEDURE Initialise;
  682. BEGIN
  683. PC := 0;
  684. Scanner.InitScanner;
  685. Scanner.GetSym;
  686. LblCnt := 0;
  687. StatBegSyms := SymSet{Ident,AlarmSy,AssignSy,BreakSy,ChDirSy,ClearSy,CWhenSy,DialSy,
  688. DosSy,EmulateSy,ExecuteSy,ExitSy,FindSy,GetSy,MGetSy,GetFileSy,
  689. GosubSy,GotoSy,HangupSy,IfSy,IsFileSy,KermServSy,KFlushSy,LocateSy,
  690. LogSy,MacroSy,MessageSy,MLoadSy,PauseSy,PrinterSy,QuitSy,ReturnSy,
  691. RFlushSy,RGetSy,RunSy,SendFileSy,SetSy,SnapshotSy,SwitchSy,TraceSy,
  692. TransmitSy,WaitForSy,WhenSy};
  693. END Initialise;
  694. (*..............................................*)
  695. PROCEDURE CheckLabels;
  696. VAR
  697. i : CARDINAL;
  698. BEGIN
  699. i:=0;
  700. WHILE i<LblCnt DO
  701. WITH Labels[i] DO
  702. IF NOT Defined THEN
  703. IO.WrStr('Label "');
  704. IO.WrStr(Label);
  705. IO.WrStr('" is not defined');
  706. IO.WrLn;
  707. Scanner.GotError := TRUE;
  708. END;
  709. INC(i);
  710. END;
  711. END;
  712. END CheckLabels;
  713. (*..............................................*)
  714. PROCEDURE Compile(VAR Filename:ARRAY OF CHAR):BOOLEAN;
  715. BEGIN
  716. FIO.IOcheck := FALSE;
  717. Scanner.infile := FIO.Open(Filename);
  718. IF FIO.IOresult()=0 THEN
  719. FIO.EOF := FALSE;
  720. IF CodeBuff=NIL THEN
  721. IF NOT Storage.Available(MaxCodeBytes) THEN
  722. FIO.Close(Scanner.infile);
  723. CommUtil.ErrorMessage('Not enough memory to compile script!!');
  724. RETURN(FALSE)
  725. END;
  726. Storage.ALLOCATE(CodeBuff,MaxCodeBytes);
  727. END;
  728. Initialise;
  729. IF Scanner.Sy<>EndOfFile THEN
  730. Statement(SymSet{EndOfFile})
  731. ELSE
  732. Scanner.Error(3);
  733. END;
  734. CodeBuff^[PC]:=20;
  735. INC(PC); (* insert an EXIT command *)
  736. FIO.Close(Scanner.infile);
  737. IF NOT Scanner.GotError THEN
  738. CheckLabels;
  739. END;
  740. IF Scanner.GotError THEN
  741. Storage.DEALLOCATE(CodeBuff,MaxCodeBytes);
  742. CodeBuff := NIL;
  743. END;
  744. RETURN (NOT Scanner.GotError);
  745. ELSE
  746. CommUtil.ErrorMessage('Script File not found!');
  747. RETURN FALSE;
  748. END;
  749. END Compile;
  750. (*..............................................*)
  751. BEGIN
  752. CodeBuff := NIL;
  753. END ScriptCompiler.
  754.