home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / DIV / MM2MAKE.M < prev    next >
Encoding:
Text File  |  1991-11-17  |  39.5 KB  |  3 lines

  1. ⓪ MODULE MM2Make;
  2. ⓪ (*$Z+,R-*)
  3. ⓪ 
  4. ⓪ (*
  5. ⓪!to do:
  6. ⓪ 
  7. ⓪!- beim suchen nach codes auch den comp-pfad der shell-option-box berück-
  8. ⓪#sichtigen!
  9. ⓪ 
  10. ⓪!- option f. make & build, ob die output-pfade bestimmt werden sollen
  11. ⓪#oder nicht. außerdem fehlende output-pfade ggf. hervorheben
  12. ⓪ 
  13. ⓪!- compiler muß per option (z.b. $O <name>) output-path auswerten
  14. ⓪ 
  15. ⓪!- die vierfachen langen procs, wie z.b. GetSrcTimes, zusammenfassen
  16. ⓪ *)
  17. ⓪ 
  18. ⓪ (*----------------------------------------------------------------------------
  19. ⓪!* Make-Utility für Megamax Modula-2
  20. ⓪!*
  21. ⓪!*    Liest eine Make-Datei (als Argument zu übergeben, ansonsten in der
  22. ⓪!*    Shell einzustellen) ein, die alle Import-Abhängigkeiten eines
  23. ⓪!*    Projekts beschreibt und compiliert anhand der Zeitangaben der
  24. ⓪!*    Textdateien und der zugehörigen Codedateien alle veränderten
  25. ⓪!*    Module neu.
  26. ⓪!*
  27. ⓪!* In der Argumentzeile kann auch "-B" für "Build" übergeben werden.
  28. ⓪!*
  29. ⓪!* Exitcodes:
  30. ⓪!*   0: Es sind Module zu compilieren
  31. ⓪!*   1: Alle Module sind bereits korrekt compiliert
  32. ⓪!*   2: Es sind Syntax-Fehler aufgetreten
  33. ⓪!*   3: Es sind allg. Fehler aufgetreten
  34. ⓪!*
  35. ⓪!* Das Format der Make-Datei:
  36. ⓪!*    Am Anfang einer Zeile steht ein Modulname , dann entweder '-DEF',
  37. ⓪!*    '-IMP' oder '-MOD'. Dann folgen der Codedateiname und, falls, vorhanden,
  38. ⓪!*    der Quelldateiname. Ist der Quelltext vorhanden, folgt '-SOURCE' und
  39. ⓪!*    der Name der Quelltextdatei. Gibt es zum Quelltext Includedateien, so
  40. ⓪!*    werden diese nach -INC aufgezählt. Die Liste wird durch einen einzelnen
  41. ⓪!*    Strichpunkt abgeschlossen. Werden andere Module importiert, müssen
  42. ⓪!*    sie mit '-IMPORT' eingeleitet werden, dann folgen die importierten
  43. ⓪!*    Modulnamen. Das Ende der Importnamen muß durch einen einzelnen Strich-
  44. ⓪!*    punkt angegeben werden. Sind andere Dateien abhängig (z.B RSC-Dateien),
  45. ⓪!*    sind sie mit -USES aufzuzählen (wie Importe und Include-Dateien).
  46. ⓪!*    Die importierten Modulnamen müssen alle nochmal irgendwo in der Datei
  47. ⓪!*    mit "<Modulname> -DEF <Codedateiname> -IMP <Codedateiname>" aufgeführt
  48. ⓪!*    werden!
  49. ⓪!*    Ein Implementationsmodul, das kein DEF zur Prüfung braucht (als
  50. ⓪!*    Hauptmodul, beispielsweise Treiber, wie GEMIO), wird mit '-IMPMOD'
  51. ⓪!*    eingeleitet.
  52. ⓪!*    Wenn bei einem Dateinamen kein Pfad angegeben ist, wird auf den von
  53. ⓪!*    Shell und Compiler benutzten Pfaden (siehe Modul 'ShellMsg') gesucht
  54. ⓪!*    (bei Includes wird auf den Source-Pfaden, bei USES auf den StdPaths
  55. ⓪!*    "DefaultPath" gesucht).
  56. ⓪!*
  57. ⓪!* Beispiel für eine Make-Datei:
  58. ⓪!*
  59. ⓪!*    Test         -MAIN
  60. ⓪!*                 -MOD    D:\TEST.MOD
  61. ⓪!*                 -SOURCE D:\TEST.M
  62. ⓪!*                 -IMPORT InOut MyUtility;
  63. ⓪!*                 -USES   D:\TEST.RSC
  64. ⓪!*    MyUtility    -IMP    D:\CODES.IMP\MyUtil.IMP
  65. ⓪!*                 -SOURCE D:\MyUtil.I
  66. ⓪!*                 -INC    D:\MyUtil.H ;
  67. ⓪!*                 -IMPORT TimeConvert
  68. ⓪!*                         Clock
  69. ⓪!*                         ;
  70. ⓪!*                 -DEF    D:\CODES.DEF\MyUtil.DEF
  71. ⓪!*                 -SOURCE D:\MyUtil.D
  72. ⓪!*                 -IMPORT Clock ;
  73. ⓪!*    TimeConvert  -DEF    TIMECONV.DEF  (* IMP unnötig, wenn kein Source *)
  74. ⓪!*                 -NOSRC                (* anzeigen, daß kein Source vorhand.*)
  75. ⓪!*    Clock        -DEF    CLOCK.DEF
  76. ⓪!*                 -NOSRC
  77. ⓪!*                 -IMP    CLOCK.IMP
  78. ⓪!*                 -NOSRC
  79. ⓪!*    MyIO         -IMPMOD MYIO.IMP      (* benötigt kein -DEF *)
  80. ⓪!*                 -SOURCE MYIO.I
  81. ⓪!*
  82. ⓪!*----------------------------------------------------------------------------
  83. ⓪!* TT     : Thomas Tempelmann
  84. ⓪!* CD     : Christian Drießle
  85. ⓪!*----------------------------------------------------------------------------
  86. ⓪!* Datum     Version  Autor  Bemerkung (Arbeitsbericht)
  87. ⓪!*----------------------------------------------------------------------------
  88. ⓪!* 02.03.88  1.0      TT     Grundversion
  89. ⓪!* 03.03.89           CD     Ermöglicht, daß zu einem Modul IMP und DEF erlaubt
  90. ⓪!*                           sind.
  91. ⓪!* 04.03.89           CD     Rekursiven Modulbaum-durchsuch-algorithmus erprobt.
  92. ⓪!* 05.03.89           CD     Alle Files in 5 Listen verteilt:
  93. ⓪!*                             - ModCodes
  94. ⓪!*                             - DefCodes
  95. ⓪!*                             - ImpCodes
  96. ⓪!*                             - Sources
  97. ⓪!*                             - withPath (Files mit ausdrücklich angegebenem
  98. ⓪!*                                         Pfadnamen)
  99. ⓪!*                           Die Files dieser Listen werden Pfadweise nachein-
  100. ⓪!*                           einander gesucht und die Zeit eingelesen.
  101. ⓪!* 07.03.89           CD     Neue Errungenschaften vom 5.3. getestet und
  102. ⓪!*                           korrigiert.
  103. ⓪!*                           Nachfrage bei fehlendem Code und vorhandenem
  104. ⓪!*                           Source.
  105. ⓪!*                           IMP mit Source aber ohne IMPORT geht jetzt auch
  106. ⓪!*                           am Ende der Makedatei.
  107. ⓪!*                           Rekursive Suche durch den Modulbaum implementiert
  108. ⓪!*                           mit markieren der zu übersetzenden Dateien.
  109. ⓪!*                           Suche auch im Defaultpfad nach allen Sorten von
  110. ⓪!*                           Dateien.
  111. ⓪!* 08.03.89  1.01     CD     Include-Dateien können angegeben werden und sie
  112. ⓪!*                           werden berücksichtigt.
  113. ⓪!*                           Es wird eine Datei mit Include-Anweisungen für
  114. ⓪!*                           den Compiler erzeugt.
  115. ⓪!* 09.03.89           CD     toMoment berichigt ( * $10000L), bei nicht ge
  116. ⓪!*                           gefundenem Code wird date und time auf 0 gesetzt.
  117. ⓪!* 08.08.89           TT     lauffähige Version fertiggestellt
  118. ⓪!* 19.08.89           TT     "-MAIN"-ID neu; bei Fehler wird TextName, TextLine
  119. ⓪!*                           und TextCol gesetzt; bei Erfolg wird CodeName
  120. ⓪!*                           nach -MAIN gesetzt; MakeFileName importiert
  121. ⓪!* 19.08.89           TT     TemporaryPath statt M2Home verwendet
  122. ⓪!* 20.09.89           TT     Nur erster MAIN-Name wird nach CodeName übernommen.
  123. ⓪!* 09.01.90           TT     Test-Funktion showIdents zeigt bei Importen deren
  124. ⓪!*                           Modul- statt Code-Namen an
  125. ⓪!* 18.01.90  1.2      TT     Wenn Pfad angegeben, wird trotzdem auch auf den
  126. ⓪!*                           anderen Such-Pfaden gesucht
  127. ⓪!* 04.03.90           TT     Durch '-NOSRC' wird keine Sourceangabe mehr
  128. ⓪!*                           verlangt, wenn nur Code angegeben werden soll.
  129. ⓪!* 11.03.90  1.3      TT     Meckert bei -NOSRC nicht mehr über falsches Datum.
  130. ⓪!*                           Noch zu tun: Bei IMP meckert er u.U. (wenn DEF
  131. ⓪!*                           neu ist) über Datum, außerdem wird bei Nichtangabe
  132. ⓪!*                           des IMP dann nicht erkannt, daß Clients neu
  133. ⓪!*                           compiliert werden müssen.
  134. ⓪!* 08.05.90           TT     'ignoreSource'-Abfrage in 'chkDate' entfernt.
  135. ⓪!* 20.07.90           TT     "-B" für Build eingebaut
  136. ⓪!* 23.07.90           TT     Vielleicht werden fehlende Sources nun korrekt
  137. ⓪!*                           bemängelt.
  138. ⓪!* 18.08.90           TT     Noch ein paar ReplaceHome-Aufrufe eingefügt.
  139. ⓪!* 10.11.90           TT     $R-, $Z+
  140. ⓪!* 28.11.90           TT     Syntax-Fehler besser erkannt und ausführlichere
  141. ⓪!*                           Fehlermeldung; Nun wird entw. -SOURCE oder -NOSRC
  142. ⓪!*                           verlangt. Bei "NOSRC" und fehlendem Code wird nun
  143. ⓪!*                           der Fehler korrekt gemeldet.
  144. ⓪!* 19.02.91  1.4      TT     In Outfile steht nun jew. einer der Clienten, der
  145. ⓪!*                           die Übersetzung erzwingt.
  146. ⓪!* 15.03.91           TT     "-BI" für BuildImp (nur Implementations) eingebaut
  147. ⓪!* 25.04.91           TT     Reason bei Includes/Uses wird korrekt angegeben.
  148. ⓪!*----------------------------------------------------------------------------
  149. ⓪!*)
  150. ⓪ 
  151. ⓪ 
  152. ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR;
  153. ⓪ 
  154. ⓪ FROM ArgCV IMPORT InitArgCV, PtrArgStr;
  155. ⓪ 
  156. ⓪ FROM InOut IMPORT
  157. ⓪(FlushKbd, GotoXY, WriteLn, WriteString, Write, Read, ReadString,
  158. ⓪(WriteInt, WriteCard, BusyRead, KeyPressed;
  159. ⓪ 
  160. ⓪ FROM Directory IMPORT
  161. ⓪(GetDirEntry, DirQuery, DirEntry;
  162. ⓪ 
  163. ⓪ FROM FileNames IMPORT
  164. ⓪(ValidatePath, ConcatPath, SplitPath;
  165. ⓪ 
  166. ⓪ FROM MOSGlobals IMPORT FileStr;
  167. ⓪ 
  168. ⓪ FROM Clock IMPORT
  169. ⓪(CurrentDate, CurrentTime, PackDate, PackTime,
  170. ⓪(UnpackDate, UnpackTime, Date, Time;
  171. ⓪ 
  172. ⓪ FROM TimeConvert IMPORT
  173. ⓪(TimeToText, DateToText;
  174. ⓪ 
  175. ⓪ FROM Files IMPORT
  176. ⓪(File, Access, Open, State, GetStateMsg, ResetState, Close, EOF,
  177. ⓪(SetDateTime, GetDateTime, Create, ReplaceMode, Remove;
  178. ⓪ 
  179. ⓪ IMPORT Text;
  180. ⓪ 
  181. ⓪ FROM PathEnv IMPORT
  182. ⓪(HomePath, ReplaceHome, HomeReplaced;
  183. ⓪ FROM Paths IMPORT
  184. ⓪(SearchFile, ListPos;
  185. ⓪ FROM PathCtrl IMPORT
  186. ⓪(PathList, PathEntry;
  187. ⓪ 
  188. ⓪ FROM ShellMsg IMPORT
  189. ⓪(CodeName, TextName, TextLine, TextCol, ModuleName, ErrorMsg, Active,
  190. ⓪(ShellPath, MakeFileName, ModPaths, DefPaths, ImpPaths, SrcPaths,
  191. ⓪(TemporaryPath;
  192. ⓪ 
  193. ⓪ FROM Lists IMPORT
  194. ⓪(List, LCarrier, CreateList, AppendEntry, InsertEntry, NextEntry,
  195. ⓪(ScanEntries, LDir, LCondProc, ResetList, RemoveEntry, ListEmpty;
  196. ⓪ 
  197. ⓪ IMPORT Storage;
  198. ⓪ 
  199. ⓪ FROM Storage IMPORT
  200. ⓪(DEALLOCATE;
  201. ⓪ 
  202. ⓪ FROM PrgCtrl IMPORT
  203. ⓪(TermProcess;
  204. ⓪ 
  205. ⓪ FROM Strings IMPORT
  206. ⓪(Empty, StrEqual, Upper, Insert, Copy, Length, Pos, PosLen, String,
  207. ⓪(Split, EatSpaces, Assign, Concat, Append, Delete;
  208. ⓪ 
  209. ⓪ IMPORT FastStrings, FuncStrings;
  210. ⓪ 
  211. ⓪ TYPE
  212. ⓪(CharSet = SET OF CHAR;
  213. ⓪ 
  214. ⓪ CONST
  215. ⓪(titl1 = ' MM2Make V1.4 für Megamax Modula-2';
  216. ⓪(titl2 = ' Erstellt 3/1989 von Thomas Tempelmann & Christian Drießle';
  217. ⓪(noMem = 'Zu wenig Speicher!';
  218. ⓪(noFile= 'Make-Datei ist leer!';
  219. ⓪(readng= 'Lese ';
  220. ⓪(scanin= 'Prüfe Dateien';
  221. ⓪(datErr= ' hat ungültiges Datum!';
  222. ⓪(toComp= 'Der Compiler wartet schon...';
  223. ⓪(noComp= 'Alles OK';
  224. ⓪(filErr= 'Dateifehler: ';
  225. ⓪(dblid = 'Modul ist doppelt deklariert!';
  226. ⓪(notDef= ' wurde nicht oder unvollständig deklariert!';
  227. ⓪(opnErr= 'Datei(en) nicht gefunden!';
  228. ⓪(noCom = 'Ausgabedatei konnte nicht angelegt werden! (Stimmt "Temp.Pfad"?)';
  229. ⓪(synErr= 'Syntaxfehler: ';
  230. ⓪(nameExp='Modulname erwartet.';
  231. ⓪(fileExp='Dateiname erwartet.';
  232. ⓪(typeExp='Modulkennung (DEF/IMP/MOD) erwartet.';
  233. ⓪(srcExp ='Source-Kennung (SOURCE/NOSRC) erwartet.';
  234. ⓪(srcnExp='Quelltextname erwartet.';
  235. ⓪(remErr= 'Remove in Liste haut nicht hin!';
  236. ⓪(eoprg = 'Programmende. Taste drücken...';
  237. ⓪(NoCodeMsg = 'No Code';
  238. ⓪(SelfMsg   = 'Modified';
  239. ⓪ 
  240. ⓪(maybe = CharSet {'j', 'J', 'n', 'N'};
  241. ⓪(no = CharSet {'n', 'N'};
  242. ⓪(
  243. ⓪(compFileName = 'MAKE.M2C';    (* temp.File f. Compiler, nach ShellMsg *)
  244. ⓪ 
  245. ⓪ TYPE
  246. ⓪(FileType= (def, imp, mod, src, inc, uses);
  247. ⓪(ModType = [def..mod];
  248. ⓪ 
  249. ⓪(ImpList = POINTER TO ImpDesc;
  250. ⓪(IncList = POINTER TO IncDesc;
  251. ⓪(PtrMod  = POINTER TO ModDesc;
  252. ⓪(
  253. ⓪(ImpDesc = RECORD
  254. ⓪4next: ImpList;
  255. ⓪4modPtr : PtrMod
  256. ⓪2END;
  257. ⓪(
  258. ⓪(IncDesc = RECORD
  259. ⓪4fullname: ARRAY [0..80] OF CHAR;
  260. ⓪4date, time : CARDINAL;
  261. ⓪4next : IncList;
  262. ⓪2END;
  263. ⓪ 
  264. ⓪(ModDesc = RECORD
  265. ⓪4name: String;
  266. ⓪4type: ModType;
  267. ⓪4codeName: String;
  268. ⓪4date, time: CARDINAL;
  269. ⓪4checked: BOOLEAN;
  270. ⓪4ignore: BOOLEAN;
  271. ⓪4CASE withSource: BOOLEAN OF
  272. ⓪6TRUE: sourceName: String;
  273. ⓪<sdate, stime: CARDINAL;
  274. ⓪<uses, include : IncList;
  275. ⓪<import: ImpList;
  276. ⓪4| FALSE: ignoreSource: BOOLEAN;
  277. ⓪4END
  278. ⓪2END;
  279. ⓪ 
  280. ⓪(moment = LONGCARD;
  281. ⓪ 
  282. ⓪ 
  283. ⓪ VAR
  284. ⓪(build, buildImp, waitAtEnd, ok, error: BOOLEAN;
  285. ⓪(exitCode: INTEGER;
  286. ⓪(f, compfile : File;
  287. ⓪(modlist: List; (* OF ModDesc *)
  288. ⓪ 
  289. ⓪ (*!TT*)
  290. ⓪ PROCEDURE term3 (REF s: ARRAY OF CHAR);
  291. ⓪"VAR c:CHAR;
  292. ⓪"BEGIN
  293. ⓪$WriteLn;
  294. ⓪$WriteString (s);
  295. ⓪$WriteLn;
  296. ⓪$WriteLn;
  297. ⓪$WriteString (eoprg);
  298. ⓪$FlushKbd;
  299. ⓪$Read (c);
  300. ⓪$ResetState (f);
  301. ⓪$Close (f);
  302. ⓪$TermProcess (3)
  303. ⓪"END term3;
  304. ⓪ 
  305. ⓪ (*!TT*)
  306. ⓪ PROCEDURE termNoMem;
  307. ⓪"BEGIN
  308. ⓪$term3 (noMem);
  309. ⓪"END termNoMem;
  310. ⓪ 
  311. ⓪ PROCEDURE term (s: ARRAY OF CHAR);
  312. ⓪"VAR c:CHAR;
  313. ⓪"BEGIN
  314. ⓪$(*!TT*)
  315. ⓪$IF Active THEN
  316. ⓪&FastStrings.Assign (s, ErrorMsg);
  317. ⓪$ELSE
  318. ⓪&WriteLn;
  319. ⓪&WriteString (s);
  320. ⓪&WriteLn;
  321. ⓪&WriteLn;
  322. ⓪&WriteString (eoprg);
  323. ⓪&FlushKbd;
  324. ⓪&Read (c);
  325. ⓪$END;
  326. ⓪$ResetState (f);
  327. ⓪$Close (f);
  328. ⓪$TermProcess (2)
  329. ⓪"END term;
  330. ⓪ 
  331. ⓪ 
  332. ⓪ PROCEDURE ALLOCATE (VAR p:ADDRESS; l:LONGCARD);
  333. ⓪"BEGIN
  334. ⓪$Storage.ALLOCATE (p,l);
  335. ⓪$IF p=NIL THEN termNoMem END
  336. ⓪"END ALLOCATE;
  337. ⓪ 
  338. ⓪ (*$Z-*)
  339. ⓪ PROCEDURE chkavail (d1, d2: ADDRESS): BOOLEAN;
  340. ⓪ (*$Z=*)
  341. ⓪"VAR actmod: PtrMod; chkmod: POINTER TO PtrMod; eq: BOOLEAN;
  342. ⓪"(*$L-*)
  343. ⓪"BEGIN
  344. ⓪$(*
  345. ⓪&actmod:= d1;
  346. ⓪&chkmod:= d2;
  347. ⓪&eq:= (actmod^.type = chkmod^^.type)
  348. ⓪)& StrEqual (actmod^.name, chkmod^^.name);
  349. ⓪&IF eq THEN chkmod^:= actmod END;
  350. ⓪&RETURN eq
  351. ⓪$*)
  352. ⓪$ASSEMBLER
  353. ⓪(MOVE.L  -(A3),A2        ; d2
  354. ⓪(MOVE.L  A2,-(A7)
  355. ⓪(MOVE.L  (A2),A2         ; A2: chkmod
  356. ⓪(MOVE.L  -(A3),A1        ; A1: actmod
  357. ⓪(MOVE.W  ModDesc.type(A1),D0
  358. ⓪(CMP.W   ModDesc.type(A2),D0
  359. ⓪(BNE     neq
  360. ⓪(MOVE.B  ModDesc.name(A1),D0
  361. ⓪(CMP.B   ModDesc.name(A2),D0
  362. ⓪(BNE     neq
  363. ⓪(LEA     ModDesc.name(A1),A0
  364. ⓪(MOVE.L  A0,(A3)+
  365. ⓪(MOVE    #79,(A3)+
  366. ⓪(LEA     ModDesc.name(A2),A0
  367. ⓪(MOVE.L  A0,(A3)+
  368. ⓪(MOVE    #79,(A3)+
  369. ⓪(MOVE.L  A1,-(A7)
  370. ⓪(JSR     StrEqual
  371. ⓪(MOVE.L  (A7)+,A1
  372. ⓪(TST     -(A3)
  373. ⓪(BEQ     neq
  374. ⓪(MOVE.L  (A7)+,A2
  375. ⓪(MOVE.L  A1,(A2)
  376. ⓪(MOVE    #1,(A3)+
  377. ⓪(RTS
  378. ⓪&neq
  379. ⓪(ADDQ.L  #4,A7
  380. ⓪(CLR     (A3)+
  381. ⓪$END
  382. ⓪"END chkavail;
  383. ⓪"(*$L=*)
  384. ⓪ 
  385. ⓪ PROCEDURE avail (VAR s: ARRAY OF CHAR; t: ModType; VAR modp: PtrMod): BOOLEAN;
  386. ⓪"VAR mod: ModDesc; found: BOOLEAN;
  387. ⓪"BEGIN
  388. ⓪$Assign (s, mod.name, ok);
  389. ⓪$mod.type:= t;
  390. ⓪$modp:= ADR (mod);
  391. ⓪$ResetList (modlist);
  392. ⓪$ScanEntries (modlist, forward, chkavail, ADR (modp), found);
  393. ⓪$RETURN found
  394. ⓪"END avail;
  395. ⓪ 
  396. ⓪ PROCEDURE newMod (VAR s: ARRAY OF CHAR; t: ModType; VAR actmod: PtrMod);
  397. ⓪"BEGIN
  398. ⓪$NEW (actmod);
  399. ⓪$AppendEntry (modlist, actmod, error);
  400. ⓪$IF error THEN termNoMem END;
  401. ⓪$WITH actmod^ DO
  402. ⓪&Assign (s, name, ok);
  403. ⓪&type:= t;
  404. ⓪&codeName:= '';
  405. ⓪&checked:= FALSE;
  406. ⓪&ignore:= FALSE;
  407. ⓪&withSource:= FALSE;
  408. ⓪$END
  409. ⓪"END newMod;
  410. ⓪ 
  411. ⓪ 
  412. ⓪ PROCEDURE readIdents (makename: ARRAY OF CHAR);
  413. ⓪ 
  414. ⓪"VAR
  415. ⓪(path: PathList;
  416. ⓪(fname: FileStr;
  417. ⓪(id: String;
  418. ⓪(line: ARRAY [0..256] OF CHAR;
  419. ⓪(lineLen: CARDINAL;
  420. ⓪(actmod: PtrMod;
  421. ⓪ 
  422. ⓪"PROCEDURE syntaxError(REF s: ARRAY OF CHAR);
  423. ⓪$BEGIN
  424. ⓪&WriteLn;
  425. ⓪&WriteString (line);
  426. ⓪&WriteLn;
  427. ⓪&WriteString ('id: <');
  428. ⓪&WriteString (id);
  429. ⓪&Write ('>');
  430. ⓪&WriteLn;
  431. ⓪&DEC (TextCol, Length (id));
  432. ⓪&term (FuncStrings.ConcStr (synErr, s))
  433. ⓪$END syntaxError;
  434. ⓪ 
  435. ⓪"PROCEDURE checkState;
  436. ⓪$VAR s: String;
  437. ⓪$BEGIN
  438. ⓪&IF State (f) < 0 THEN
  439. ⓪(GetStateMsg (State (f), s);
  440. ⓪(Insert (filErr, 0, s, ok);
  441. ⓪(term3 (s)
  442. ⓪&END
  443. ⓪$END checkState;
  444. ⓪"
  445. ⓪"PROCEDURE getIdent (VAR s: ARRAY OF CHAR): BOOLEAN;
  446. ⓪$(* Liefert in 's' das nächste Wort aus der Datei 'f'. *)
  447. ⓪$VAR p: CARDINAL;
  448. ⓪$
  449. ⓪$BEGIN
  450. ⓪&LOOP
  451. ⓪(IF TextCol >= lineLen THEN
  452. ⓪*IF EOF (f) THEN
  453. ⓪,s[0]:= 0C;
  454. ⓪,RETURN FALSE
  455. ⓪*END;
  456. ⓪*INC (TextLine);
  457. ⓪*Text.ReadString (f, line);
  458. ⓪*TextCol:= 0;
  459. ⓪*IF line [0] = '*' THEN          (* Kommentar *)
  460. ⓪,line:= ''
  461. ⓪*END;
  462. ⓪*lineLen:= FastStrings.Length (line);
  463. ⓪(END;
  464. ⓪(ASSEMBLER
  465. ⓪0; WHILE char (line, TextCol) = ' ' DO INC (TextCol) END;
  466. ⓪0MOVE.L  (A6),A0
  467. ⓪0MOVE.W  TextCol,D0
  468. ⓪0MOVE.W  lineLen(A0),D1
  469. ⓪0LEA     line(A0),A1
  470. ⓪0MOVE.W  D1,D2
  471. ⓪.again
  472. ⓪0CMP.W   D1,D0
  473. ⓪0BCC     ende
  474. ⓪0CMPI.B  #' ',0(A1,D0.W)
  475. ⓪0BNE     cont
  476. ⓪0ADDQ.W  #1,D0
  477. ⓪0BRA     again
  478. ⓪.cont
  479. ⓪0MOVE    D0,-(A7)
  480. ⓪0ADDQ.W  #1,D0
  481. ⓪.aga2
  482. ⓪0CMP.W   D1,D0
  483. ⓪0BCC     end2
  484. ⓪0CMPI.B  #' ',0(A1,D0.W)
  485. ⓪0BEQ     end3
  486. ⓪0ADDQ.W  #1,D0
  487. ⓪0BRA     aga2
  488. ⓪.end3
  489. ⓪0MOVE    D0,D2
  490. ⓪.end2
  491. ⓪0MOVE    (A7)+,D0
  492. ⓪.ende
  493. ⓪0MOVE.W  D0,TextCol
  494. ⓪0SUB.W   D0,D2
  495. ⓪0MOVE.W  D2,p(A6)
  496. ⓪(END;
  497. ⓪(IF p>0 THEN
  498. ⓪*FastStrings.Copy (line, TextCol, p, s);
  499. ⓪*INC (TextCol, p);
  500. ⓪*RETURN TRUE
  501. ⓪(END;
  502. ⓪&END (* LOOP *)
  503. ⓪$END getIdent;
  504. ⓪ 
  505. ⓪"PROCEDURE newUse (name : ARRAY OF CHAR);
  506. ⓪$VAR inclink : IncList; err : BOOLEAN;
  507. ⓪$BEGIN
  508. ⓪&NEW (inclink);
  509. ⓪&IF inclink = NIL THEN termNoMem END;
  510. ⓪&inclink^.next := actmod^.uses;
  511. ⓪&actmod^.uses := inclink;
  512. ⓪&Assign (name, inclink^.fullname, err);
  513. ⓪$END newUse;
  514. ⓪ 
  515. ⓪"PROCEDURE newInc (name : ARRAY OF CHAR);
  516. ⓪$VAR inclink : IncList; err : BOOLEAN;
  517. ⓪$BEGIN
  518. ⓪&NEW (inclink);
  519. ⓪&IF inclink = NIL THEN termNoMem END;
  520. ⓪&inclink^.next := actmod^.include;
  521. ⓪&actmod^.include := inclink;
  522. ⓪&Assign (name, inclink^.fullname, err);
  523. ⓪$END newInc;
  524. ⓪ 
  525. ⓪"PROCEDURE newImport (VAR name: ARRAY OF CHAR);
  526. ⓪$VAR implink: ImpList; impmod: PtrMod;
  527. ⓪$BEGIN
  528. ⓪&IF ~avail (name, def, impmod) THEN
  529. ⓪(newMod (name, def, impmod);
  530. ⓪&END;
  531. ⓪&NEW (implink);
  532. ⓪&implink^.next:= actmod^.import;
  533. ⓪&implink^.modPtr := impmod;
  534. ⓪&actmod^.import:= implink
  535. ⓪$END newImport;
  536. ⓪ 
  537. ⓪"VAR   actname, dummy: String;
  538. ⓪(n: INTEGER;
  539. ⓪(empty, firstMain, mainMod, mainImp, ignore: BOOLEAN;
  540. ⓪(idNOSOURCE, idMAIN, idMOD, idDEF, idIMPMOD, idIMP,
  541. ⓪(idNONE, idSOURCE, idINC, idUSES, idIMPORT: String;
  542. ⓪(acttype: ModType;
  543. ⓪(state: (ModOrType, waitModName, waitType, waitCodeName, waitSource,
  544. ⓪0waitSourceName, waitInc, waitUseName, waitIncName, waitImport,
  545. ⓪0waitImportName);
  546. ⓪ 
  547. ⓪"BEGIN (* readIdents *)
  548. ⓪$SearchFile (makename, (*!TT*)SrcPaths, fromStart, ok, fname);
  549. ⓪$Open (f, fname, readSeqTxt);
  550. ⓪$checkState;
  551. ⓪$TextLine:= 0;
  552. ⓪$FastStrings.Assign (fname, TextName);
  553. ⓪ 
  554. ⓪$WriteLn;
  555. ⓪$WriteString(readng);
  556. ⓪$WriteString (fname);
  557. ⓪ 
  558. ⓪$idMOD:= '-MOD';
  559. ⓪$idDEF:= '-DEF';
  560. ⓪$idIMP:= '-IMP';
  561. ⓪$idIMPMOD:= '-IMPMOD';
  562. ⓪$idNONE:= '-IGNORE';
  563. ⓪$idMAIN:= '-MAIN';
  564. ⓪$idSOURCE:= '-SOURCE';
  565. ⓪$idNOSOURCE:= '-NOSRC';
  566. ⓪$idINC := '-INC';
  567. ⓪$idUSES:= '-USES';
  568. ⓪$idIMPORT:= '-IMPORT';
  569. ⓪$
  570. ⓪$TextCol:= 0; lineLen:= 0; line:= '';
  571. ⓪$state:= waitModName;
  572. ⓪$mainImp:= FALSE;
  573. ⓪$firstMain:= TRUE;
  574. ⓪$empty:= TRUE;
  575. ⓪$(*$D-*)
  576. ⓪$WHILE getIdent (id) DO
  577. ⓪&empty:= FALSE;
  578. ⓪&LOOP
  579. ⓪(CASE state OF
  580. ⓪*ModOrType:
  581. ⓪,IF id [0] = '-' THEN
  582. ⓪.state := waitType
  583. ⓪,ELSE
  584. ⓪.state := waitModName
  585. ⓪,END |
  586. ⓪*waitModName:
  587. ⓪,IF id [0] = '-' THEN syntaxError (nameExp) END;
  588. ⓪,mainMod:= FALSE;
  589. ⓪,actname:= id; state:= waitType; EXIT |
  590. ⓪*waitType:
  591. ⓪,Upper (id);
  592. ⓪,ignore:= FALSE;
  593. ⓪,mainImp:= FALSE;
  594. ⓪,IF    StrEqual (id, idDEF) THEN
  595. ⓪.acttype:= def;
  596. ⓪,ELSIF StrEqual (id, idIMP) THEN
  597. ⓪.acttype:= imp;
  598. ⓪,ELSIF StrEqual (id, idMOD) THEN
  599. ⓪.acttype:= mod
  600. ⓪,ELSIF StrEqual (id, idIMPMOD) THEN
  601. ⓪.acttype:= imp;
  602. ⓪.mainImp:= TRUE
  603. ⓪,ELSIF StrEqual (id, idNONE) THEN
  604. ⓪.acttype:= def;
  605. ⓪.ignore:= TRUE
  606. ⓪,ELSIF StrEqual (id, idMAIN) THEN
  607. ⓪.mainMod:= TRUE;
  608. ⓪.state:= ModOrType;
  609. ⓪.EXIT
  610. ⓪,ELSE
  611. ⓪.syntaxError (typeExp)
  612. ⓪,END;
  613. ⓪,IF avail (actname, acttype, actmod) THEN
  614. ⓪.IF ~Empty (actmod^.codeName) THEN
  615. ⓪0WriteLn;
  616. ⓪0WriteString (actname);
  617. ⓪0term (dblid)
  618. ⓪.ELSIF ignore THEN
  619. ⓪0actmod^.ignore:= TRUE
  620. ⓪.END
  621. ⓪,ELSE
  622. ⓪.newMod (actname, acttype, actmod);
  623. ⓪,END;
  624. ⓪,IF ignore THEN
  625. ⓪.state:= waitModName
  626. ⓪,ELSE
  627. ⓪.state:= waitCodeName
  628. ⓪,END;
  629. ⓪,EXIT |
  630. ⓪*waitCodeName:
  631. ⓪,IF id [0] = '-' THEN syntaxError (fileExp) END;
  632. ⓪,ReplaceHome (id);
  633. ⓪,actmod^.codeName:= id;
  634. ⓪,IF mainMod & firstMain THEN
  635. ⓪.firstMain:= FALSE;
  636. ⓪.FastStrings.Assign (actmod^.name, ModuleName);
  637. ⓪.FastStrings.Assign (actmod^.codeName, CodeName);
  638. ⓪,END;
  639. ⓪,state:= waitSource; EXIT |
  640. ⓪*waitSource:
  641. ⓪,IF StrEqual (id, idSOURCE) THEN
  642. ⓪.actmod^.withSource:= TRUE; state:= waitSourceName; EXIT
  643. ⓪,ELSIF StrEqual (id, idNOSOURCE) THEN
  644. ⓪.actmod^.ignoreSource:= TRUE;
  645. ⓪.IF acttype = mod THEN
  646. ⓪0state:= waitModName
  647. ⓪.ELSE
  648. ⓪0state := ModOrType
  649. ⓪.END;
  650. ⓪.EXIT
  651. ⓪,ELSE
  652. ⓪.syntaxError (srcExp);
  653. ⓪,END |
  654. ⓪*waitSourceName:
  655. ⓪,IF id [0] = '-' THEN syntaxError (srcnExp) END;
  656. ⓪,ReplaceHome (id);
  657. ⓪,actmod^.sourceName:= id;
  658. ⓪,actmod^.include:= NIL;
  659. ⓪,actmod^.uses:= NIL;
  660. ⓪,actmod^.import:= NIL;
  661. ⓪,IF NOT mainImp & (actmod^.type = imp) THEN
  662. ⓪.(* eigenes Def-Modul importieren *)
  663. ⓪.newImport (actname)
  664. ⓪,END;
  665. ⓪,state:= waitInc;
  666. ⓪,EXIT |
  667. ⓪*waitInc:
  668. ⓪,IF StrEqual (id, idINC) THEN
  669. ⓪.state:= waitIncName; EXIT
  670. ⓪,ELSIF StrEqual (id, idUSES) THEN
  671. ⓪.state:= waitUseName; EXIT
  672. ⓪,ELSE
  673. ⓪.state:= waitImport
  674. ⓪,END; |
  675. ⓪*waitIncName, waitUseName:
  676. ⓪,IF id [0] = '-' THEN syntaxError (fileExp) END;
  677. ⓪,n:= Pos (';', id, 0);
  678. ⓪,IF n>=0 THEN (* Ende der Includes *)
  679. ⓪.state := waitImport;
  680. ⓪.IF n=0 THEN EXIT END;
  681. ⓪.Copy (id, 0, n, id, ok)
  682. ⓪,END;
  683. ⓪,ReplaceHome (id);
  684. ⓪,IF state = waitIncName THEN
  685. ⓪.newInc (id)
  686. ⓪,ELSE
  687. ⓪.newUse (id)
  688. ⓪,END;
  689. ⓪,EXIT |
  690. ⓪*waitImport:
  691. ⓪,IF StrEqual (id, idIMPORT) THEN
  692. ⓪.state:= waitImportName; EXIT
  693. ⓪,ELSE
  694. ⓪.IF acttype = mod THEN state:= waitModName
  695. ⓪.ELSE state := ModOrType END;
  696. ⓪,END |
  697. ⓪*waitImportName:
  698. ⓪,IF id [0] = '-' THEN syntaxError (nameExp) END;
  699. ⓪,n:= Pos (';', id, 0);
  700. ⓪,IF n>=0 THEN (* Ende der Importe *)
  701. ⓪.IF acttype = mod THEN state:= waitModName
  702. ⓪.ELSE state := ModOrType END;
  703. ⓪.IF n=0 THEN EXIT END;
  704. ⓪.Copy (id, 0, n, id, ok)
  705. ⓪,END;
  706. ⓪,newImport (id);
  707. ⓪,EXIT |
  708. ⓪(END  (* CASE state OF *)
  709. ⓪&END  (* LOOP *)
  710. ⓪$END; (* WHILE getIdent (id) *)
  711. ⓪$(*$D-*)
  712. ⓪$Close (f);
  713. ⓪$IF empty THEN
  714. ⓪&term3 (noFile)
  715. ⓪$END
  716. ⓪"END readIdents;
  717. ⓪ 
  718. ⓪ PROCEDURE verifyIdents (): BOOLEAN;
  719. ⓪"VAR modPtr: PtrMod;
  720. ⓪"BEGIN
  721. ⓪$ResetList (modlist);
  722. ⓪$LOOP
  723. ⓪&modPtr:= NextEntry (modlist);
  724. ⓪&IF modPtr = NIL THEN EXIT END;
  725. ⓪&IF ~modPtr^.ignore & Empty (modPtr^.codeName) THEN
  726. ⓪(WriteLn;
  727. ⓪(WriteString (modPtr^.name);
  728. ⓪(WriteString (notDef);
  729. ⓪(waitAtEnd:= TRUE;
  730. ⓪&END
  731. ⓪$END;
  732. ⓪$RETURN ~waitAtEnd
  733. ⓪"END verifyIdents;
  734. ⓪ 
  735. ⓪ 
  736. ⓪ PROCEDURE getFileDateTime (REF name: ARRAY OF CHAR;
  737. ⓪;VAR date, time: CARDINAL): BOOLEAN;
  738. ⓪"VAR f: File; entry: DirEntry; res: INTEGER;
  739. ⓪"BEGIN
  740. ⓪$GetDirEntry (name, entry, res);
  741. ⓪$IF res >= 0 THEN
  742. ⓪&date:= PackDate (entry.date);
  743. ⓪&time:= PackTime (entry.time);
  744. ⓪$END;
  745. ⓪$RETURN res >= 0
  746. ⓪"END getFileDateTime;
  747. ⓪ 
  748. ⓪ 
  749. ⓪ PROCEDURE getTime (): BOOLEAN;
  750. ⓪ 
  751. ⓪ TYPE
  752. ⓪"FileEntry = RECORD
  753. ⓪0name : ARRAY [0..12] OF CHAR;
  754. ⓪0modPtr : PtrMod;
  755. ⓪.END;
  756. ⓪"PtrFile = POINTER TO FileEntry;
  757. ⓪"FullEntry = RECORD
  758. ⓪0fullname : ARRAY [0..80] OF CHAR;
  759. ⓪0modPtr : ADDRESS;
  760. ⓪0typ : FileType;
  761. ⓪.END;
  762. ⓪"PtrFullEntry = POINTER TO FullEntry;
  763. ⓪"
  764. ⓪ VAR
  765. ⓪"pmod: PtrMod;
  766. ⓪"err: BOOLEAN;
  767. ⓪"ModCodes : List; (* OF FileEntry *)
  768. ⓪"DefCodes : List; (* OF FileEntry *)
  769. ⓪"ImpCodes : List; (* OF FileEntry *)
  770. ⓪"Sources  : List; (* OF FileEntry *)
  771. ⓪"Defaults : List; (* OF FileEntry *)
  772. ⓪"withPath : List; (* OF FullEntry *)
  773. ⓪ 
  774. ⓪ 
  775. ⓪"PROCEDURE insCode (REF name : ARRAY OF CHAR; type : ModType; pmod : PtrMod);
  776. ⓪"VAR
  777. ⓪$merr : BOOLEAN;
  778. ⓪$Fentry : PtrFile;
  779. ⓪$FullE  : PtrFullEntry;
  780. ⓪$path : ARRAY [0..127] OF CHAR;
  781. ⓪$fname: ARRAY [0..12] OF CHAR;
  782. ⓪"BEGIN
  783. ⓪$SplitPath (name, path, fname);
  784. ⓪$IF path[0] = 0C THEN
  785. ⓪&NEW (Fentry);
  786. ⓪&IF Fentry=NIL THEN termNoMem END;
  787. ⓪&IF type = mod THEN
  788. ⓪(AppendEntry (ModCodes, Fentry, merr);
  789. ⓪&ELSIF type = def THEN
  790. ⓪(AppendEntry (DefCodes, Fentry, merr);
  791. ⓪&ELSIF type = imp THEN
  792. ⓪(AppendEntry (ImpCodes, Fentry, merr);
  793. ⓪&END;
  794. ⓪&IF merr THEN termNoMem END;
  795. ⓪&Assign (name, Fentry^.name, merr);
  796. ⓪&Fentry^.modPtr := pmod;
  797. ⓪$ELSE
  798. ⓪&NEW (FullE);
  799. ⓪&IF FullE = NIL THEN termNoMem END;
  800. ⓪&AppendEntry (withPath, FullE, merr);
  801. ⓪&IF merr THEN termNoMem END;
  802. ⓪&Assign (name, FullE^.fullname, merr);
  803. ⓪&FullE^.modPtr := pmod;
  804. ⓪&FullE^.typ := type;
  805. ⓪$END;
  806. ⓪"END insCode;
  807. ⓪"
  808. ⓪"PROCEDURE insSource (REF name : ARRAY OF CHAR; type : ModType; pmod : PtrMod);
  809. ⓪"VAR
  810. ⓪$merr : BOOLEAN;
  811. ⓪$Fentry : PtrFile;
  812. ⓪$FullE  : PtrFullEntry;
  813. ⓪$path : ARRAY [0..80] OF CHAR;
  814. ⓪$fname: ARRAY [0..12] OF CHAR;
  815. ⓪$actinc : IncList;
  816. ⓪"BEGIN
  817. ⓪$SplitPath (name, path, fname);
  818. ⓪$IF path[0]=0C THEN
  819. ⓪&NEW (Fentry);
  820. ⓪&IF Fentry = NIL THEN termNoMem END;
  821. ⓪&AppendEntry (Sources, Fentry, merr);
  822. ⓪&IF merr THEN termNoMem END;
  823. ⓪&Assign (name, Fentry^.name, merr);
  824. ⓪&Fentry^.modPtr := pmod;
  825. ⓪$ELSE
  826. ⓪&NEW (FullE);
  827. ⓪&IF FullE = NIL THEN termNoMem END;
  828. ⓪&AppendEntry (withPath, FullE, merr);
  829. ⓪&IF merr THEN termNoMem END;
  830. ⓪&Assign (name, FullE^.fullname, merr);
  831. ⓪&FullE^.modPtr := pmod;
  832. ⓪&FullE^.typ := src;
  833. ⓪$END;
  834. ⓪$(*!!! INC sollten, wenn kein Pfad angegeben, in 'Sources' eingetragen werden *)
  835. ⓪$actinc := pmod^.include;
  836. ⓪$WHILE (actinc <> NIL) DO
  837. ⓪&NEW (FullE);
  838. ⓪&AppendEntry (withPath, FullE, merr);
  839. ⓪&IF merr THEN termNoMem END;
  840. ⓪&Assign (actinc^.fullname, FullE^.fullname, merr);
  841. ⓪&FullE^.modPtr := actinc;
  842. ⓪&FullE^.typ := inc;
  843. ⓪&actinc := actinc^.next;
  844. ⓪$END;
  845. ⓪$(*!!! USES sollten, wenn kein Pfad angegeben, in 'Defaults' eingetragen werden *)
  846. ⓪$actinc := pmod^.uses;
  847. ⓪$WHILE (actinc <> NIL) DO
  848. ⓪&NEW (FullE);
  849. ⓪&AppendEntry (withPath, FullE, merr);
  850. ⓪&IF merr THEN termNoMem END;
  851. ⓪&Assign (actinc^.fullname, FullE^.fullname, merr);
  852. ⓪&FullE^.modPtr := actinc;
  853. ⓪&FullE^.typ := uses;
  854. ⓪&actinc := actinc^.next;
  855. ⓪$END;
  856. ⓪"END insSource;
  857. ⓪ 
  858. ⓪"PROCEDURE markToCompile (modPtr: PtrMod; name: ARRAY OF CHAR);
  859. ⓪$BEGIN
  860. ⓪&WITH modPtr^ DO
  861. ⓪(date := 0;
  862. ⓪(time := 0;
  863. ⓪&END; (* WITH *)
  864. ⓪$END markToCompile;
  865. ⓪ 
  866. ⓪ 
  867. ⓪"PROCEDURE getModTimes();
  868. ⓪"VAR
  869. ⓪$PathPtr : PathEntry;
  870. ⓪$FilePtr : PtrFile;
  871. ⓪$path, cn : String;
  872. ⓪$c: CHAR;
  873. ⓪$ok, rerr : BOOLEAN;
  874. ⓪"BEGIN
  875. ⓪$ResetList(ModPaths);
  876. ⓪$LOOP
  877. ⓪&PathPtr := NextEntry(ModPaths);
  878. ⓪&IF PathPtr = NIL THEN EXIT END;
  879. ⓪&Assign (PathPtr^,path,ok);
  880. ⓪&ValidatePath (path);
  881. ⓪&ReplaceHome (path);
  882. ⓪&ResetList(ModCodes);
  883. ⓪&LOOP
  884. ⓪(FilePtr := NextEntry (ModCodes);
  885. ⓪(IF FilePtr = NIL THEN EXIT END;
  886. ⓪(Concat (path, FilePtr^.name, cn, ok);
  887. ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN
  888. ⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);
  889. ⓪*RemoveEntry(ModCodes, rerr);
  890. ⓪*IF rerr THEN term3 (remErr) END;
  891. ⓪(END;
  892. ⓪&END; (* FileLoop *)
  893. ⓪&IF ListEmpty (ModCodes) THEN EXIT END;
  894. ⓪$END; (* PathLoop *)
  895. ⓪$IF ~ListEmpty(ModCodes) THEN
  896. ⓪&ResetList(ModCodes);
  897. ⓪&LOOP
  898. ⓪(FilePtr := NextEntry(ModCodes);
  899. ⓪(IF FilePtr = NIL THEN EXIT END;
  900. ⓪(IF FilePtr^.modPtr^.withSource THEN
  901. ⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);
  902. ⓪(ELSE
  903. ⓪*WriteLn;
  904. ⓪*WriteString (FilePtr^.name);
  905. ⓪*waitAtEnd:= TRUE
  906. ⓪(END;
  907. ⓪&END; (* LOOP *)
  908. ⓪$END; (* IF ~ListEmpty *)
  909. ⓪"END getModTimes;
  910. ⓪"
  911. ⓪"PROCEDURE getDefTimes();
  912. ⓪"VAR
  913. ⓪$PathPtr : PathEntry;
  914. ⓪$FilePtr : PtrFile;
  915. ⓪$path, cn : String;
  916. ⓪$c: CHAR;
  917. ⓪$ok, rerr : BOOLEAN;
  918. ⓪"BEGIN
  919. ⓪$ResetList(DefPaths);
  920. ⓪$LOOP
  921. ⓪&PathPtr := NextEntry(DefPaths);
  922. ⓪&IF PathPtr = NIL THEN EXIT END;
  923. ⓪&Assign (PathPtr^,path,ok);
  924. ⓪&ValidatePath (path);
  925. ⓪&ReplaceHome (path);
  926. ⓪&ResetList(DefCodes);
  927. ⓪&LOOP
  928. ⓪(FilePtr := NextEntry (DefCodes);
  929. ⓪(IF FilePtr = NIL THEN EXIT END;
  930. ⓪(Concat (path, FilePtr^.name, cn, ok);
  931. ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN
  932. ⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);
  933. ⓪*RemoveEntry(DefCodes, rerr);
  934. ⓪*IF rerr THEN term3 (remErr) END;
  935. ⓪(END;
  936. ⓪&END; (* FileLoop *)
  937. ⓪&IF ListEmpty (DefCodes) THEN EXIT END;
  938. ⓪$END; (* PathLoop *)
  939. ⓪$IF ~ListEmpty(DefCodes) THEN
  940. ⓪&ResetList(DefCodes);
  941. ⓪&LOOP
  942. ⓪(FilePtr := NextEntry(DefCodes);
  943. ⓪(IF FilePtr = NIL THEN EXIT END;
  944. ⓪(IF FilePtr^.modPtr^.withSource THEN
  945. ⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);
  946. ⓪(ELSE
  947. ⓪*WriteLn;
  948. ⓪*WriteString (FilePtr^.name);
  949. ⓪*waitAtEnd:= TRUE
  950. ⓪(END;
  951. ⓪&END; (* LOOP *)
  952. ⓪$END; (* IF ~ListEmpty *)
  953. ⓪"END getDefTimes;
  954. ⓪"
  955. ⓪"PROCEDURE getImpTimes();
  956. ⓪"VAR
  957. ⓪$PathPtr : PathEntry;
  958. ⓪$FilePtr : PtrFile;
  959. ⓪$path, cn : String;
  960. ⓪$c: CHAR;
  961. ⓪$ok, rerr : BOOLEAN;
  962. ⓪"BEGIN
  963. ⓪$ResetList(ImpPaths);
  964. ⓪$LOOP
  965. ⓪&PathPtr := NextEntry(ImpPaths);
  966. ⓪&IF PathPtr = NIL THEN EXIT END;
  967. ⓪&Assign (PathPtr^,path,ok);
  968. ⓪&ValidatePath (path);
  969. ⓪&ReplaceHome (path);
  970. ⓪&ResetList(ImpCodes);
  971. ⓪&LOOP
  972. ⓪(FilePtr := NextEntry (ImpCodes);
  973. ⓪(IF FilePtr = NIL THEN EXIT END;
  974. ⓪(Concat (path, FilePtr^.name, cn, ok);
  975. ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN
  976. ⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);
  977. ⓪*RemoveEntry(ImpCodes, rerr);
  978. ⓪*IF rerr THEN term3 (remErr) END;
  979. ⓪(END;
  980. ⓪&END; (* FileLoop *)
  981. ⓪&IF ListEmpty (ImpCodes) THEN EXIT END;
  982. ⓪$END; (* PathLoop *)
  983. ⓪$IF ~ListEmpty(ImpCodes) THEN
  984. ⓪&ResetList(ImpCodes);
  985. ⓪&LOOP
  986. ⓪(FilePtr := NextEntry(ImpCodes);
  987. ⓪(IF FilePtr = NIL THEN EXIT END;
  988. ⓪(IF FilePtr^.modPtr^.withSource THEN
  989. ⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);
  990. ⓪(ELSE
  991. ⓪*WriteLn;
  992. ⓪*WriteString (FilePtr^.name);
  993. ⓪*waitAtEnd:= TRUE
  994. ⓪(END;
  995. ⓪&END; (* LOOP *)
  996. ⓪$END; (* IF ~ListEmpty *)
  997. ⓪"END getImpTimes;
  998. ⓪ 
  999. ⓪"PROCEDURE getSrcTimes();
  1000. ⓪"VAR
  1001. ⓪$PathPtr : PathEntry;
  1002. ⓪$FilePtr : PtrFile;
  1003. ⓪$path, cn : String;
  1004. ⓪$ok, rerr : BOOLEAN;
  1005. ⓪"BEGIN
  1006. ⓪$ResetList(SrcPaths);
  1007. ⓪$LOOP
  1008. ⓪&PathPtr := NextEntry(SrcPaths);
  1009. ⓪&IF PathPtr = NIL THEN EXIT END;
  1010. ⓪&Assign (PathPtr^,path,ok);
  1011. ⓪&ValidatePath (path);
  1012. ⓪&ReplaceHome (path);
  1013. ⓪&ResetList(Sources);
  1014. ⓪&LOOP
  1015. ⓪(FilePtr := NextEntry (Sources);
  1016. ⓪(IF FilePtr = NIL THEN EXIT END;
  1017. ⓪(Concat (path, FilePtr^.name, cn, ok);
  1018. ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.sdate, FilePtr^.modPtr^.stime) THEN
  1019. ⓪*Assign (cn, FilePtr^.modPtr^.sourceName, ok);(*!!!das trifft auf INC nicht zu?! *)
  1020. ⓪*RemoveEntry(Sources, rerr);
  1021. ⓪*IF rerr THEN term3 (remErr) END;
  1022. ⓪(END;
  1023. ⓪&END; (* FileLoop *)
  1024. ⓪&IF ListEmpty (Sources) THEN EXIT END;
  1025. ⓪$END; (* PathLoop *)
  1026. ⓪$IF ~ListEmpty(Sources) THEN
  1027. ⓪&ResetList(Sources);
  1028. ⓪&WriteLn;
  1029. ⓪&LOOP
  1030. ⓪(FilePtr := NextEntry(Sources);
  1031. ⓪(IF FilePtr = NIL THEN EXIT END;
  1032. ⓪(WriteString (FilePtr^.name);
  1033. ⓪(WriteLn;
  1034. ⓪&END; (* LOOP *)
  1035. ⓪&waitAtEnd:= TRUE
  1036. ⓪$END; (* IF ~ListEmpty *)
  1037. ⓪"END getSrcTimes;
  1038. ⓪ 
  1039. ⓪ (*!TT
  1040. ⓪"PROCEDURE getDftTimes();
  1041. ⓪"VAR
  1042. ⓪$PathPtr : PathEntry;
  1043. ⓪$FilePtr : PtrFile;
  1044. ⓪$paths   : PathList;
  1045. ⓪$path, cn: String;
  1046. ⓪$ok, rerr: BOOLEAN;
  1047. ⓪"BEGIN
  1048. ⓪$paths:= StdPaths ();
  1049. ⓪$ResetList(paths);
  1050. ⓪$LOOP
  1051. ⓪&PathPtr := NextEntry(paths);
  1052. ⓪&IF PathPtr # NIL THEN Assign (PathPtr^,path,ok)
  1053. ⓪&ELSE EXIT END;
  1054. ⓪&ResetList(Defaults);
  1055. ⓪&LOOP
  1056. ⓪(FilePtr := NextEntry (Defaults);
  1057. ⓪(IF FilePtr = NIL THEN EXIT END;
  1058. ⓪(Concat (path, FilePtr^.name, cn, ok);
  1059. ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.sdate, FilePtr^.modPtr^.stime) THEN
  1060. ⓪*Assign (cn, FilePtr^.modPtr^.sourceName, ok);(*!!!das trifft auf USES nicht zu?! *)
  1061. ⓪*RemoveEntry(Defaults, rerr);
  1062. ⓪*IF rerr THEN term3 (remErr) END;
  1063. ⓪(END;
  1064. ⓪&END; (* FileLoop *)
  1065. ⓪$END; (* PathLoop *)
  1066. ⓪$IF ~ListEmpty(Defaults) THEN
  1067. ⓪&ResetList(Defaults);
  1068. ⓪&WriteLn;
  1069. ⓪&LOOP
  1070. ⓪(FilePtr := NextEntry(Defaults);
  1071. ⓪(IF FilePtr = NIL THEN EXIT END;
  1072. ⓪(WriteString (FilePtr^.name);
  1073. ⓪(WriteLn;
  1074. ⓪&END; (* LOOP *)
  1075. ⓪&waitAtEnd:= TRUE
  1076. ⓪$END; (* IF ~ListEmpty *)
  1077. ⓪"END getDftTimes;
  1078. ⓪ *)
  1079. ⓪ 
  1080. ⓪"PROCEDURE getPathTimes();
  1081. ⓪"VAR
  1082. ⓪$FilePtr : PtrFullEntry;
  1083. ⓪$pmod : PtrMod;
  1084. ⓪$pinc : IncList;
  1085. ⓪$sdate, stime: CARDINAL;
  1086. ⓪$fname: FileStr;
  1087. ⓪$paths: PathList;
  1088. ⓪$c: CHAR;
  1089. ⓪$ok, rerr : BOOLEAN;
  1090. ⓪"BEGIN
  1091. ⓪$ResetList(withPath);
  1092. ⓪$LOOP
  1093. ⓪&FilePtr := NextEntry (withPath);
  1094. ⓪&IF FilePtr = NIL THEN EXIT END;
  1095. ⓪&WITH FilePtr^ DO
  1096. ⓪(
  1097. ⓪((*!TT:*)
  1098. ⓪(ok:= getFileDateTime (HomeReplaced (fullname), sdate, stime);
  1099. ⓪(IF NOT ok THEN
  1100. ⓪*IF typ = mod THEN
  1101. ⓪,paths:= ModPaths
  1102. ⓪*ELSIF typ = def THEN
  1103. ⓪,paths:= DefPaths
  1104. ⓪*ELSIF typ = imp THEN
  1105. ⓪,paths:= ImpPaths
  1106. ⓪*ELSE
  1107. ⓪,paths:= SrcPaths
  1108. ⓪*END;
  1109. ⓪*SearchFile (fullname, paths, fromStart, ok, fname);
  1110. ⓪*ok:= getFileDateTime (fname, sdate, stime);
  1111. ⓪(END;
  1112. ⓪(
  1113. ⓪(IF ok THEN
  1114. ⓪*IF typ = src THEN
  1115. ⓪,pmod := modPtr;
  1116. ⓪,pmod^.sdate:= sdate;
  1117. ⓪,pmod^.stime:= stime;
  1118. ⓪*ELSIF (typ = inc) OR (typ = uses) THEN
  1119. ⓪,pinc := modPtr;
  1120. ⓪,pinc^.date:= sdate;
  1121. ⓪,pinc^.time:= stime;
  1122. ⓪*ELSE
  1123. ⓪,pmod := modPtr;
  1124. ⓪,pmod^.date:= sdate;
  1125. ⓪,pmod^.time:= stime
  1126. ⓪*END;
  1127. ⓪*RemoveEntry(withPath, rerr);
  1128. ⓪*IF rerr THEN term3 (remErr) END;
  1129. ⓪(END; (* IF State *)
  1130. ⓪&END; (* WITH FilePtr *)
  1131. ⓪$END; (* FileLoop *)
  1132. ⓪$IF ~ListEmpty(withPath) THEN
  1133. ⓪&ResetList(withPath);
  1134. ⓪&LOOP
  1135. ⓪(FilePtr := NextEntry(withPath);
  1136. ⓪(IF FilePtr = NIL THEN EXIT END;
  1137. ⓪(pmod := FilePtr^.modPtr;
  1138. ⓪(IF (FilePtr^.typ < src) & pmod^.withSource THEN
  1139. ⓪*(* Wenn's ein Code mit Source ist, fehlenden Code übersetzen *)
  1140. ⓪*markToCompile (pmod, FilePtr^.fullname)
  1141. ⓪(ELSE
  1142. ⓪*(* Sonst fehlende Datei melden *)
  1143. ⓪*WriteLn;
  1144. ⓪*WriteString (FilePtr^.fullname);
  1145. ⓪*waitAtEnd:= TRUE
  1146. ⓪(END;
  1147. ⓪&END; (* LOOP *)
  1148. ⓪$END; (* IF ~ListEmpty *)
  1149. ⓪"END getPathTimes;
  1150. ⓪ 
  1151. ⓪ (*
  1152. ⓪"PROCEDURE showL (l : List; Titel : ARRAY OF CHAR);
  1153. ⓪"VAR FilePtr : PtrFile;
  1154. ⓪"BEGIN
  1155. ⓪$WriteString(Titel);
  1156. ⓪$WriteLn;
  1157. ⓪$ResetList(l);
  1158. ⓪$LOOP
  1159. ⓪&FilePtr := NextEntry (l);
  1160. ⓪&IF FilePtr = NIL THEN EXIT END;
  1161. ⓪&WriteString (FilePtr^.name);
  1162. ⓪&WriteLn;
  1163. ⓪$END;
  1164. ⓪$WriteLn;
  1165. ⓪$REPEAT UNTIL KeyPressed();
  1166. ⓪$FlushKbd();
  1167. ⓪"END showL;
  1168. ⓪"
  1169. ⓪"PROCEDURE showP (l : List; Titel : ARRAY OF CHAR);
  1170. ⓪"VAR FilePtr : PtrFullEntry;
  1171. ⓪"BEGIN
  1172. ⓪$WriteString(Titel);
  1173. ⓪$WriteLn;
  1174. ⓪$ResetList(l);
  1175. ⓪$LOOP
  1176. ⓪&FilePtr := NextEntry (l);
  1177. ⓪&IF FilePtr = NIL THEN EXIT END;
  1178. ⓪&WriteString (FilePtr^.fullname);
  1179. ⓪&WriteLn;
  1180. ⓪$END;
  1181. ⓪$WriteLn;
  1182. ⓪$REPEAT UNTIL KeyPressed();
  1183. ⓪$FlushKbd();
  1184. ⓪"END showP;
  1185. ⓪ *)
  1186. ⓪ 
  1187. ⓪"BEGIN
  1188. ⓪$WriteLn;
  1189. ⓪$WriteString(scanin);
  1190. ⓪$CreateList (ModCodes, error);
  1191. ⓪$IF error THEN termNoMem END;
  1192. ⓪$CreateList (DefCodes, error);
  1193. ⓪$IF error THEN termNoMem END;
  1194. ⓪$CreateList (ImpCodes, error);
  1195. ⓪$IF error THEN termNoMem END;
  1196. ⓪$CreateList (Sources, error);
  1197. ⓪$IF error THEN termNoMem END;
  1198. ⓪$CreateList (Defaults, error);
  1199. ⓪$IF error THEN termNoMem END;
  1200. ⓪$CreateList (withPath, error);
  1201. ⓪$IF error THEN termNoMem END;
  1202. ⓪$
  1203. ⓪$ResetList (modlist);
  1204. ⓪$LOOP
  1205. ⓪&pmod:= NextEntry (modlist);
  1206. ⓪&IF pmod = NIL THEN EXIT END;
  1207. ⓪&IF ~pmod^.ignore THEN
  1208. ⓪(IF Empty (pmod^.codeName) THEN
  1209. ⓪*HALT
  1210. ⓪*(* müßte schon bei 'verifyIdents' geprüft worden sein:
  1211. ⓪,WriteLn;
  1212. ⓪,WriteString (pmod^.name);
  1213. ⓪,WriteString (notDef);
  1214. ⓪,waitAtEnd:= TRUE;
  1215. ⓪**)
  1216. ⓪(ELSIF ~waitAtEnd THEN
  1217. ⓪*WITH pmod^ DO
  1218. ⓪,insCode (codeName, type, pmod);
  1219. ⓪,IF withSource THEN
  1220. ⓪.insSource (sourceName, type, pmod);
  1221. ⓪,END;
  1222. ⓪*END;
  1223. ⓪(END;
  1224. ⓪&END
  1225. ⓪$END;
  1226. ⓪$IF NOT waitAtEnd THEN
  1227. ⓪&(*
  1228. ⓪&showL(ModCodes, 'Mod:');
  1229. ⓪&showL(DefCodes, 'Def:');
  1230. ⓪&showL(ImpCodes, 'Imp:');
  1231. ⓪&showL(Sources, 'Src:');
  1232. ⓪&showL(Defaults, 'Src:');
  1233. ⓪&showP(withPath, 'Mit Pfad:');
  1234. ⓪&*)
  1235. ⓪&(*!!!
  1236. ⓪&getdefaultTimes();
  1237. ⓪&*)
  1238. ⓪&WriteLn;
  1239. ⓪&getModTimes();
  1240. ⓪&getDefTimes();
  1241. ⓪&getImpTimes();
  1242. ⓪&getSrcTimes();
  1243. ⓪&getPathTimes();
  1244. ⓪&WriteLn;
  1245. ⓪&IF waitAtEnd THEN
  1246. ⓪(term3 (opnErr)
  1247. ⓪&END
  1248. ⓪$END;
  1249. ⓪$RETURN ~waitAtEnd
  1250. ⓪"END getTime;
  1251. ⓪ 
  1252. ⓪ (*
  1253. ⓪ PROCEDURE showIdents;
  1254. ⓪"VAR modPtr: PtrMod; c: CHAR; i: ImpList; s: String;
  1255. ⓪"BEGIN
  1256. ⓪$ResetList (modlist);
  1257. ⓪$LOOP
  1258. ⓪&modPtr:= NextEntry (modlist);
  1259. ⓪&IF modPtr = NIL THEN EXIT END;
  1260. ⓪&WITH modPtr^ DO
  1261. ⓪(WriteLn;
  1262. ⓪(WriteString (name);
  1263. ⓪(WriteString ('  ');
  1264. ⓪(IF type=def THEN WriteString ('DEF')
  1265. ⓪(ELSIF type=imp THEN WriteString ('IMP')
  1266. ⓪(ELSE WriteString ('MOD') END;
  1267. ⓪(WriteLn;
  1268. ⓪(WriteString ('Codename: ');
  1269. ⓪(WriteString (codeName);
  1270. ⓪(WriteString ('  ');
  1271. ⓪(DateToText (UnpackDate (date), '', s);
  1272. ⓪(WriteString (s);
  1273. ⓪(WriteString ('  ');
  1274. ⓪(TimeToText (UnpackTime (time), '', s);
  1275. ⓪(WriteString (s);
  1276. ⓪(IF withSource THEN
  1277. ⓪*WriteLn;
  1278. ⓪*WriteString ('Source: ');
  1279. ⓪*WriteString (sourceName);
  1280. ⓪*WriteString ('  ');
  1281. ⓪*DateToText (UnpackDate (sdate), '', s);
  1282. ⓪*WriteString (s);
  1283. ⓪*WriteString ('  ');
  1284. ⓪*TimeToText (UnpackTime (stime), '', s);
  1285. ⓪*WriteString (s);
  1286. ⓪*IF import # NIL THEN
  1287. ⓪,WriteLn;
  1288. ⓪,WriteString ('Imports: ');
  1289. ⓪,i:= import;
  1290. ⓪,LOOP
  1291. ⓪.WriteString (i^.modPtr^.name);
  1292. ⓪.i:= i^.next;
  1293. ⓪.IF i = NIL THEN EXIT END;
  1294. ⓪.WriteString (', ')
  1295. ⓪,END
  1296. ⓪*END  (* IF import # NIL *)
  1297. ⓪(END; (* IF withSource *)
  1298. ⓪(WriteLn;
  1299. ⓪(Read (c);
  1300. ⓪&END  (* WITH modPtr^ *)
  1301. ⓪$END; (* LOOP *)
  1302. ⓪"END showIdents;
  1303. ⓪ *)
  1304. ⓪ 
  1305. ⓪ PROCEDURE chkTree;
  1306. ⓪"VAR
  1307. ⓪$modPtr: PtrMod;
  1308. ⓪$cdate, ctime : CARDINAL;
  1309. ⓪$currtime: moment;
  1310. ⓪$success : BOOLEAN;
  1311. ⓪$mustCompile: BOOLEAN;
  1312. ⓪ 
  1313. ⓪"PROCEDURE toCompile (REF sourceName, codeName, clientName: ARRAY OF CHAR);
  1314. ⓪$VAR s, s2: String;
  1315. ⓪$BEGIN
  1316. ⓪&mustCompile:= TRUE;
  1317. ⓪&Text.WriteString (compfile, '(*$I ');
  1318. ⓪&Text.WriteString (compfile, sourceName);
  1319. ⓪&IF codeName[0] # '' THEN
  1320. ⓪(Text.WriteString (compfile, '  Code: ');
  1321. ⓪(SplitPath (codeName, s, s2);
  1322. ⓪(Text.WriteString (compfile, s)
  1323. ⓪&END;
  1324. ⓪&IF clientName[0] # '' THEN
  1325. ⓪(Text.WriteString (compfile, '  Reason: ');
  1326. ⓪(Text.WriteString (compfile, clientName)
  1327. ⓪&END;
  1328. ⓪&Text.WriteString (compfile, ' *)');
  1329. ⓪&Text.WriteLn (compfile);
  1330. ⓪$END toCompile;
  1331. ⓪ 
  1332. ⓪"PROCEDURE illegalSourceTime (REF sourceName: ARRAY OF CHAR);
  1333. ⓪$BEGIN
  1334. ⓪&WriteLn;
  1335. ⓪&WriteString (sourceName);
  1336. ⓪&WriteString (datErr);
  1337. ⓪&waitAtEnd:= TRUE
  1338. ⓪$END illegalSourceTime;
  1339. ⓪ 
  1340. ⓪"PROCEDURE illegalCodeTime (REF codeName: ARRAY OF CHAR);
  1341. ⓪$BEGIN
  1342. ⓪&WriteLn;
  1343. ⓪&WriteString (codeName);
  1344. ⓪&WriteString (datErr);
  1345. ⓪&waitAtEnd:= TRUE
  1346. ⓪$END illegalCodeTime;
  1347. ⓪ 
  1348. ⓪"PROCEDURE toMoment (date : CARDINAL; time : CARDINAL) : moment;
  1349. ⓪$BEGIN
  1350. ⓪&RETURN (LONG(time)+LONG(date)*$10000L);
  1351. ⓪$END toMoment;
  1352. ⓪ 
  1353. ⓪"PROCEDURE setTimeDate (time: moment; modPtr: PtrMod);
  1354. ⓪$BEGIN
  1355. ⓪&modPtr^.date:= SHORT (time DIV $10000);
  1356. ⓪&modPtr^.time:= SHORT (time MOD $10000);
  1357. ⓪$END setTimeDate;
  1358. ⓪ 
  1359. ⓪"PROCEDURE Lmax (a, b : LONGCARD) : LONGCARD;
  1360. ⓪$BEGIN
  1361. ⓪&IF a>b THEN RETURN a
  1362. ⓪&ELSE RETURN b END;
  1363. ⓪$END Lmax;
  1364. ⓪ 
  1365. ⓪"PROCEDURE chkDate(aktmod : PtrMod) : moment;
  1366. ⓪$VAR
  1367. ⓪&clientName: String;
  1368. ⓪&aktimp: ImpList;
  1369. ⓪&this, maximp, codeMom, sourceMom: moment;
  1370. ⓪ 
  1371. ⓪$PROCEDURE check (aktinc: IncList);
  1372. ⓪&VAR incTime: moment;
  1373. ⓪&BEGIN
  1374. ⓪(WHILE (aktinc <> NIL) DO
  1375. ⓪*incTime:= toMoment(aktinc^.date, aktinc^.time);
  1376. ⓪*IF incTime > sourceMom THEN
  1377. ⓪,sourceMom:= incTime;
  1378. ⓪,IF (sourceMom > codeMom) & (clientName[0] = '') THEN
  1379. ⓪.Assign (aktinc^.fullname, clientName, ok)
  1380. ⓪,END
  1381. ⓪*END;
  1382. ⓪*aktinc := aktinc^.next;
  1383. ⓪(END
  1384. ⓪&END check;
  1385. ⓪ 
  1386. ⓪$BEGIN
  1387. ⓪&codeMom:= 0;
  1388. ⓪&clientName:= '';
  1389. ⓪&WITH aktmod^ DO
  1390. ⓪(IF NOT ignore THEN
  1391. ⓪*IF build THEN
  1392. ⓪,codeMom:= 0
  1393. ⓪*ELSE
  1394. ⓪,codeMom:= toMoment(date, time);
  1395. ⓪*END;
  1396. ⓪*IF NOT checked THEN
  1397. ⓪,checked:= TRUE;
  1398. ⓪,IF codeMom > currtime THEN illegalCodeTime (codeName) END;
  1399. ⓪,IF withSource THEN
  1400. ⓪.IF build THEN
  1401. ⓪0sourceMom:= 0
  1402. ⓪.ELSE
  1403. ⓪0sourceMom:= toMoment(sdate, stime);
  1404. ⓪.END;
  1405. ⓪.IF sourceMom > currtime THEN illegalSourceTime (sourceName) END;
  1406. ⓪.IF NOT build THEN
  1407. ⓪0IF sourceMom > codeMom THEN
  1408. ⓪2IF codeMom = 0 THEN
  1409. ⓪4clientName:= NoCodeMsg
  1410. ⓪2ELSE
  1411. ⓪4clientName:= SelfMsg
  1412. ⓪2END
  1413. ⓪0END;
  1414. ⓪0check (include);
  1415. ⓪0check (uses);
  1416. ⓪.END;
  1417. ⓪.maximp:= 0L;
  1418. ⓪.aktimp:= import;
  1419. ⓪.WHILE aktimp <> NIL DO
  1420. ⓪0this:= chkDate(aktimp^.modPtr);
  1421. ⓪0IF this > maximp THEN
  1422. ⓪2maximp:= this;
  1423. ⓪2IF (maximp > codeMom) & (sourceMom <= codeMom) THEN
  1424. ⓪4Assign (aktimp^.modPtr^.codeName, clientName, ok)
  1425. ⓪2END
  1426. ⓪0END;
  1427. ⓪0aktimp:= aktimp^.next;
  1428. ⓪.END; (* WHILE *)
  1429. ⓪.IF build OR (buildImp & (type # def))
  1430. ⓪.OR (maximp>codeMom) OR (sourceMom>codeMom) THEN
  1431. ⓪0IF build THEN clientName:= '' END;
  1432. ⓪0toCompile (sourceName, codeName, clientName);
  1433. ⓪0codeMom:= currtime;
  1434. ⓪0setTimeDate (codeMom, aktmod);
  1435. ⓪.END;
  1436. ⓪,END; (* IF withSource *)
  1437. ⓪*END; (* IF NOT checked *)
  1438. ⓪(END; (* IF NOT ignore *)
  1439. ⓪&END; (* WITH *)
  1440. ⓪&RETURN codeMom;
  1441. ⓪$END chkDate;
  1442. ⓪ 
  1443. ⓪"VAR cn: String; ok: BOOLEAN; ml: List; dummy: moment;
  1444. ⓪ 
  1445. ⓪"BEGIN
  1446. ⓪$WriteLn;
  1447. ⓪$
  1448. ⓪$ctime:= PackTime(CurrentTime());
  1449. ⓪$cdate:= PackDate(CurrentDate());
  1450. ⓪$currtime:= toMoment(cdate, ctime);
  1451. ⓪ 
  1452. ⓪$ConcatPath (HomeReplaced (TemporaryPath), compFileName, cn);
  1453. ⓪$Create(compfile, cn, writeSeqTxt, replaceOld);
  1454. ⓪$IF State(compfile)<0 THEN term3 (noCom) END;
  1455. ⓪ 
  1456. ⓪$ml:= modlist;
  1457. ⓪$ResetList (ml);
  1458. ⓪$mustCompile:= FALSE;
  1459. ⓪$LOOP
  1460. ⓪&modPtr:= NextEntry (ml);
  1461. ⓪&IF modPtr = NIL THEN EXIT END;
  1462. ⓪&IF NOT modPtr^.checked THEN
  1463. ⓪(dummy:= chkDate (modPtr)
  1464. ⓪&END
  1465. ⓪$END;
  1466. ⓪ 
  1467. ⓪$IF waitAtEnd THEN
  1468. ⓪&Remove (compfile)
  1469. ⓪$ELSIF mustCompile THEN
  1470. ⓪&exitCode:= 0;
  1471. ⓪&WriteString (toComp);
  1472. ⓪&Close (compfile);
  1473. ⓪$ELSE
  1474. ⓪&exitCode:= 1;
  1475. ⓪&WriteString (noComp);
  1476. ⓪&Remove (compfile);
  1477. ⓪$END;
  1478. ⓪ 
  1479. ⓪"END chkTree;
  1480. ⓪ 
  1481. ⓪ 
  1482. ⓪ VAR ch: CHAR;
  1483. ⓪$n, i, argc: CARDINAL;
  1484. ⓪$opts: String;
  1485. ⓪$argv: ARRAY [0..1] OF PtrArgStr;
  1486. ⓪ 
  1487. ⓪ BEGIN
  1488. ⓪"WriteLn;
  1489. ⓪"WriteString (titl1);
  1490. ⓪"WriteLn;
  1491. ⓪"WriteString (titl2);
  1492. ⓪"WriteLn;
  1493. ⓪ 
  1494. ⓪"HomePath:= ShellPath;
  1495. ⓪ 
  1496. ⓪"CodeName:= '';
  1497. ⓪"ModuleName:= '';
  1498. ⓪ 
  1499. ⓪"CreateList (modlist, error);
  1500. ⓪"IF error THEN termNoMem END;
  1501. ⓪ 
  1502. ⓪"(* MAKE-Datei einlesen, Daten in 'modlist' einfügen *)
  1503. ⓪"build:= FALSE;
  1504. ⓪"buildImp:= FALSE;
  1505. ⓪"InitArgCV (argc, argv);
  1506. ⓪"n:= 1; (* mögl. Pos. des Filenamens *)
  1507. ⓪"FOR i:= 1 TO argc-1 DO
  1508. ⓪$Upper (argv[i]^);
  1509. ⓪$IF StrEqual ('-B', argv[i]^) THEN
  1510. ⓪&IF i = 1 THEN n:= 2 (* neue mögl. Pos. des Filenamens *) END;
  1511. ⓪&build:= TRUE
  1512. ⓪$ELSIF StrEqual ('-BI', argv[i]^) THEN
  1513. ⓪&IF i = 1 THEN n:= 2 (* neue mögl. Pos. des Filenamens *) END;
  1514. ⓪&buildImp:= TRUE
  1515. ⓪$END
  1516. ⓪"END;
  1517. ⓪"IF argc > n THEN
  1518. ⓪$readIdents (argv[n]^)
  1519. ⓪"ELSE
  1520. ⓪$Upper (MakeFileName);
  1521. ⓪$EatSpaces (MakeFileName);
  1522. ⓪$(* Prüfen, ob "-B" am Anfang steht *)
  1523. ⓪$IF StrEqual ("-B", FuncStrings.CopyStr (MakeFileName, 0, 2)) THEN
  1524. ⓪&IF StrEqual ("-BI", FuncStrings.CopyStr (MakeFileName, 0, 3)) THEN
  1525. ⓪(buildImp:= TRUE;
  1526. ⓪&ELSE
  1527. ⓪(build:= TRUE;
  1528. ⓪&END;
  1529. ⓪&Delete (MakeFileName, 0, 2, ok);
  1530. ⓪$ELSE
  1531. ⓪&Split (MakeFileName,
  1532. ⓪-PosLen ("-", MakeFileName, 0),
  1533. ⓪-MakeFileName, opts, ok);
  1534. ⓪&IF StrEqual ("-B", opts) THEN
  1535. ⓪(build:= TRUE
  1536. ⓪&ELSIF StrEqual ("-BI", opts) THEN
  1537. ⓪(buildImp:= TRUE
  1538. ⓪&END
  1539. ⓪$END;
  1540. ⓪$readIdents (MakeFileName)
  1541. ⓪"END;
  1542. ⓪ 
  1543. ⓪"exitCode:= -1;
  1544. ⓪"waitAtEnd:= FALSE;
  1545. ⓪ 
  1546. ⓪"IF verifyIdents () THEN
  1547. ⓪$IF build OR getTime () THEN
  1548. ⓪&(*showIdents;*)
  1549. ⓪&chkTree;
  1550. ⓪$END
  1551. ⓪"END;
  1552. ⓪ 
  1553. ⓪"IF waitAtEnd THEN
  1554. ⓪$term3 ('')
  1555. ⓪"ELSE
  1556. ⓪$TermProcess (exitCode)
  1557. ⓪"END
  1558. ⓪ END MM2Make.
  1559. ⓪ ə
  1560. (* $FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$00009A3E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9E$FFEE2C9EÇ$000028C8T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00008F32$FFF0CEDA$00001D90$00001EB8$00001E70$00001E78$00001EB5$00008CF5$00008D61$00008CA8$000028C8$00009A3E$00008833$0000913B$00008F46$00008DB1¼Çé*)
  1561.