home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE MM2Make;
- ⓪ (*$Z+,R-*)
- ⓪
- ⓪ (*
- ⓪!to do:
- ⓪
- ⓪!- beim suchen nach codes auch den comp-pfad der shell-option-box berück-
- ⓪#sichtigen!
- ⓪
- ⓪!- option f. make & build, ob die output-pfade bestimmt werden sollen
- ⓪#oder nicht. außerdem fehlende output-pfade ggf. hervorheben
- ⓪
- ⓪!- compiler muß per option (z.b. $O <name>) output-path auswerten
- ⓪
- ⓪!- die vierfachen langen procs, wie z.b. GetSrcTimes, zusammenfassen
- ⓪ *)
- ⓪
- ⓪ (*----------------------------------------------------------------------------
- ⓪!* Make-Utility für Megamax Modula-2
- ⓪!*
- ⓪!* Liest eine Make-Datei (als Argument zu übergeben, ansonsten in der
- ⓪!* Shell einzustellen) ein, die alle Import-Abhängigkeiten eines
- ⓪!* Projekts beschreibt und compiliert anhand der Zeitangaben der
- ⓪!* Textdateien und der zugehörigen Codedateien alle veränderten
- ⓪!* Module neu.
- ⓪!*
- ⓪!* In der Argumentzeile kann auch "-B" für "Build" übergeben werden.
- ⓪!*
- ⓪!* Exitcodes:
- ⓪!* 0: Es sind Module zu compilieren
- ⓪!* 1: Alle Module sind bereits korrekt compiliert
- ⓪!* 2: Es sind Syntax-Fehler aufgetreten
- ⓪!* 3: Es sind allg. Fehler aufgetreten
- ⓪!*
- ⓪!* Das Format der Make-Datei:
- ⓪!* Am Anfang einer Zeile steht ein Modulname , dann entweder '-DEF',
- ⓪!* '-IMP' oder '-MOD'. Dann folgen der Codedateiname und, falls, vorhanden,
- ⓪!* der Quelldateiname. Ist der Quelltext vorhanden, folgt '-SOURCE' und
- ⓪!* der Name der Quelltextdatei. Gibt es zum Quelltext Includedateien, so
- ⓪!* werden diese nach -INC aufgezählt. Die Liste wird durch einen einzelnen
- ⓪!* Strichpunkt abgeschlossen. Werden andere Module importiert, müssen
- ⓪!* sie mit '-IMPORT' eingeleitet werden, dann folgen die importierten
- ⓪!* Modulnamen. Das Ende der Importnamen muß durch einen einzelnen Strich-
- ⓪!* punkt angegeben werden. Sind andere Dateien abhängig (z.B RSC-Dateien),
- ⓪!* sind sie mit -USES aufzuzählen (wie Importe und Include-Dateien).
- ⓪!* Die importierten Modulnamen müssen alle nochmal irgendwo in der Datei
- ⓪!* mit "<Modulname> -DEF <Codedateiname> -IMP <Codedateiname>" aufgeführt
- ⓪!* werden!
- ⓪!* Ein Implementationsmodul, das kein DEF zur Prüfung braucht (als
- ⓪!* Hauptmodul, beispielsweise Treiber, wie GEMIO), wird mit '-IMPMOD'
- ⓪!* eingeleitet.
- ⓪!* Wenn bei einem Dateinamen kein Pfad angegeben ist, wird auf den von
- ⓪!* Shell und Compiler benutzten Pfaden (siehe Modul 'ShellMsg') gesucht
- ⓪!* (bei Includes wird auf den Source-Pfaden, bei USES auf den StdPaths
- ⓪!* "DefaultPath" gesucht).
- ⓪!*
- ⓪!* Beispiel für eine Make-Datei:
- ⓪!*
- ⓪!* Test -MAIN
- ⓪!* -MOD D:\TEST.MOD
- ⓪!* -SOURCE D:\TEST.M
- ⓪!* -IMPORT InOut MyUtility;
- ⓪!* -USES D:\TEST.RSC
- ⓪!* MyUtility -IMP D:\CODES.IMP\MyUtil.IMP
- ⓪!* -SOURCE D:\MyUtil.I
- ⓪!* -INC D:\MyUtil.H ;
- ⓪!* -IMPORT TimeConvert
- ⓪!* Clock
- ⓪!* ;
- ⓪!* -DEF D:\CODES.DEF\MyUtil.DEF
- ⓪!* -SOURCE D:\MyUtil.D
- ⓪!* -IMPORT Clock ;
- ⓪!* TimeConvert -DEF TIMECONV.DEF (* IMP unnötig, wenn kein Source *)
- ⓪!* -NOSRC (* anzeigen, daß kein Source vorhand.*)
- ⓪!* Clock -DEF CLOCK.DEF
- ⓪!* -NOSRC
- ⓪!* -IMP CLOCK.IMP
- ⓪!* -NOSRC
- ⓪!* MyIO -IMPMOD MYIO.IMP (* benötigt kein -DEF *)
- ⓪!* -SOURCE MYIO.I
- ⓪!*
- ⓪!*----------------------------------------------------------------------------
- ⓪!* TT : Thomas Tempelmann
- ⓪!* CD : Christian Drießle
- ⓪!*----------------------------------------------------------------------------
- ⓪!* Datum Version Autor Bemerkung (Arbeitsbericht)
- ⓪!*----------------------------------------------------------------------------
- ⓪!* 02.03.88 1.0 TT Grundversion
- ⓪!* 03.03.89 CD Ermöglicht, daß zu einem Modul IMP und DEF erlaubt
- ⓪!* sind.
- ⓪!* 04.03.89 CD Rekursiven Modulbaum-durchsuch-algorithmus erprobt.
- ⓪!* 05.03.89 CD Alle Files in 5 Listen verteilt:
- ⓪!* - ModCodes
- ⓪!* - DefCodes
- ⓪!* - ImpCodes
- ⓪!* - Sources
- ⓪!* - withPath (Files mit ausdrücklich angegebenem
- ⓪!* Pfadnamen)
- ⓪!* Die Files dieser Listen werden Pfadweise nachein-
- ⓪!* einander gesucht und die Zeit eingelesen.
- ⓪!* 07.03.89 CD Neue Errungenschaften vom 5.3. getestet und
- ⓪!* korrigiert.
- ⓪!* Nachfrage bei fehlendem Code und vorhandenem
- ⓪!* Source.
- ⓪!* IMP mit Source aber ohne IMPORT geht jetzt auch
- ⓪!* am Ende der Makedatei.
- ⓪!* Rekursive Suche durch den Modulbaum implementiert
- ⓪!* mit markieren der zu übersetzenden Dateien.
- ⓪!* Suche auch im Defaultpfad nach allen Sorten von
- ⓪!* Dateien.
- ⓪!* 08.03.89 1.01 CD Include-Dateien können angegeben werden und sie
- ⓪!* werden berücksichtigt.
- ⓪!* Es wird eine Datei mit Include-Anweisungen für
- ⓪!* den Compiler erzeugt.
- ⓪!* 09.03.89 CD toMoment berichigt ( * $10000L), bei nicht ge
- ⓪!* gefundenem Code wird date und time auf 0 gesetzt.
- ⓪!* 08.08.89 TT lauffähige Version fertiggestellt
- ⓪!* 19.08.89 TT "-MAIN"-ID neu; bei Fehler wird TextName, TextLine
- ⓪!* und TextCol gesetzt; bei Erfolg wird CodeName
- ⓪!* nach -MAIN gesetzt; MakeFileName importiert
- ⓪!* 19.08.89 TT TemporaryPath statt M2Home verwendet
- ⓪!* 20.09.89 TT Nur erster MAIN-Name wird nach CodeName übernommen.
- ⓪!* 09.01.90 TT Test-Funktion showIdents zeigt bei Importen deren
- ⓪!* Modul- statt Code-Namen an
- ⓪!* 18.01.90 1.2 TT Wenn Pfad angegeben, wird trotzdem auch auf den
- ⓪!* anderen Such-Pfaden gesucht
- ⓪!* 04.03.90 TT Durch '-NOSRC' wird keine Sourceangabe mehr
- ⓪!* verlangt, wenn nur Code angegeben werden soll.
- ⓪!* 11.03.90 1.3 TT Meckert bei -NOSRC nicht mehr über falsches Datum.
- ⓪!* Noch zu tun: Bei IMP meckert er u.U. (wenn DEF
- ⓪!* neu ist) über Datum, außerdem wird bei Nichtangabe
- ⓪!* des IMP dann nicht erkannt, daß Clients neu
- ⓪!* compiliert werden müssen.
- ⓪!* 08.05.90 TT 'ignoreSource'-Abfrage in 'chkDate' entfernt.
- ⓪!* 20.07.90 TT "-B" für Build eingebaut
- ⓪!* 23.07.90 TT Vielleicht werden fehlende Sources nun korrekt
- ⓪!* bemängelt.
- ⓪!* 18.08.90 TT Noch ein paar ReplaceHome-Aufrufe eingefügt.
- ⓪!* 10.11.90 TT $R-, $Z+
- ⓪!* 28.11.90 TT Syntax-Fehler besser erkannt und ausführlichere
- ⓪!* Fehlermeldung; Nun wird entw. -SOURCE oder -NOSRC
- ⓪!* verlangt. Bei "NOSRC" und fehlendem Code wird nun
- ⓪!* der Fehler korrekt gemeldet.
- ⓪!* 19.02.91 1.4 TT In Outfile steht nun jew. einer der Clienten, der
- ⓪!* die Übersetzung erzwingt.
- ⓪!* 15.03.91 TT "-BI" für BuildImp (nur Implementations) eingebaut
- ⓪!* 25.04.91 TT Reason bei Includes/Uses wird korrekt angegeben.
- ⓪!*----------------------------------------------------------------------------
- ⓪!*)
- ⓪
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR;
- ⓪
- ⓪ FROM ArgCV IMPORT InitArgCV, PtrArgStr;
- ⓪
- ⓪ FROM InOut IMPORT
- ⓪(FlushKbd, GotoXY, WriteLn, WriteString, Write, Read, ReadString,
- ⓪(WriteInt, WriteCard, BusyRead, KeyPressed;
- ⓪
- ⓪ FROM Directory IMPORT
- ⓪(GetDirEntry, DirQuery, DirEntry;
- ⓪
- ⓪ FROM FileNames IMPORT
- ⓪(ValidatePath, ConcatPath, SplitPath;
- ⓪
- ⓪ FROM MOSGlobals IMPORT FileStr;
- ⓪
- ⓪ FROM Clock IMPORT
- ⓪(CurrentDate, CurrentTime, PackDate, PackTime,
- ⓪(UnpackDate, UnpackTime, Date, Time;
- ⓪
- ⓪ FROM TimeConvert IMPORT
- ⓪(TimeToText, DateToText;
- ⓪
- ⓪ FROM Files IMPORT
- ⓪(File, Access, Open, State, GetStateMsg, ResetState, Close, EOF,
- ⓪(SetDateTime, GetDateTime, Create, ReplaceMode, Remove;
- ⓪
- ⓪ IMPORT Text;
- ⓪
- ⓪ FROM PathEnv IMPORT
- ⓪(HomePath, ReplaceHome, HomeReplaced;
- ⓪ FROM Paths IMPORT
- ⓪(SearchFile, ListPos;
- ⓪ FROM PathCtrl IMPORT
- ⓪(PathList, PathEntry;
- ⓪
- ⓪ FROM ShellMsg IMPORT
- ⓪(CodeName, TextName, TextLine, TextCol, ModuleName, ErrorMsg, Active,
- ⓪(ShellPath, MakeFileName, ModPaths, DefPaths, ImpPaths, SrcPaths,
- ⓪(TemporaryPath;
- ⓪
- ⓪ FROM Lists IMPORT
- ⓪(List, LCarrier, CreateList, AppendEntry, InsertEntry, NextEntry,
- ⓪(ScanEntries, LDir, LCondProc, ResetList, RemoveEntry, ListEmpty;
- ⓪
- ⓪ IMPORT Storage;
- ⓪
- ⓪ FROM Storage IMPORT
- ⓪(DEALLOCATE;
- ⓪
- ⓪ FROM PrgCtrl IMPORT
- ⓪(TermProcess;
- ⓪
- ⓪ FROM Strings IMPORT
- ⓪(Empty, StrEqual, Upper, Insert, Copy, Length, Pos, PosLen, String,
- ⓪(Split, EatSpaces, Assign, Concat, Append, Delete;
- ⓪
- ⓪ IMPORT FastStrings, FuncStrings;
- ⓪
- ⓪ TYPE
- ⓪(CharSet = SET OF CHAR;
- ⓪
- ⓪ CONST
- ⓪(titl1 = ' MM2Make V1.4 für Megamax Modula-2';
- ⓪(titl2 = ' Erstellt 3/1989 von Thomas Tempelmann & Christian Drießle';
- ⓪(noMem = 'Zu wenig Speicher!';
- ⓪(noFile= 'Make-Datei ist leer!';
- ⓪(readng= 'Lese ';
- ⓪(scanin= 'Prüfe Dateien';
- ⓪(datErr= ' hat ungültiges Datum!';
- ⓪(toComp= 'Der Compiler wartet schon...';
- ⓪(noComp= 'Alles OK';
- ⓪(filErr= 'Dateifehler: ';
- ⓪(dblid = 'Modul ist doppelt deklariert!';
- ⓪(notDef= ' wurde nicht oder unvollständig deklariert!';
- ⓪(opnErr= 'Datei(en) nicht gefunden!';
- ⓪(noCom = 'Ausgabedatei konnte nicht angelegt werden! (Stimmt "Temp.Pfad"?)';
- ⓪(synErr= 'Syntaxfehler: ';
- ⓪(nameExp='Modulname erwartet.';
- ⓪(fileExp='Dateiname erwartet.';
- ⓪(typeExp='Modulkennung (DEF/IMP/MOD) erwartet.';
- ⓪(srcExp ='Source-Kennung (SOURCE/NOSRC) erwartet.';
- ⓪(srcnExp='Quelltextname erwartet.';
- ⓪(remErr= 'Remove in Liste haut nicht hin!';
- ⓪(eoprg = 'Programmende. Taste drücken...';
- ⓪(NoCodeMsg = 'No Code';
- ⓪(SelfMsg = 'Modified';
- ⓪
- ⓪(maybe = CharSet {'j', 'J', 'n', 'N'};
- ⓪(no = CharSet {'n', 'N'};
- ⓪(
- ⓪(compFileName = 'MAKE.M2C'; (* temp.File f. Compiler, nach ShellMsg *)
- ⓪
- ⓪ TYPE
- ⓪(FileType= (def, imp, mod, src, inc, uses);
- ⓪(ModType = [def..mod];
- ⓪
- ⓪(ImpList = POINTER TO ImpDesc;
- ⓪(IncList = POINTER TO IncDesc;
- ⓪(PtrMod = POINTER TO ModDesc;
- ⓪(
- ⓪(ImpDesc = RECORD
- ⓪4next: ImpList;
- ⓪4modPtr : PtrMod
- ⓪2END;
- ⓪(
- ⓪(IncDesc = RECORD
- ⓪4fullname: ARRAY [0..80] OF CHAR;
- ⓪4date, time : CARDINAL;
- ⓪4next : IncList;
- ⓪2END;
- ⓪
- ⓪(ModDesc = RECORD
- ⓪4name: String;
- ⓪4type: ModType;
- ⓪4codeName: String;
- ⓪4date, time: CARDINAL;
- ⓪4checked: BOOLEAN;
- ⓪4ignore: BOOLEAN;
- ⓪4CASE withSource: BOOLEAN OF
- ⓪6TRUE: sourceName: String;
- ⓪<sdate, stime: CARDINAL;
- ⓪<uses, include : IncList;
- ⓪<import: ImpList;
- ⓪4| FALSE: ignoreSource: BOOLEAN;
- ⓪4END
- ⓪2END;
- ⓪
- ⓪(moment = LONGCARD;
- ⓪
- ⓪
- ⓪ VAR
- ⓪(build, buildImp, waitAtEnd, ok, error: BOOLEAN;
- ⓪(exitCode: INTEGER;
- ⓪(f, compfile : File;
- ⓪(modlist: List; (* OF ModDesc *)
- ⓪
- ⓪ (*!TT*)
- ⓪ PROCEDURE term3 (REF s: ARRAY OF CHAR);
- ⓪"VAR c:CHAR;
- ⓪"BEGIN
- ⓪$WriteLn;
- ⓪$WriteString (s);
- ⓪$WriteLn;
- ⓪$WriteLn;
- ⓪$WriteString (eoprg);
- ⓪$FlushKbd;
- ⓪$Read (c);
- ⓪$ResetState (f);
- ⓪$Close (f);
- ⓪$TermProcess (3)
- ⓪"END term3;
- ⓪
- ⓪ (*!TT*)
- ⓪ PROCEDURE termNoMem;
- ⓪"BEGIN
- ⓪$term3 (noMem);
- ⓪"END termNoMem;
- ⓪
- ⓪ PROCEDURE term (s: ARRAY OF CHAR);
- ⓪"VAR c:CHAR;
- ⓪"BEGIN
- ⓪$(*!TT*)
- ⓪$IF Active THEN
- ⓪&FastStrings.Assign (s, ErrorMsg);
- ⓪$ELSE
- ⓪&WriteLn;
- ⓪&WriteString (s);
- ⓪&WriteLn;
- ⓪&WriteLn;
- ⓪&WriteString (eoprg);
- ⓪&FlushKbd;
- ⓪&Read (c);
- ⓪$END;
- ⓪$ResetState (f);
- ⓪$Close (f);
- ⓪$TermProcess (2)
- ⓪"END term;
- ⓪
- ⓪
- ⓪ PROCEDURE ALLOCATE (VAR p:ADDRESS; l:LONGCARD);
- ⓪"BEGIN
- ⓪$Storage.ALLOCATE (p,l);
- ⓪$IF p=NIL THEN termNoMem END
- ⓪"END ALLOCATE;
- ⓪
- ⓪ (*$Z-*)
- ⓪ PROCEDURE chkavail (d1, d2: ADDRESS): BOOLEAN;
- ⓪ (*$Z=*)
- ⓪"VAR actmod: PtrMod; chkmod: POINTER TO PtrMod; eq: BOOLEAN;
- ⓪"(*$L-*)
- ⓪"BEGIN
- ⓪$(*
- ⓪&actmod:= d1;
- ⓪&chkmod:= d2;
- ⓪&eq:= (actmod^.type = chkmod^^.type)
- ⓪)& StrEqual (actmod^.name, chkmod^^.name);
- ⓪&IF eq THEN chkmod^:= actmod END;
- ⓪&RETURN eq
- ⓪$*)
- ⓪$ASSEMBLER
- ⓪(MOVE.L -(A3),A2 ; d2
- ⓪(MOVE.L A2,-(A7)
- ⓪(MOVE.L (A2),A2 ; A2: chkmod
- ⓪(MOVE.L -(A3),A1 ; A1: actmod
- ⓪(MOVE.W ModDesc.type(A1),D0
- ⓪(CMP.W ModDesc.type(A2),D0
- ⓪(BNE neq
- ⓪(MOVE.B ModDesc.name(A1),D0
- ⓪(CMP.B ModDesc.name(A2),D0
- ⓪(BNE neq
- ⓪(LEA ModDesc.name(A1),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE #79,(A3)+
- ⓪(LEA ModDesc.name(A2),A0
- ⓪(MOVE.L A0,(A3)+
- ⓪(MOVE #79,(A3)+
- ⓪(MOVE.L A1,-(A7)
- ⓪(JSR StrEqual
- ⓪(MOVE.L (A7)+,A1
- ⓪(TST -(A3)
- ⓪(BEQ neq
- ⓪(MOVE.L (A7)+,A2
- ⓪(MOVE.L A1,(A2)
- ⓪(MOVE #1,(A3)+
- ⓪(RTS
- ⓪&neq
- ⓪(ADDQ.L #4,A7
- ⓪(CLR (A3)+
- ⓪$END
- ⓪"END chkavail;
- ⓪"(*$L=*)
- ⓪
- ⓪ PROCEDURE avail (VAR s: ARRAY OF CHAR; t: ModType; VAR modp: PtrMod): BOOLEAN;
- ⓪"VAR mod: ModDesc; found: BOOLEAN;
- ⓪"BEGIN
- ⓪$Assign (s, mod.name, ok);
- ⓪$mod.type:= t;
- ⓪$modp:= ADR (mod);
- ⓪$ResetList (modlist);
- ⓪$ScanEntries (modlist, forward, chkavail, ADR (modp), found);
- ⓪$RETURN found
- ⓪"END avail;
- ⓪
- ⓪ PROCEDURE newMod (VAR s: ARRAY OF CHAR; t: ModType; VAR actmod: PtrMod);
- ⓪"BEGIN
- ⓪$NEW (actmod);
- ⓪$AppendEntry (modlist, actmod, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$WITH actmod^ DO
- ⓪&Assign (s, name, ok);
- ⓪&type:= t;
- ⓪&codeName:= '';
- ⓪&checked:= FALSE;
- ⓪&ignore:= FALSE;
- ⓪&withSource:= FALSE;
- ⓪$END
- ⓪"END newMod;
- ⓪
- ⓪
- ⓪ PROCEDURE readIdents (makename: ARRAY OF CHAR);
- ⓪
- ⓪"VAR
- ⓪(path: PathList;
- ⓪(fname: FileStr;
- ⓪(id: String;
- ⓪(line: ARRAY [0..256] OF CHAR;
- ⓪(lineLen: CARDINAL;
- ⓪(actmod: PtrMod;
- ⓪
- ⓪"PROCEDURE syntaxError(REF s: ARRAY OF CHAR);
- ⓪$BEGIN
- ⓪&WriteLn;
- ⓪&WriteString (line);
- ⓪&WriteLn;
- ⓪&WriteString ('id: <');
- ⓪&WriteString (id);
- ⓪&Write ('>');
- ⓪&WriteLn;
- ⓪&DEC (TextCol, Length (id));
- ⓪&term (FuncStrings.ConcStr (synErr, s))
- ⓪$END syntaxError;
- ⓪
- ⓪"PROCEDURE checkState;
- ⓪$VAR s: String;
- ⓪$BEGIN
- ⓪&IF State (f) < 0 THEN
- ⓪(GetStateMsg (State (f), s);
- ⓪(Insert (filErr, 0, s, ok);
- ⓪(term3 (s)
- ⓪&END
- ⓪$END checkState;
- ⓪"
- ⓪"PROCEDURE getIdent (VAR s: ARRAY OF CHAR): BOOLEAN;
- ⓪$(* Liefert in 's' das nächste Wort aus der Datei 'f'. *)
- ⓪$VAR p: CARDINAL;
- ⓪$
- ⓪$BEGIN
- ⓪&LOOP
- ⓪(IF TextCol >= lineLen THEN
- ⓪*IF EOF (f) THEN
- ⓪,s[0]:= 0C;
- ⓪,RETURN FALSE
- ⓪*END;
- ⓪*INC (TextLine);
- ⓪*Text.ReadString (f, line);
- ⓪*TextCol:= 0;
- ⓪*IF line [0] = '*' THEN (* Kommentar *)
- ⓪,line:= ''
- ⓪*END;
- ⓪*lineLen:= FastStrings.Length (line);
- ⓪(END;
- ⓪(ASSEMBLER
- ⓪0; WHILE char (line, TextCol) = ' ' DO INC (TextCol) END;
- ⓪0MOVE.L (A6),A0
- ⓪0MOVE.W TextCol,D0
- ⓪0MOVE.W lineLen(A0),D1
- ⓪0LEA line(A0),A1
- ⓪0MOVE.W D1,D2
- ⓪.again
- ⓪0CMP.W D1,D0
- ⓪0BCC ende
- ⓪0CMPI.B #' ',0(A1,D0.W)
- ⓪0BNE cont
- ⓪0ADDQ.W #1,D0
- ⓪0BRA again
- ⓪.cont
- ⓪0MOVE D0,-(A7)
- ⓪0ADDQ.W #1,D0
- ⓪.aga2
- ⓪0CMP.W D1,D0
- ⓪0BCC end2
- ⓪0CMPI.B #' ',0(A1,D0.W)
- ⓪0BEQ end3
- ⓪0ADDQ.W #1,D0
- ⓪0BRA aga2
- ⓪.end3
- ⓪0MOVE D0,D2
- ⓪.end2
- ⓪0MOVE (A7)+,D0
- ⓪.ende
- ⓪0MOVE.W D0,TextCol
- ⓪0SUB.W D0,D2
- ⓪0MOVE.W D2,p(A6)
- ⓪(END;
- ⓪(IF p>0 THEN
- ⓪*FastStrings.Copy (line, TextCol, p, s);
- ⓪*INC (TextCol, p);
- ⓪*RETURN TRUE
- ⓪(END;
- ⓪&END (* LOOP *)
- ⓪$END getIdent;
- ⓪
- ⓪"PROCEDURE newUse (name : ARRAY OF CHAR);
- ⓪$VAR inclink : IncList; err : BOOLEAN;
- ⓪$BEGIN
- ⓪&NEW (inclink);
- ⓪&IF inclink = NIL THEN termNoMem END;
- ⓪&inclink^.next := actmod^.uses;
- ⓪&actmod^.uses := inclink;
- ⓪&Assign (name, inclink^.fullname, err);
- ⓪$END newUse;
- ⓪
- ⓪"PROCEDURE newInc (name : ARRAY OF CHAR);
- ⓪$VAR inclink : IncList; err : BOOLEAN;
- ⓪$BEGIN
- ⓪&NEW (inclink);
- ⓪&IF inclink = NIL THEN termNoMem END;
- ⓪&inclink^.next := actmod^.include;
- ⓪&actmod^.include := inclink;
- ⓪&Assign (name, inclink^.fullname, err);
- ⓪$END newInc;
- ⓪
- ⓪"PROCEDURE newImport (VAR name: ARRAY OF CHAR);
- ⓪$VAR implink: ImpList; impmod: PtrMod;
- ⓪$BEGIN
- ⓪&IF ~avail (name, def, impmod) THEN
- ⓪(newMod (name, def, impmod);
- ⓪&END;
- ⓪&NEW (implink);
- ⓪&implink^.next:= actmod^.import;
- ⓪&implink^.modPtr := impmod;
- ⓪&actmod^.import:= implink
- ⓪$END newImport;
- ⓪
- ⓪"VAR actname, dummy: String;
- ⓪(n: INTEGER;
- ⓪(empty, firstMain, mainMod, mainImp, ignore: BOOLEAN;
- ⓪(idNOSOURCE, idMAIN, idMOD, idDEF, idIMPMOD, idIMP,
- ⓪(idNONE, idSOURCE, idINC, idUSES, idIMPORT: String;
- ⓪(acttype: ModType;
- ⓪(state: (ModOrType, waitModName, waitType, waitCodeName, waitSource,
- ⓪0waitSourceName, waitInc, waitUseName, waitIncName, waitImport,
- ⓪0waitImportName);
- ⓪
- ⓪"BEGIN (* readIdents *)
- ⓪$SearchFile (makename, (*!TT*)SrcPaths, fromStart, ok, fname);
- ⓪$Open (f, fname, readSeqTxt);
- ⓪$checkState;
- ⓪$TextLine:= 0;
- ⓪$FastStrings.Assign (fname, TextName);
- ⓪
- ⓪$WriteLn;
- ⓪$WriteString(readng);
- ⓪$WriteString (fname);
- ⓪
- ⓪$idMOD:= '-MOD';
- ⓪$idDEF:= '-DEF';
- ⓪$idIMP:= '-IMP';
- ⓪$idIMPMOD:= '-IMPMOD';
- ⓪$idNONE:= '-IGNORE';
- ⓪$idMAIN:= '-MAIN';
- ⓪$idSOURCE:= '-SOURCE';
- ⓪$idNOSOURCE:= '-NOSRC';
- ⓪$idINC := '-INC';
- ⓪$idUSES:= '-USES';
- ⓪$idIMPORT:= '-IMPORT';
- ⓪$
- ⓪$TextCol:= 0; lineLen:= 0; line:= '';
- ⓪$state:= waitModName;
- ⓪$mainImp:= FALSE;
- ⓪$firstMain:= TRUE;
- ⓪$empty:= TRUE;
- ⓪$(*$D-*)
- ⓪$WHILE getIdent (id) DO
- ⓪&empty:= FALSE;
- ⓪&LOOP
- ⓪(CASE state OF
- ⓪*ModOrType:
- ⓪,IF id [0] = '-' THEN
- ⓪.state := waitType
- ⓪,ELSE
- ⓪.state := waitModName
- ⓪,END |
- ⓪*waitModName:
- ⓪,IF id [0] = '-' THEN syntaxError (nameExp) END;
- ⓪,mainMod:= FALSE;
- ⓪,actname:= id; state:= waitType; EXIT |
- ⓪*waitType:
- ⓪,Upper (id);
- ⓪,ignore:= FALSE;
- ⓪,mainImp:= FALSE;
- ⓪,IF StrEqual (id, idDEF) THEN
- ⓪.acttype:= def;
- ⓪,ELSIF StrEqual (id, idIMP) THEN
- ⓪.acttype:= imp;
- ⓪,ELSIF StrEqual (id, idMOD) THEN
- ⓪.acttype:= mod
- ⓪,ELSIF StrEqual (id, idIMPMOD) THEN
- ⓪.acttype:= imp;
- ⓪.mainImp:= TRUE
- ⓪,ELSIF StrEqual (id, idNONE) THEN
- ⓪.acttype:= def;
- ⓪.ignore:= TRUE
- ⓪,ELSIF StrEqual (id, idMAIN) THEN
- ⓪.mainMod:= TRUE;
- ⓪.state:= ModOrType;
- ⓪.EXIT
- ⓪,ELSE
- ⓪.syntaxError (typeExp)
- ⓪,END;
- ⓪,IF avail (actname, acttype, actmod) THEN
- ⓪.IF ~Empty (actmod^.codeName) THEN
- ⓪0WriteLn;
- ⓪0WriteString (actname);
- ⓪0term (dblid)
- ⓪.ELSIF ignore THEN
- ⓪0actmod^.ignore:= TRUE
- ⓪.END
- ⓪,ELSE
- ⓪.newMod (actname, acttype, actmod);
- ⓪,END;
- ⓪,IF ignore THEN
- ⓪.state:= waitModName
- ⓪,ELSE
- ⓪.state:= waitCodeName
- ⓪,END;
- ⓪,EXIT |
- ⓪*waitCodeName:
- ⓪,IF id [0] = '-' THEN syntaxError (fileExp) END;
- ⓪,ReplaceHome (id);
- ⓪,actmod^.codeName:= id;
- ⓪,IF mainMod & firstMain THEN
- ⓪.firstMain:= FALSE;
- ⓪.FastStrings.Assign (actmod^.name, ModuleName);
- ⓪.FastStrings.Assign (actmod^.codeName, CodeName);
- ⓪,END;
- ⓪,state:= waitSource; EXIT |
- ⓪*waitSource:
- ⓪,IF StrEqual (id, idSOURCE) THEN
- ⓪.actmod^.withSource:= TRUE; state:= waitSourceName; EXIT
- ⓪,ELSIF StrEqual (id, idNOSOURCE) THEN
- ⓪.actmod^.ignoreSource:= TRUE;
- ⓪.IF acttype = mod THEN
- ⓪0state:= waitModName
- ⓪.ELSE
- ⓪0state := ModOrType
- ⓪.END;
- ⓪.EXIT
- ⓪,ELSE
- ⓪.syntaxError (srcExp);
- ⓪,END |
- ⓪*waitSourceName:
- ⓪,IF id [0] = '-' THEN syntaxError (srcnExp) END;
- ⓪,ReplaceHome (id);
- ⓪,actmod^.sourceName:= id;
- ⓪,actmod^.include:= NIL;
- ⓪,actmod^.uses:= NIL;
- ⓪,actmod^.import:= NIL;
- ⓪,IF NOT mainImp & (actmod^.type = imp) THEN
- ⓪.(* eigenes Def-Modul importieren *)
- ⓪.newImport (actname)
- ⓪,END;
- ⓪,state:= waitInc;
- ⓪,EXIT |
- ⓪*waitInc:
- ⓪,IF StrEqual (id, idINC) THEN
- ⓪.state:= waitIncName; EXIT
- ⓪,ELSIF StrEqual (id, idUSES) THEN
- ⓪.state:= waitUseName; EXIT
- ⓪,ELSE
- ⓪.state:= waitImport
- ⓪,END; |
- ⓪*waitIncName, waitUseName:
- ⓪,IF id [0] = '-' THEN syntaxError (fileExp) END;
- ⓪,n:= Pos (';', id, 0);
- ⓪,IF n>=0 THEN (* Ende der Includes *)
- ⓪.state := waitImport;
- ⓪.IF n=0 THEN EXIT END;
- ⓪.Copy (id, 0, n, id, ok)
- ⓪,END;
- ⓪,ReplaceHome (id);
- ⓪,IF state = waitIncName THEN
- ⓪.newInc (id)
- ⓪,ELSE
- ⓪.newUse (id)
- ⓪,END;
- ⓪,EXIT |
- ⓪*waitImport:
- ⓪,IF StrEqual (id, idIMPORT) THEN
- ⓪.state:= waitImportName; EXIT
- ⓪,ELSE
- ⓪.IF acttype = mod THEN state:= waitModName
- ⓪.ELSE state := ModOrType END;
- ⓪,END |
- ⓪*waitImportName:
- ⓪,IF id [0] = '-' THEN syntaxError (nameExp) END;
- ⓪,n:= Pos (';', id, 0);
- ⓪,IF n>=0 THEN (* Ende der Importe *)
- ⓪.IF acttype = mod THEN state:= waitModName
- ⓪.ELSE state := ModOrType END;
- ⓪.IF n=0 THEN EXIT END;
- ⓪.Copy (id, 0, n, id, ok)
- ⓪,END;
- ⓪,newImport (id);
- ⓪,EXIT |
- ⓪(END (* CASE state OF *)
- ⓪&END (* LOOP *)
- ⓪$END; (* WHILE getIdent (id) *)
- ⓪$(*$D-*)
- ⓪$Close (f);
- ⓪$IF empty THEN
- ⓪&term3 (noFile)
- ⓪$END
- ⓪"END readIdents;
- ⓪
- ⓪ PROCEDURE verifyIdents (): BOOLEAN;
- ⓪"VAR modPtr: PtrMod;
- ⓪"BEGIN
- ⓪$ResetList (modlist);
- ⓪$LOOP
- ⓪&modPtr:= NextEntry (modlist);
- ⓪&IF modPtr = NIL THEN EXIT END;
- ⓪&IF ~modPtr^.ignore & Empty (modPtr^.codeName) THEN
- ⓪(WriteLn;
- ⓪(WriteString (modPtr^.name);
- ⓪(WriteString (notDef);
- ⓪(waitAtEnd:= TRUE;
- ⓪&END
- ⓪$END;
- ⓪$RETURN ~waitAtEnd
- ⓪"END verifyIdents;
- ⓪
- ⓪
- ⓪ PROCEDURE getFileDateTime (REF name: ARRAY OF CHAR;
- ⓪;VAR date, time: CARDINAL): BOOLEAN;
- ⓪"VAR f: File; entry: DirEntry; res: INTEGER;
- ⓪"BEGIN
- ⓪$GetDirEntry (name, entry, res);
- ⓪$IF res >= 0 THEN
- ⓪&date:= PackDate (entry.date);
- ⓪&time:= PackTime (entry.time);
- ⓪$END;
- ⓪$RETURN res >= 0
- ⓪"END getFileDateTime;
- ⓪
- ⓪
- ⓪ PROCEDURE getTime (): BOOLEAN;
- ⓪
- ⓪ TYPE
- ⓪"FileEntry = RECORD
- ⓪0name : ARRAY [0..12] OF CHAR;
- ⓪0modPtr : PtrMod;
- ⓪.END;
- ⓪"PtrFile = POINTER TO FileEntry;
- ⓪"FullEntry = RECORD
- ⓪0fullname : ARRAY [0..80] OF CHAR;
- ⓪0modPtr : ADDRESS;
- ⓪0typ : FileType;
- ⓪.END;
- ⓪"PtrFullEntry = POINTER TO FullEntry;
- ⓪"
- ⓪ VAR
- ⓪"pmod: PtrMod;
- ⓪"err: BOOLEAN;
- ⓪"ModCodes : List; (* OF FileEntry *)
- ⓪"DefCodes : List; (* OF FileEntry *)
- ⓪"ImpCodes : List; (* OF FileEntry *)
- ⓪"Sources : List; (* OF FileEntry *)
- ⓪"Defaults : List; (* OF FileEntry *)
- ⓪"withPath : List; (* OF FullEntry *)
- ⓪
- ⓪
- ⓪"PROCEDURE insCode (REF name : ARRAY OF CHAR; type : ModType; pmod : PtrMod);
- ⓪"VAR
- ⓪$merr : BOOLEAN;
- ⓪$Fentry : PtrFile;
- ⓪$FullE : PtrFullEntry;
- ⓪$path : ARRAY [0..127] OF CHAR;
- ⓪$fname: ARRAY [0..12] OF CHAR;
- ⓪"BEGIN
- ⓪$SplitPath (name, path, fname);
- ⓪$IF path[0] = 0C THEN
- ⓪&NEW (Fentry);
- ⓪&IF Fentry=NIL THEN termNoMem END;
- ⓪&IF type = mod THEN
- ⓪(AppendEntry (ModCodes, Fentry, merr);
- ⓪&ELSIF type = def THEN
- ⓪(AppendEntry (DefCodes, Fentry, merr);
- ⓪&ELSIF type = imp THEN
- ⓪(AppendEntry (ImpCodes, Fentry, merr);
- ⓪&END;
- ⓪&IF merr THEN termNoMem END;
- ⓪&Assign (name, Fentry^.name, merr);
- ⓪&Fentry^.modPtr := pmod;
- ⓪$ELSE
- ⓪&NEW (FullE);
- ⓪&IF FullE = NIL THEN termNoMem END;
- ⓪&AppendEntry (withPath, FullE, merr);
- ⓪&IF merr THEN termNoMem END;
- ⓪&Assign (name, FullE^.fullname, merr);
- ⓪&FullE^.modPtr := pmod;
- ⓪&FullE^.typ := type;
- ⓪$END;
- ⓪"END insCode;
- ⓪"
- ⓪"PROCEDURE insSource (REF name : ARRAY OF CHAR; type : ModType; pmod : PtrMod);
- ⓪"VAR
- ⓪$merr : BOOLEAN;
- ⓪$Fentry : PtrFile;
- ⓪$FullE : PtrFullEntry;
- ⓪$path : ARRAY [0..80] OF CHAR;
- ⓪$fname: ARRAY [0..12] OF CHAR;
- ⓪$actinc : IncList;
- ⓪"BEGIN
- ⓪$SplitPath (name, path, fname);
- ⓪$IF path[0]=0C THEN
- ⓪&NEW (Fentry);
- ⓪&IF Fentry = NIL THEN termNoMem END;
- ⓪&AppendEntry (Sources, Fentry, merr);
- ⓪&IF merr THEN termNoMem END;
- ⓪&Assign (name, Fentry^.name, merr);
- ⓪&Fentry^.modPtr := pmod;
- ⓪$ELSE
- ⓪&NEW (FullE);
- ⓪&IF FullE = NIL THEN termNoMem END;
- ⓪&AppendEntry (withPath, FullE, merr);
- ⓪&IF merr THEN termNoMem END;
- ⓪&Assign (name, FullE^.fullname, merr);
- ⓪&FullE^.modPtr := pmod;
- ⓪&FullE^.typ := src;
- ⓪$END;
- ⓪$(*!!! INC sollten, wenn kein Pfad angegeben, in 'Sources' eingetragen werden *)
- ⓪$actinc := pmod^.include;
- ⓪$WHILE (actinc <> NIL) DO
- ⓪&NEW (FullE);
- ⓪&AppendEntry (withPath, FullE, merr);
- ⓪&IF merr THEN termNoMem END;
- ⓪&Assign (actinc^.fullname, FullE^.fullname, merr);
- ⓪&FullE^.modPtr := actinc;
- ⓪&FullE^.typ := inc;
- ⓪&actinc := actinc^.next;
- ⓪$END;
- ⓪$(*!!! USES sollten, wenn kein Pfad angegeben, in 'Defaults' eingetragen werden *)
- ⓪$actinc := pmod^.uses;
- ⓪$WHILE (actinc <> NIL) DO
- ⓪&NEW (FullE);
- ⓪&AppendEntry (withPath, FullE, merr);
- ⓪&IF merr THEN termNoMem END;
- ⓪&Assign (actinc^.fullname, FullE^.fullname, merr);
- ⓪&FullE^.modPtr := actinc;
- ⓪&FullE^.typ := uses;
- ⓪&actinc := actinc^.next;
- ⓪$END;
- ⓪"END insSource;
- ⓪
- ⓪"PROCEDURE markToCompile (modPtr: PtrMod; name: ARRAY OF CHAR);
- ⓪$BEGIN
- ⓪&WITH modPtr^ DO
- ⓪(date := 0;
- ⓪(time := 0;
- ⓪&END; (* WITH *)
- ⓪$END markToCompile;
- ⓪
- ⓪
- ⓪"PROCEDURE getModTimes();
- ⓪"VAR
- ⓪$PathPtr : PathEntry;
- ⓪$FilePtr : PtrFile;
- ⓪$path, cn : String;
- ⓪$c: CHAR;
- ⓪$ok, rerr : BOOLEAN;
- ⓪"BEGIN
- ⓪$ResetList(ModPaths);
- ⓪$LOOP
- ⓪&PathPtr := NextEntry(ModPaths);
- ⓪&IF PathPtr = NIL THEN EXIT END;
- ⓪&Assign (PathPtr^,path,ok);
- ⓪&ValidatePath (path);
- ⓪&ReplaceHome (path);
- ⓪&ResetList(ModCodes);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry (ModCodes);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(Concat (path, FilePtr^.name, cn, ok);
- ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN
- ⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);
- ⓪*RemoveEntry(ModCodes, rerr);
- ⓪*IF rerr THEN term3 (remErr) END;
- ⓪(END;
- ⓪&END; (* FileLoop *)
- ⓪&IF ListEmpty (ModCodes) THEN EXIT END;
- ⓪$END; (* PathLoop *)
- ⓪$IF ~ListEmpty(ModCodes) THEN
- ⓪&ResetList(ModCodes);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry(ModCodes);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(IF FilePtr^.modPtr^.withSource THEN
- ⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);
- ⓪(ELSE
- ⓪*WriteLn;
- ⓪*WriteString (FilePtr^.name);
- ⓪*waitAtEnd:= TRUE
- ⓪(END;
- ⓪&END; (* LOOP *)
- ⓪$END; (* IF ~ListEmpty *)
- ⓪"END getModTimes;
- ⓪"
- ⓪"PROCEDURE getDefTimes();
- ⓪"VAR
- ⓪$PathPtr : PathEntry;
- ⓪$FilePtr : PtrFile;
- ⓪$path, cn : String;
- ⓪$c: CHAR;
- ⓪$ok, rerr : BOOLEAN;
- ⓪"BEGIN
- ⓪$ResetList(DefPaths);
- ⓪$LOOP
- ⓪&PathPtr := NextEntry(DefPaths);
- ⓪&IF PathPtr = NIL THEN EXIT END;
- ⓪&Assign (PathPtr^,path,ok);
- ⓪&ValidatePath (path);
- ⓪&ReplaceHome (path);
- ⓪&ResetList(DefCodes);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry (DefCodes);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(Concat (path, FilePtr^.name, cn, ok);
- ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN
- ⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);
- ⓪*RemoveEntry(DefCodes, rerr);
- ⓪*IF rerr THEN term3 (remErr) END;
- ⓪(END;
- ⓪&END; (* FileLoop *)
- ⓪&IF ListEmpty (DefCodes) THEN EXIT END;
- ⓪$END; (* PathLoop *)
- ⓪$IF ~ListEmpty(DefCodes) THEN
- ⓪&ResetList(DefCodes);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry(DefCodes);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(IF FilePtr^.modPtr^.withSource THEN
- ⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);
- ⓪(ELSE
- ⓪*WriteLn;
- ⓪*WriteString (FilePtr^.name);
- ⓪*waitAtEnd:= TRUE
- ⓪(END;
- ⓪&END; (* LOOP *)
- ⓪$END; (* IF ~ListEmpty *)
- ⓪"END getDefTimes;
- ⓪"
- ⓪"PROCEDURE getImpTimes();
- ⓪"VAR
- ⓪$PathPtr : PathEntry;
- ⓪$FilePtr : PtrFile;
- ⓪$path, cn : String;
- ⓪$c: CHAR;
- ⓪$ok, rerr : BOOLEAN;
- ⓪"BEGIN
- ⓪$ResetList(ImpPaths);
- ⓪$LOOP
- ⓪&PathPtr := NextEntry(ImpPaths);
- ⓪&IF PathPtr = NIL THEN EXIT END;
- ⓪&Assign (PathPtr^,path,ok);
- ⓪&ValidatePath (path);
- ⓪&ReplaceHome (path);
- ⓪&ResetList(ImpCodes);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry (ImpCodes);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(Concat (path, FilePtr^.name, cn, ok);
- ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.date, FilePtr^.modPtr^.time) THEN
- ⓪*Assign (cn, FilePtr^.modPtr^.codeName, ok);
- ⓪*RemoveEntry(ImpCodes, rerr);
- ⓪*IF rerr THEN term3 (remErr) END;
- ⓪(END;
- ⓪&END; (* FileLoop *)
- ⓪&IF ListEmpty (ImpCodes) THEN EXIT END;
- ⓪$END; (* PathLoop *)
- ⓪$IF ~ListEmpty(ImpCodes) THEN
- ⓪&ResetList(ImpCodes);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry(ImpCodes);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(IF FilePtr^.modPtr^.withSource THEN
- ⓪*markToCompile (FilePtr^.modPtr, FilePtr^.name);
- ⓪(ELSE
- ⓪*WriteLn;
- ⓪*WriteString (FilePtr^.name);
- ⓪*waitAtEnd:= TRUE
- ⓪(END;
- ⓪&END; (* LOOP *)
- ⓪$END; (* IF ~ListEmpty *)
- ⓪"END getImpTimes;
- ⓪
- ⓪"PROCEDURE getSrcTimes();
- ⓪"VAR
- ⓪$PathPtr : PathEntry;
- ⓪$FilePtr : PtrFile;
- ⓪$path, cn : String;
- ⓪$ok, rerr : BOOLEAN;
- ⓪"BEGIN
- ⓪$ResetList(SrcPaths);
- ⓪$LOOP
- ⓪&PathPtr := NextEntry(SrcPaths);
- ⓪&IF PathPtr = NIL THEN EXIT END;
- ⓪&Assign (PathPtr^,path,ok);
- ⓪&ValidatePath (path);
- ⓪&ReplaceHome (path);
- ⓪&ResetList(Sources);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry (Sources);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(Concat (path, FilePtr^.name, cn, ok);
- ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.sdate, FilePtr^.modPtr^.stime) THEN
- ⓪*Assign (cn, FilePtr^.modPtr^.sourceName, ok);(*!!!das trifft auf INC nicht zu?! *)
- ⓪*RemoveEntry(Sources, rerr);
- ⓪*IF rerr THEN term3 (remErr) END;
- ⓪(END;
- ⓪&END; (* FileLoop *)
- ⓪&IF ListEmpty (Sources) THEN EXIT END;
- ⓪$END; (* PathLoop *)
- ⓪$IF ~ListEmpty(Sources) THEN
- ⓪&ResetList(Sources);
- ⓪&WriteLn;
- ⓪&LOOP
- ⓪(FilePtr := NextEntry(Sources);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(WriteString (FilePtr^.name);
- ⓪(WriteLn;
- ⓪&END; (* LOOP *)
- ⓪&waitAtEnd:= TRUE
- ⓪$END; (* IF ~ListEmpty *)
- ⓪"END getSrcTimes;
- ⓪
- ⓪ (*!TT
- ⓪"PROCEDURE getDftTimes();
- ⓪"VAR
- ⓪$PathPtr : PathEntry;
- ⓪$FilePtr : PtrFile;
- ⓪$paths : PathList;
- ⓪$path, cn: String;
- ⓪$ok, rerr: BOOLEAN;
- ⓪"BEGIN
- ⓪$paths:= StdPaths ();
- ⓪$ResetList(paths);
- ⓪$LOOP
- ⓪&PathPtr := NextEntry(paths);
- ⓪&IF PathPtr # NIL THEN Assign (PathPtr^,path,ok)
- ⓪&ELSE EXIT END;
- ⓪&ResetList(Defaults);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry (Defaults);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(Concat (path, FilePtr^.name, cn, ok);
- ⓪(IF getFileDateTime (cn, FilePtr^.modPtr^.sdate, FilePtr^.modPtr^.stime) THEN
- ⓪*Assign (cn, FilePtr^.modPtr^.sourceName, ok);(*!!!das trifft auf USES nicht zu?! *)
- ⓪*RemoveEntry(Defaults, rerr);
- ⓪*IF rerr THEN term3 (remErr) END;
- ⓪(END;
- ⓪&END; (* FileLoop *)
- ⓪$END; (* PathLoop *)
- ⓪$IF ~ListEmpty(Defaults) THEN
- ⓪&ResetList(Defaults);
- ⓪&WriteLn;
- ⓪&LOOP
- ⓪(FilePtr := NextEntry(Defaults);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(WriteString (FilePtr^.name);
- ⓪(WriteLn;
- ⓪&END; (* LOOP *)
- ⓪&waitAtEnd:= TRUE
- ⓪$END; (* IF ~ListEmpty *)
- ⓪"END getDftTimes;
- ⓪ *)
- ⓪
- ⓪"PROCEDURE getPathTimes();
- ⓪"VAR
- ⓪$FilePtr : PtrFullEntry;
- ⓪$pmod : PtrMod;
- ⓪$pinc : IncList;
- ⓪$sdate, stime: CARDINAL;
- ⓪$fname: FileStr;
- ⓪$paths: PathList;
- ⓪$c: CHAR;
- ⓪$ok, rerr : BOOLEAN;
- ⓪"BEGIN
- ⓪$ResetList(withPath);
- ⓪$LOOP
- ⓪&FilePtr := NextEntry (withPath);
- ⓪&IF FilePtr = NIL THEN EXIT END;
- ⓪&WITH FilePtr^ DO
- ⓪(
- ⓪((*!TT:*)
- ⓪(ok:= getFileDateTime (HomeReplaced (fullname), sdate, stime);
- ⓪(IF NOT ok THEN
- ⓪*IF typ = mod THEN
- ⓪,paths:= ModPaths
- ⓪*ELSIF typ = def THEN
- ⓪,paths:= DefPaths
- ⓪*ELSIF typ = imp THEN
- ⓪,paths:= ImpPaths
- ⓪*ELSE
- ⓪,paths:= SrcPaths
- ⓪*END;
- ⓪*SearchFile (fullname, paths, fromStart, ok, fname);
- ⓪*ok:= getFileDateTime (fname, sdate, stime);
- ⓪(END;
- ⓪(
- ⓪(IF ok THEN
- ⓪*IF typ = src THEN
- ⓪,pmod := modPtr;
- ⓪,pmod^.sdate:= sdate;
- ⓪,pmod^.stime:= stime;
- ⓪*ELSIF (typ = inc) OR (typ = uses) THEN
- ⓪,pinc := modPtr;
- ⓪,pinc^.date:= sdate;
- ⓪,pinc^.time:= stime;
- ⓪*ELSE
- ⓪,pmod := modPtr;
- ⓪,pmod^.date:= sdate;
- ⓪,pmod^.time:= stime
- ⓪*END;
- ⓪*RemoveEntry(withPath, rerr);
- ⓪*IF rerr THEN term3 (remErr) END;
- ⓪(END; (* IF State *)
- ⓪&END; (* WITH FilePtr *)
- ⓪$END; (* FileLoop *)
- ⓪$IF ~ListEmpty(withPath) THEN
- ⓪&ResetList(withPath);
- ⓪&LOOP
- ⓪(FilePtr := NextEntry(withPath);
- ⓪(IF FilePtr = NIL THEN EXIT END;
- ⓪(pmod := FilePtr^.modPtr;
- ⓪(IF (FilePtr^.typ < src) & pmod^.withSource THEN
- ⓪*(* Wenn's ein Code mit Source ist, fehlenden Code übersetzen *)
- ⓪*markToCompile (pmod, FilePtr^.fullname)
- ⓪(ELSE
- ⓪*(* Sonst fehlende Datei melden *)
- ⓪*WriteLn;
- ⓪*WriteString (FilePtr^.fullname);
- ⓪*waitAtEnd:= TRUE
- ⓪(END;
- ⓪&END; (* LOOP *)
- ⓪$END; (* IF ~ListEmpty *)
- ⓪"END getPathTimes;
- ⓪
- ⓪ (*
- ⓪"PROCEDURE showL (l : List; Titel : ARRAY OF CHAR);
- ⓪"VAR FilePtr : PtrFile;
- ⓪"BEGIN
- ⓪$WriteString(Titel);
- ⓪$WriteLn;
- ⓪$ResetList(l);
- ⓪$LOOP
- ⓪&FilePtr := NextEntry (l);
- ⓪&IF FilePtr = NIL THEN EXIT END;
- ⓪&WriteString (FilePtr^.name);
- ⓪&WriteLn;
- ⓪$END;
- ⓪$WriteLn;
- ⓪$REPEAT UNTIL KeyPressed();
- ⓪$FlushKbd();
- ⓪"END showL;
- ⓪"
- ⓪"PROCEDURE showP (l : List; Titel : ARRAY OF CHAR);
- ⓪"VAR FilePtr : PtrFullEntry;
- ⓪"BEGIN
- ⓪$WriteString(Titel);
- ⓪$WriteLn;
- ⓪$ResetList(l);
- ⓪$LOOP
- ⓪&FilePtr := NextEntry (l);
- ⓪&IF FilePtr = NIL THEN EXIT END;
- ⓪&WriteString (FilePtr^.fullname);
- ⓪&WriteLn;
- ⓪$END;
- ⓪$WriteLn;
- ⓪$REPEAT UNTIL KeyPressed();
- ⓪$FlushKbd();
- ⓪"END showP;
- ⓪ *)
- ⓪
- ⓪"BEGIN
- ⓪$WriteLn;
- ⓪$WriteString(scanin);
- ⓪$CreateList (ModCodes, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$CreateList (DefCodes, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$CreateList (ImpCodes, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$CreateList (Sources, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$CreateList (Defaults, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$CreateList (withPath, error);
- ⓪$IF error THEN termNoMem END;
- ⓪$
- ⓪$ResetList (modlist);
- ⓪$LOOP
- ⓪&pmod:= NextEntry (modlist);
- ⓪&IF pmod = NIL THEN EXIT END;
- ⓪&IF ~pmod^.ignore THEN
- ⓪(IF Empty (pmod^.codeName) THEN
- ⓪*HALT
- ⓪*(* müßte schon bei 'verifyIdents' geprüft worden sein:
- ⓪,WriteLn;
- ⓪,WriteString (pmod^.name);
- ⓪,WriteString (notDef);
- ⓪,waitAtEnd:= TRUE;
- ⓪**)
- ⓪(ELSIF ~waitAtEnd THEN
- ⓪*WITH pmod^ DO
- ⓪,insCode (codeName, type, pmod);
- ⓪,IF withSource THEN
- ⓪.insSource (sourceName, type, pmod);
- ⓪,END;
- ⓪*END;
- ⓪(END;
- ⓪&END
- ⓪$END;
- ⓪$IF NOT waitAtEnd THEN
- ⓪&(*
- ⓪&showL(ModCodes, 'Mod:');
- ⓪&showL(DefCodes, 'Def:');
- ⓪&showL(ImpCodes, 'Imp:');
- ⓪&showL(Sources, 'Src:');
- ⓪&showL(Defaults, 'Src:');
- ⓪&showP(withPath, 'Mit Pfad:');
- ⓪&*)
- ⓪&(*!!!
- ⓪&getdefaultTimes();
- ⓪&*)
- ⓪&WriteLn;
- ⓪&getModTimes();
- ⓪&getDefTimes();
- ⓪&getImpTimes();
- ⓪&getSrcTimes();
- ⓪&getPathTimes();
- ⓪&WriteLn;
- ⓪&IF waitAtEnd THEN
- ⓪(term3 (opnErr)
- ⓪&END
- ⓪$END;
- ⓪$RETURN ~waitAtEnd
- ⓪"END getTime;
- ⓪
- ⓪ (*
- ⓪ PROCEDURE showIdents;
- ⓪"VAR modPtr: PtrMod; c: CHAR; i: ImpList; s: String;
- ⓪"BEGIN
- ⓪$ResetList (modlist);
- ⓪$LOOP
- ⓪&modPtr:= NextEntry (modlist);
- ⓪&IF modPtr = NIL THEN EXIT END;
- ⓪&WITH modPtr^ DO
- ⓪(WriteLn;
- ⓪(WriteString (name);
- ⓪(WriteString (' ');
- ⓪(IF type=def THEN WriteString ('DEF')
- ⓪(ELSIF type=imp THEN WriteString ('IMP')
- ⓪(ELSE WriteString ('MOD') END;
- ⓪(WriteLn;
- ⓪(WriteString ('Codename: ');
- ⓪(WriteString (codeName);
- ⓪(WriteString (' ');
- ⓪(DateToText (UnpackDate (date), '', s);
- ⓪(WriteString (s);
- ⓪(WriteString (' ');
- ⓪(TimeToText (UnpackTime (time), '', s);
- ⓪(WriteString (s);
- ⓪(IF withSource THEN
- ⓪*WriteLn;
- ⓪*WriteString ('Source: ');
- ⓪*WriteString (sourceName);
- ⓪*WriteString (' ');
- ⓪*DateToText (UnpackDate (sdate), '', s);
- ⓪*WriteString (s);
- ⓪*WriteString (' ');
- ⓪*TimeToText (UnpackTime (stime), '', s);
- ⓪*WriteString (s);
- ⓪*IF import # NIL THEN
- ⓪,WriteLn;
- ⓪,WriteString ('Imports: ');
- ⓪,i:= import;
- ⓪,LOOP
- ⓪.WriteString (i^.modPtr^.name);
- ⓪.i:= i^.next;
- ⓪.IF i = NIL THEN EXIT END;
- ⓪.WriteString (', ')
- ⓪,END
- ⓪*END (* IF import # NIL *)
- ⓪(END; (* IF withSource *)
- ⓪(WriteLn;
- ⓪(Read (c);
- ⓪&END (* WITH modPtr^ *)
- ⓪$END; (* LOOP *)
- ⓪"END showIdents;
- ⓪ *)
- ⓪
- ⓪ PROCEDURE chkTree;
- ⓪"VAR
- ⓪$modPtr: PtrMod;
- ⓪$cdate, ctime : CARDINAL;
- ⓪$currtime: moment;
- ⓪$success : BOOLEAN;
- ⓪$mustCompile: BOOLEAN;
- ⓪
- ⓪"PROCEDURE toCompile (REF sourceName, codeName, clientName: ARRAY OF CHAR);
- ⓪$VAR s, s2: String;
- ⓪$BEGIN
- ⓪&mustCompile:= TRUE;
- ⓪&Text.WriteString (compfile, '(*$I ');
- ⓪&Text.WriteString (compfile, sourceName);
- ⓪&IF codeName[0] # '' THEN
- ⓪(Text.WriteString (compfile, ' Code: ');
- ⓪(SplitPath (codeName, s, s2);
- ⓪(Text.WriteString (compfile, s)
- ⓪&END;
- ⓪&IF clientName[0] # '' THEN
- ⓪(Text.WriteString (compfile, ' Reason: ');
- ⓪(Text.WriteString (compfile, clientName)
- ⓪&END;
- ⓪&Text.WriteString (compfile, ' *)');
- ⓪&Text.WriteLn (compfile);
- ⓪$END toCompile;
- ⓪
- ⓪"PROCEDURE illegalSourceTime (REF sourceName: ARRAY OF CHAR);
- ⓪$BEGIN
- ⓪&WriteLn;
- ⓪&WriteString (sourceName);
- ⓪&WriteString (datErr);
- ⓪&waitAtEnd:= TRUE
- ⓪$END illegalSourceTime;
- ⓪
- ⓪"PROCEDURE illegalCodeTime (REF codeName: ARRAY OF CHAR);
- ⓪$BEGIN
- ⓪&WriteLn;
- ⓪&WriteString (codeName);
- ⓪&WriteString (datErr);
- ⓪&waitAtEnd:= TRUE
- ⓪$END illegalCodeTime;
- ⓪
- ⓪"PROCEDURE toMoment (date : CARDINAL; time : CARDINAL) : moment;
- ⓪$BEGIN
- ⓪&RETURN (LONG(time)+LONG(date)*$10000L);
- ⓪$END toMoment;
- ⓪
- ⓪"PROCEDURE setTimeDate (time: moment; modPtr: PtrMod);
- ⓪$BEGIN
- ⓪&modPtr^.date:= SHORT (time DIV $10000);
- ⓪&modPtr^.time:= SHORT (time MOD $10000);
- ⓪$END setTimeDate;
- ⓪
- ⓪"PROCEDURE Lmax (a, b : LONGCARD) : LONGCARD;
- ⓪$BEGIN
- ⓪&IF a>b THEN RETURN a
- ⓪&ELSE RETURN b END;
- ⓪$END Lmax;
- ⓪
- ⓪"PROCEDURE chkDate(aktmod : PtrMod) : moment;
- ⓪$VAR
- ⓪&clientName: String;
- ⓪&aktimp: ImpList;
- ⓪&this, maximp, codeMom, sourceMom: moment;
- ⓪
- ⓪$PROCEDURE check (aktinc: IncList);
- ⓪&VAR incTime: moment;
- ⓪&BEGIN
- ⓪(WHILE (aktinc <> NIL) DO
- ⓪*incTime:= toMoment(aktinc^.date, aktinc^.time);
- ⓪*IF incTime > sourceMom THEN
- ⓪,sourceMom:= incTime;
- ⓪,IF (sourceMom > codeMom) & (clientName[0] = '') THEN
- ⓪.Assign (aktinc^.fullname, clientName, ok)
- ⓪,END
- ⓪*END;
- ⓪*aktinc := aktinc^.next;
- ⓪(END
- ⓪&END check;
- ⓪
- ⓪$BEGIN
- ⓪&codeMom:= 0;
- ⓪&clientName:= '';
- ⓪&WITH aktmod^ DO
- ⓪(IF NOT ignore THEN
- ⓪*IF build THEN
- ⓪,codeMom:= 0
- ⓪*ELSE
- ⓪,codeMom:= toMoment(date, time);
- ⓪*END;
- ⓪*IF NOT checked THEN
- ⓪,checked:= TRUE;
- ⓪,IF codeMom > currtime THEN illegalCodeTime (codeName) END;
- ⓪,IF withSource THEN
- ⓪.IF build THEN
- ⓪0sourceMom:= 0
- ⓪.ELSE
- ⓪0sourceMom:= toMoment(sdate, stime);
- ⓪.END;
- ⓪.IF sourceMom > currtime THEN illegalSourceTime (sourceName) END;
- ⓪.IF NOT build THEN
- ⓪0IF sourceMom > codeMom THEN
- ⓪2IF codeMom = 0 THEN
- ⓪4clientName:= NoCodeMsg
- ⓪2ELSE
- ⓪4clientName:= SelfMsg
- ⓪2END
- ⓪0END;
- ⓪0check (include);
- ⓪0check (uses);
- ⓪.END;
- ⓪.maximp:= 0L;
- ⓪.aktimp:= import;
- ⓪.WHILE aktimp <> NIL DO
- ⓪0this:= chkDate(aktimp^.modPtr);
- ⓪0IF this > maximp THEN
- ⓪2maximp:= this;
- ⓪2IF (maximp > codeMom) & (sourceMom <= codeMom) THEN
- ⓪4Assign (aktimp^.modPtr^.codeName, clientName, ok)
- ⓪2END
- ⓪0END;
- ⓪0aktimp:= aktimp^.next;
- ⓪.END; (* WHILE *)
- ⓪.IF build OR (buildImp & (type # def))
- ⓪.OR (maximp>codeMom) OR (sourceMom>codeMom) THEN
- ⓪0IF build THEN clientName:= '' END;
- ⓪0toCompile (sourceName, codeName, clientName);
- ⓪0codeMom:= currtime;
- ⓪0setTimeDate (codeMom, aktmod);
- ⓪.END;
- ⓪,END; (* IF withSource *)
- ⓪*END; (* IF NOT checked *)
- ⓪(END; (* IF NOT ignore *)
- ⓪&END; (* WITH *)
- ⓪&RETURN codeMom;
- ⓪$END chkDate;
- ⓪
- ⓪"VAR cn: String; ok: BOOLEAN; ml: List; dummy: moment;
- ⓪
- ⓪"BEGIN
- ⓪$WriteLn;
- ⓪$
- ⓪$ctime:= PackTime(CurrentTime());
- ⓪$cdate:= PackDate(CurrentDate());
- ⓪$currtime:= toMoment(cdate, ctime);
- ⓪
- ⓪$ConcatPath (HomeReplaced (TemporaryPath), compFileName, cn);
- ⓪$Create(compfile, cn, writeSeqTxt, replaceOld);
- ⓪$IF State(compfile)<0 THEN term3 (noCom) END;
- ⓪
- ⓪$ml:= modlist;
- ⓪$ResetList (ml);
- ⓪$mustCompile:= FALSE;
- ⓪$LOOP
- ⓪&modPtr:= NextEntry (ml);
- ⓪&IF modPtr = NIL THEN EXIT END;
- ⓪&IF NOT modPtr^.checked THEN
- ⓪(dummy:= chkDate (modPtr)
- ⓪&END
- ⓪$END;
- ⓪
- ⓪$IF waitAtEnd THEN
- ⓪&Remove (compfile)
- ⓪$ELSIF mustCompile THEN
- ⓪&exitCode:= 0;
- ⓪&WriteString (toComp);
- ⓪&Close (compfile);
- ⓪$ELSE
- ⓪&exitCode:= 1;
- ⓪&WriteString (noComp);
- ⓪&Remove (compfile);
- ⓪$END;
- ⓪
- ⓪"END chkTree;
- ⓪
- ⓪
- ⓪ VAR ch: CHAR;
- ⓪$n, i, argc: CARDINAL;
- ⓪$opts: String;
- ⓪$argv: ARRAY [0..1] OF PtrArgStr;
- ⓪
- ⓪ BEGIN
- ⓪"WriteLn;
- ⓪"WriteString (titl1);
- ⓪"WriteLn;
- ⓪"WriteString (titl2);
- ⓪"WriteLn;
- ⓪
- ⓪"HomePath:= ShellPath;
- ⓪
- ⓪"CodeName:= '';
- ⓪"ModuleName:= '';
- ⓪
- ⓪"CreateList (modlist, error);
- ⓪"IF error THEN termNoMem END;
- ⓪
- ⓪"(* MAKE-Datei einlesen, Daten in 'modlist' einfügen *)
- ⓪"build:= FALSE;
- ⓪"buildImp:= FALSE;
- ⓪"InitArgCV (argc, argv);
- ⓪"n:= 1; (* mögl. Pos. des Filenamens *)
- ⓪"FOR i:= 1 TO argc-1 DO
- ⓪$Upper (argv[i]^);
- ⓪$IF StrEqual ('-B', argv[i]^) THEN
- ⓪&IF i = 1 THEN n:= 2 (* neue mögl. Pos. des Filenamens *) END;
- ⓪&build:= TRUE
- ⓪$ELSIF StrEqual ('-BI', argv[i]^) THEN
- ⓪&IF i = 1 THEN n:= 2 (* neue mögl. Pos. des Filenamens *) END;
- ⓪&buildImp:= TRUE
- ⓪$END
- ⓪"END;
- ⓪"IF argc > n THEN
- ⓪$readIdents (argv[n]^)
- ⓪"ELSE
- ⓪$Upper (MakeFileName);
- ⓪$EatSpaces (MakeFileName);
- ⓪$(* Prüfen, ob "-B" am Anfang steht *)
- ⓪$IF StrEqual ("-B", FuncStrings.CopyStr (MakeFileName, 0, 2)) THEN
- ⓪&IF StrEqual ("-BI", FuncStrings.CopyStr (MakeFileName, 0, 3)) THEN
- ⓪(buildImp:= TRUE;
- ⓪&ELSE
- ⓪(build:= TRUE;
- ⓪&END;
- ⓪&Delete (MakeFileName, 0, 2, ok);
- ⓪$ELSE
- ⓪&Split (MakeFileName,
- ⓪-PosLen ("-", MakeFileName, 0),
- ⓪-MakeFileName, opts, ok);
- ⓪&IF StrEqual ("-B", opts) THEN
- ⓪(build:= TRUE
- ⓪&ELSIF StrEqual ("-BI", opts) THEN
- ⓪(buildImp:= TRUE
- ⓪&END
- ⓪$END;
- ⓪$readIdents (MakeFileName)
- ⓪"END;
- ⓪
- ⓪"exitCode:= -1;
- ⓪"waitAtEnd:= FALSE;
- ⓪
- ⓪"IF verifyIdents () THEN
- ⓪$IF build OR getTime () THEN
- ⓪&(*showIdents;*)
- ⓪&chkTree;
- ⓪$END
- ⓪"END;
- ⓪
- ⓪"IF waitAtEnd THEN
- ⓪$term3 ('')
- ⓪"ELSE
- ⓪$TermProcess (exitCode)
- ⓪"END
- ⓪ END MM2Make.
- ⓪ ə
- (* $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¼Çé*)
-