home *** CD-ROM | disk | FTP | other *** search
- ⓪ (* (C) 1989, 1990 by Johannes Leckebusch *)
- ⓪ (* Portiert für MM2: 7. 6. 89 *)
- ⓪
- ⓪ (* 12.12.90 TT Puffer werden hier statt in GMEBase angelegt,
- ⓪1um zirkul. Import zw. GMEBase & GMEConfig zu lösen;
- ⓪1FastLen wieder in Assembler;
- ⓪1Ctrl-Z wird in FastLen als Ende erkannt;
- ⓪1Meldung "Config laden" nur, wenn's wirklich geladen wird;
- ⓪1Wenn ungültiger Text gelesen wird, kommt entspr.
- ⓪1Fehlermeldung und TextLesen bricht ab - allerdings
- ⓪1wird Puffer noch nicht dann wieder gelöscht!
- ⓪#13.12.90 TT Konstante 'DefaultConfigName' definiert, die Datei heißt
- ⓪1wieder "GME.GME", weil's so im Handbuch steht.
- ⓪1Meldung, daß .GME nicht gefunden, erscheint nun mit vollst.
- ⓪1Dateinamen (also z.B. "GME.GME" statt nur ".GME") und
- ⓪1dahinter wird ein CR/LF ausgegeben, damit das evtl. folgende
- ⓪1"Text laden" nicht direkt dahinter steht.
- ⓪#17.12.90 TT Fix vom 16.12. von JL wg. Absturz bei ^QE in TextSchreiben
- ⓪1eingesetzt.
- ⓪#18.12.90 TT Letzte Zeile wird von TextLesen nun korrekt geladen;
- ⓪1Fehlerabfrage beim Anlegen ALLER Puffer -> OutOfMemory-Meldg.;
- ⓪1TextSchreiben: Handles werden auf neg. Werte und nicht mehr
- ⓪1"<6" verglichen; TextSchreiben: Letzte Zeile wird nicht mit
- ⓪1CR/LF versehen.
- ⓪#09.03.91 TT TextSchreiben: liefert Erfolgswert; GME.GME wird nur geladen,
- ⓪1wenn "KonfigSpeichern" aktiv ist.
- ⓪ *)
- ⓪
- ⓪ (*$R-*)
- ⓪ (*$Y+*)
- ⓪ (*$Z+*)
- ⓪
- ⓪ IMPLEMENTATION MODULE GMEFile;
- ⓪
- ⓪
- ⓪ (* The Little Golem Editor. Begonnen 13. 06. 86
- ⓪#(C) 1986, 1990 by Johannes Leckebusch
- ⓪#Version: Siehe ceditor
- ⓪#Stand: 28. 02. 88
- ⓪ *)
- ⓪
- ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, CAST;
- ⓪ (* FROM Storage IMPORT ALLOCATE, DEALLOCATE; *)
- ⓪ FROM Granule IMPORT ALLOCATE, DEALLOCATE;
- ⓪
- ⓪ FROM GEMDOS IMPORT IOMode, Open, Create, Close, Delete, Read, Write, Rename,
- ⓪"DaTime, TimeAccessMode;
- ⓪
- ⓪ FROM EasyGEM1 IMPORT MakeScrapName;
- ⓪ FROM PrgCtrl IMPORT ActiveProcess;
- ⓪ FROM SystemError IMPORT OutOfMemory;
- ⓪
- ⓪ FROM Strings IMPORT Append, Assign, Copy;
- ⓪ FROM FastStrings IMPORT Pos;
- ⓪ IMPORT FastStrings, Paths, Lists, Directory, ShellMsg, PathCtrl, FileNames;
- ⓪ FROM ShellMsg IMPORT ShellPath;
- ⓪
- ⓪ (* FROM MyConversions IMPORT ConvCard; *)
- ⓪ FROM Convert IMPORT ConvCard;
- ⓪
- ⓪ FROM GMEConfig IMPORT ConfigInit, InitConfig;
- ⓪
- ⓪ FROM GMEBase IMPORT WriteConst, WriteLn, WriteChar, Trace,
- ⓪(bel, cr, eot, lf, tab, nul, LinesOnScreen,
- ⓪(
- ⓪(PuffRecSize, cRevision,
- ⓪(InitBuffer,
- ⓪(LoescheBild, LoescheZeile,
- ⓪(WriteLine, HighLight, Normal, GotoXY, CursorEin, CursorAus,
- ⓪(Nachricht, FrageJaNein, Ja, Nein, MausEin, MausAus, MausBusy,
- ⓪(GetVersion,
- ⓪(PuffInit,
- ⓪(UndoPuffer, ClipBoard, HilfsPuffer, ConfigPuffer,
- ⓪(EditPuffer, AlternEdit, DruckPuff, MailPuffer,
- ⓪(Tausch, GolemPuffer, PSCPuffer, FehlerPuffer;
- ⓪
- ⓪ FROM GMEBase IMPORT DeleteTail, GetDirectory, GetPfad;
- ⓪
- ⓪ FROM GMEBase IMPORT cZeile, cTabWeite, cKopfVorlauf, cKopfNachlauf,
- ⓪(cZeilenAbstand, cSpiegel, cOffset;
- ⓪
- ⓪ FROM GMEBase IMPORT Mode, CharSet,
- ⓪(einPufferPointer, eineInfo, eineZeile,
- ⓪(einLinePointer, Moden, MerkIndex,
- ⓪(einMerkPunkt, einMerkPointer, einStringPointer, einMerkSet;
- ⓪
- ⓪ FROM GMEBase IMPORT Loeschen, Init, AllocLine, PutLine,
- ⓪(AutoCount, InsertPuffer;
- ⓪
- ⓪ (* FROM EditCommand IMPORT SplitFileName; *)
- ⓪
- ⓪ FROM GMEKernel IMPORT SchirmSchreiben;
- ⓪
- ⓪ FROM GMEKernel IMPORT LineUp, InsertLine, StelleZeileEin, SucheZeilenPointer;
- ⓪
- ⓪ (* Bemerkung: StringZeilen werden als >>Zeile<<, Pointer-Objekte
- ⓪#als >>Line<< bezeichnet *)
- ⓪
- ⓪ CONST cpuffer = 32767;
- ⓪(cgrain = 16; (* Hm - das war natürlich Granule... *)
- ⓪(
- ⓪(DefaultConfigName = 'GME.GME';
- ⓪
- ⓪ TYPE einPuffer = ARRAY [0..cpuffer] OF CHAR;
- ⓪(PufferPointer = POINTER TO einPuffer;
- ⓪
- ⓪ VAR version: eineInfo;
- ⓪(puffer: PufferPointer;
- ⓪
- ⓪
- ⓪ (************************* aus GMEBase *******************************)
- ⓪
- ⓪ PROCEDURE LoadConfig (Puff: einPufferPointer; frage, message: BOOLEAN);
- ⓪ VAR Info: eineInfo;
- ⓪(filehandle: INTEGER;
- ⓪(ok: BOOLEAN;
- ⓪(button: INTEGER;
- ⓪ VAR PName: eineInfo;
- ⓪(LSIZE: LONGCARD;
- ⓪(mind: MerkIndex;
- ⓪(dot, star: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
- ⓪(i: CARDINAL;
- ⓪(ch: CHAR;
- ⓪(chp: POINTER TO CHAR;
- ⓪
- ⓪$PROCEDURE ReadZeile (VAR lp: einLinePointer);
- ⓪$VAR LSIZE: LONGCARD;
- ⓪.l: eineZeile;
- ⓪.ind: CARDINAL;
- ⓪$BEGIN
- ⓪&LSIZE := 1; ind := 0;
- ⓪&WHILE (ch # cr) & (ch # eot) & (ind < cZeile) & (LSIZE = 1L) DO
- ⓪&(* Achtung: Falls tatsaechlich zuviele Zeichen im String,
- ⓪)werden nicht alle gelesen! (ind < cZeile) *)
- ⓪(l [ind] := ch; INC (ind);
- ⓪(Read (filehandle, LSIZE, chp);
- ⓪&END (* WHILE *);
- ⓪&l [ind] := nul;
- ⓪&(* merkinfo ist nicht alloziiert! *)
- ⓪&AllocLine (lp, 0);
- ⓪&IF lp = NIL THEN
- ⓪(Nachricht ('Kein Platz für|Zeileninfo.113');
- ⓪&ELSE
- ⓪(PutLine (lp, l);
- ⓪&END;
- ⓪$END ReadZeile;
- ⓪
- ⓪ (*
- ⓪$PROCEDURE LoadMerkpunktListe (VAR mp: einMerkPunkt);
- ⓪$VAR mpp, hp: einMerkPointer;
- ⓪,Ende: BOOLEAN;
- ⓪"
- ⓪&PROCEDURE LoadMerkpunkt (VAR p: einMerkPointer);
- ⓪&VAR LSIZE: LONGCARD;
- ⓪(VAR lp: einLinePointer;
- ⓪(
- ⓪&BEGIN (* LoadMerkpunkt *)
- ⓪((* Merkpunkt-Record lesen: *)
- ⓪(NEW (p);
- ⓪(IF p = NIL THEN
- ⓪*Nachricht ('Kein Platz für|Merkpunkt.114');
- ⓪*Ende := TRUE; RETURN;
- ⓪(END;
- ⓪(LSIZE := LONG (SIZE (p^));
- ⓪(Read (filehandle, LSIZE, p);
- ⓪((* p^.nextMerk enthaelt alten Pointerwert, dieser darf
- ⓪+jedoch nur auf NIL verglichen werden! *)
- ⓪(WITH p^ DO
- ⓪*merkline := Puff^.Puffer^.naechste; (* erste effektive Textzeile *)
- ⓪
- ⓪*(* Infostring lesen: *)
- ⓪
- ⓪*IF merkinfo # NIL THEN
- ⓪,lp := merkinfo;
- ⓪,chp := ADR (ch); LSIZE := 1;
- ⓪,Read (filehandle, LSIZE, chp);
- ⓪,WHILE (ch # eot) & (LSIZE = 1) DO
- ⓪.ReadZeile (merkinfo);
- ⓪.Read (filehandle, LSIZE, chp);
- ⓪.IF ch # eot THEN
- ⓪0AllocLine (merkinfo^.naechste, 0);
- ⓪0IF merkinfo^.naechste = NIL THEN
- ⓪2Nachricht ('Kein Platz für|Zeileninfo.115');
- ⓪2Ende := TRUE; RETURN;
- ⓪0END;
- ⓪0merkinfo^.naechste^.vorige := merkinfo;
- ⓪0merkinfo := merkinfo^.naechste;
- ⓪.END (* IF *);
- ⓪,END (* WHILE NOT ^Z *);
- ⓪*END (* IF Infostring lesen *);
- ⓪*
- ⓪(END (* WITH *);
- ⓪&END LoadMerkpunkt;
- ⓪&
- ⓪$BEGIN (* LoadMerkpunktListe *)
- ⓪&IF mp.nextMerk # NIL THEN
- ⓪((* WriteLn; WriteConst (' Lade Merkpunktliste'); *)
- ⓪(LoadMerkpunkt (mp.nextMerk);
- ⓪(mpp := mp.nextMerk; Ende := FALSE;
- ⓪(WHILE (mpp^.nextMerk # NIL) & ~Ende DO
- ⓪*LoadMerkpunkt (mpp^.nextMerk);
- ⓪*mpp := mpp^.nextMerk;
- ⓪(END (* WHILE *);
- ⓪&END (* IF *);
- ⓪$END LoadMerkpunktListe;
- ⓪ *)
- ⓪ BEGIN (* LoadConfig *)
- ⓪"(* IF ~FrageJaNein (1, 'Texteinstellungen laden') THEN RETURN; END; *)
- ⓪
- ⓪"dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)
- ⓪"star [0] := '*';
- ⓪"(* REPEAT *)
- ⓪"IF frage THEN CursorAus;
- ⓪%LoescheBild;
- ⓪%HighLight; WriteLine (version);
- ⓪%Normal; WriteLn; WriteLn;
- ⓪"END (* IF frage *);
- ⓪"
- ⓪$WITH Puff^ DO
- ⓪&FileNames.ConcatName (Pfad, 'GME', Pfad);
- ⓪&FileNames.ConcatName (Name, 'GME', Name);
- ⓪$END;
- ⓪$
- ⓪$Info := Puff^.Pfad; DeleteTail (Info);
- ⓪$FastStrings.Append (Puff^.Name, Info);
- ⓪$IF frage THEN
- ⓪&(* WriteConst (' Text-Konfiguration lesen: '); *)
- ⓪&HighLight; WriteConst (Info); Normal;
- ⓪&GetDirectory (Puff^.Pfad, Puff^.Name, 'GME lesen', button, FALSE);
- ⓪&IF (button # 1) THEN
- ⓪((*IF expand THEN RETURN; END;*)
- ⓪(InitConfig (Puff);
- ⓪(CursorEin; RETURN;
- ⓪&END;
- ⓪&Info := Puff^.Pfad; DeleteTail (Info);
- ⓪&FastStrings.Append (Puff^.Name, Info);
- ⓪$END (* IF frage *);
- ⓪
- ⓪$Open (Info, ORD (read), filehandle);
- ⓪$(* frage := TRUE; *)
- ⓪
- ⓪"IF ~(filehandle >= 0) THEN
- ⓪$(* Nachricht ('.GME-Datei nicht gefunden!'); *)
- ⓪
- ⓪$HighLight; WriteLine (Puff^.Name);
- ⓪$WriteConst (' nicht gefunden!'); Normal;
- ⓪$WriteLn;
- ⓪
- ⓪$InitConfig (Puff);
- ⓪$EXCL (Puff^.Modus, KonfigSpeichern);
- ⓪$RETURN;
- ⓪"END (* IF *);
- ⓪"IF message THEN
- ⓪$WriteConst ('Config laden');
- ⓪$WriteLn;
- ⓪"END;
- ⓪"MausBusy;
- ⓪"LSIZE := 4;
- ⓪"Read (filehandle, LSIZE, Puff);
- ⓪"IF Puff^.MagicRevision # cRevision THEN
- ⓪$ok := Close (filehandle);
- ⓪$Nachricht ('GME-Datei inkompatibel');
- ⓪$InitConfig (Puff);(* Puff^.MagicRevision := 0;*)
- ⓪$CursorEin;
- ⓪$RETURN;
- ⓪"END (* IF *);
- ⓪"LSIZE := PuffRecSize - 4L;
- ⓪"Read (filehandle, LSIZE, ADDRESS (Puff) + 4L);
- ⓪"EXCL (Puff^.Modus, Editiert);
- ⓪"(* EXCL (Puff^.Modus, ScanText); (* Flag steuert PSC-Interpreter! *) *)
- ⓪"
- ⓪"(* Merkinfo der festen Merkpunkte laden: *)
- ⓪"
- ⓪"FOR mind := ErsteZeile TO LetztePosition DO
- ⓪$(* Trace (' Merkpunkt laden...'); *)
- ⓪$WITH Puff^.MerkPunkte [mind] DO
- ⓪&IF merkinfo # NIL (* alter String war vorhanden *)
- ⓪(THEN chp := ADR (ch); LSIZE := 1;
- ⓪-Read (filehandle, LSIZE, chp);
- ⓪-ReadZeile (merkinfo);
- ⓪&END (* IF merkinfo *);
- ⓪$END (* WITH *);
- ⓪"END (* FOR *);
- ⓪
- ⓪ (*
- ⓪"(* Merklisten laden: *)
- ⓪"
- ⓪"IF expand THEN
- ⓪$FOR mind := ErsteZeile TO LetztePosition DO
- ⓪&WITH Puff^ DO
- ⓪(LoadMerkpunktListe (MerkPunkte [mind]);
- ⓪&END (* WITH *);
- ⓪$END (* FOR *);
- ⓪"END (* IF *);
- ⓪ *)
- ⓪
- ⓪"(* File schliessen *)
- ⓪"ok := Close (filehandle);
- ⓪"MausEin; CursorEin;
- ⓪ END LoadConfig;
- ⓪
- ⓪ PROCEDURE SaveConfig (Puff: einPufferPointer; frage: BOOLEAN);
- ⓪ (* Speichere die in listen genannten Merkpunktlisten, sonst nur den
- ⓪#Kopfrecord des Textpufferdescriptors *)
- ⓪
- ⓪ VAR Name, BakName, Pfad: eineInfo;
- ⓪(filehandle: INTEGER;
- ⓪(ok: BOOLEAN;
- ⓪(dot, star: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
- ⓪(PName: eineInfo;
- ⓪(i: CARDINAL;
- ⓪(button: INTEGER;
- ⓪(LSIZE: LONGCARD;
- ⓪(mind: MerkIndex;
- ⓪
- ⓪"PROCEDURE WriteInfo (lp: einLinePointer);
- ⓪"VAR ch: CHAR;
- ⓪"BEGIN
- ⓪$LSIZE := LONG (LENGTH (lp^.ZeilPointer^)); (* ERROR *)
- ⓪$Write (filehandle, LSIZE, lp^.ZeilPointer);
- ⓪$ch := cr; LSIZE := 1;
- ⓪$Write (filehandle, LSIZE, ADR (ch));
- ⓪"END WriteInfo;
- ⓪
- ⓪ (*
- ⓪"PROCEDURE SaveMerkpunktListe (mp: einMerkPunkt);
- ⓪"VAR mpp: einMerkPointer;
- ⓪
- ⓪$PROCEDURE SaveMerkpunkt (p: einMerkPointer);
- ⓪$VAR LSIZE: LONGCARD;
- ⓪0lp: einLinePointer;
- ⓪0ch: CHAR;
- ⓪$BEGIN
- ⓪&(* Merkpunkt-Record schreiben: *)
- ⓪&LSIZE := LONG (SIZE (p^));
- ⓪&Write (filehandle, LSIZE, p);
- ⓪&WITH p^ DO
- ⓪&
- ⓪((* Infostring schreiben: *)
- ⓪&
- ⓪(IF merkinfo # NIL THEN
- ⓪*lp := merkinfo;
- ⓪*WHILE lp # NIL DO
- ⓪,WriteInfo (lp);
- ⓪,lp := lp^.naechste;
- ⓪*END (* WHILE *);
- ⓪(END (* IF Infostring schreiben *);
- ⓪(ch := eot; (* ^Z *)
- ⓪(LSIZE := 1;
- ⓪(Write (filehandle, LSIZE, ADR (ch));
- ⓪&END (* WITH p^ *);
- ⓪$END SaveMerkpunkt;
- ⓪$
- ⓪"BEGIN (* SaveMerkpunktListe *)
- ⓪$mpp := mp.nextMerk;
- ⓪$WHILE mpp # NIL DO
- ⓪&SaveMerkpunkt (mpp);
- ⓪&mpp := mpp^.nextMerk;
- ⓪$END (* WHILE *);
- ⓪"END SaveMerkpunktListe;
- ⓪ *)
- ⓪
- ⓪ BEGIN (* SaveConfig *)
- ⓪ (*
- ⓪"IF ~FrageJaNein (1, 'Texteinstellungen speichern') THEN RETURN; END;
- ⓪ *)
- ⓪"dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)
- ⓪"star [0] := '*';
- ⓪"IF frage THEN
- ⓪$Name := DefaultConfigName;
- ⓪"ELSE
- ⓪$(*
- ⓪$Name := Puff^.Name;
- ⓪$IF Pos (dot, Name) >= 0 THEN
- ⓪&(* Suffix entfernen: *)
- ⓪&i := LENGTH (Name); DEC (i);
- ⓪&WHILE Name [i] # '.' DO
- ⓪(DEC (i);
- ⓪&END (* WHILE *);
- ⓪&Name [i] := nul;
- ⓪$END (* IF Punkt *);
- ⓪$IF Name [0] = nul THEN FastStrings.Assign (star, Name); END;
- ⓪$FastStrings.Append ('.GME', Name);
- ⓪$*)
- ⓪$FileNames.ConcatName (Puff^.Name, 'GME', Name);
- ⓪"END (* IF frage *);
- ⓪"
- ⓪"(* Meldung in die obersten Bildschirmzeilen schreiben: *)
- ⓪"
- ⓪"(* LoescheBild; *)
- ⓪"GotoXY (0, 0); CursorAus;
- ⓪"HighLight; WriteLine (version); Normal; LoescheZeile;
- ⓪"WriteLn; LoescheZeile; WriteLn; LoescheZeile;
- ⓪"HighLight; WriteConst (' Text-Konfiguration schreiben: ');
- ⓪"Pfad := Puff^.Pfad; DeleteTail (Pfad);
- ⓪"WriteConst (Pfad); WriteConst (Name); Normal; LoescheZeile;
- ⓪"WriteLn; LoescheZeile;
- ⓪"
- ⓪"IF frage THEN
- ⓪$FileNames.ConcatPath (ShellPath, DefaultConfigName, PName);
- ⓪"ELSE
- ⓪$(*
- ⓪$PName := Puff^.Pfad;
- ⓪$IF Pos (dot, PName) >= 0 THEN
- ⓪&i := LENGTH (PName); DEC (i);
- ⓪&WHILE PName [i] # '.' DO
- ⓪(DEC (i);
- ⓪&END (* WHILE *);
- ⓪&PName [i] := nul;
- ⓪$END (* IF Punkt *);
- ⓪$IF PName [0] = nul THEN FastStrings.Assign (star, PName); END;
- ⓪$FastStrings.Append ('.GME', PName);
- ⓪$*)
- ⓪$FileNames.ConcatName (Puff^.Pfad, 'GME', PName);
- ⓪"END (* IF frage *);
- ⓪"
- ⓪"IF (* frage OR *) (Name [0] = nul) THEN
- ⓪$(* Filename vom Benutzer holen: *)
- ⓪$GetDirectory (PName, Name, '*.GME speichern', button, FALSE);
- ⓪$IF button # 1 THEN (* Abbruch-Knopf gedrueckt *)
- ⓪&RETURN;
- ⓪$END;
- ⓪"END (* IF frage *);
- ⓪"
- ⓪"IF Name [0] = nul THEN
- ⓪$Nachricht('Sie müssen einen Dateinamen angeben!');
- ⓪$RETURN;
- ⓪"END (* IF kein Name *);
- ⓪"BakName := Name;
- ⓪"Pfad := PName; DeleteTail (Pfad);
- ⓪"FastStrings.Append (BakName, Pfad);
- ⓪
- ⓪"(* Alte Datei in .OLD umbenennen *)
- ⓪"IF (MakeBAK IN Puff^.Modus) THEN
- ⓪$FileNames.ConcatName (Pfad, 'OLD', BakName);
- ⓪$ok := Delete (BakName);
- ⓪$Rename (Pfad, BakName);
- ⓪"END (* IF ~MakeBAK *);
- ⓪"
- ⓪"(* Neue Datei anlegen: *)
- ⓪"
- ⓪"MausBusy;
- ⓪"
- ⓪"Create (Pfad, 0, filehandle);
- ⓪"IF filehandle < 0 THEN
- ⓪$Nachricht ('Fehler beim Erzeugen der .GME-Datei');
- ⓪$RETURN;
- ⓪"END (* IF Handle ungueltig *);
- ⓪"
- ⓪"(* Deskriptor-Record schreiben: *)
- ⓪"
- ⓪"LSIZE := PuffRecSize;
- ⓪"Write (filehandle, LSIZE, Puff);
- ⓪"
- ⓪"(* Merkinfo der festen Merkpunkte speichern: *)
- ⓪"
- ⓪"FOR mind := ErsteZeile TO LetztePosition DO
- ⓪$WITH Puff^.MerkPunkte [mind] DO
- ⓪&IF merkinfo # NIL THEN
- ⓪(WriteInfo (merkinfo);
- ⓪&END (* IF *);
- ⓪$END (* WITH *);
- ⓪"END (* FOR *);
- ⓪
- ⓪ (*
- ⓪"(* Merkpunktlisten speichern: *)
- ⓪"
- ⓪"FOR mind := ErsteZeile TO LetztePosition DO
- ⓪$IF mind IN listen THEN
- ⓪&WITH Puff^ DO
- ⓪(SaveMerkpunktListe (MerkPunkte [mind]);
- ⓪&END (* WITH *);
- ⓪$END (* IF mind IN listen *);
- ⓪"END (* FOR *);
- ⓪ *)
- ⓪"
- ⓪"(* Datei schliessen: *)
- ⓪"
- ⓪"ok := Close (filehandle);
- ⓪"MausEin; CursorEin;
- ⓪ END SaveConfig;
- ⓪
- ⓪
- ⓪ PROCEDURE TextVorhanden (Name: ARRAY OF CHAR): BOOLEAN;
- ⓪ VAR h: INTEGER;
- ⓪(ok: BOOLEAN;
- ⓪ BEGIN
- ⓪"Open (Name, ORD (read), h);
- ⓪"IF h >= 0 THEN
- ⓪$ok := Close (h); RETURN TRUE;
- ⓪"ELSE RETURN FALSE;
- ⓪"END (* IF *);
- ⓪ END TextVorhanden;
- ⓪
- ⓪ PROCEDURE TextLoeschen (Name: ARRAY OF CHAR);
- ⓪ VAR ok: BOOLEAN;
- ⓪ BEGIN
- ⓪"ok := Delete (Name);
- ⓪ END TextLoeschen;
- ⓪
- ⓪ PROCEDURE ReInit (Puff: einPufferPointer);
- ⓪ (* Initialisiere Puffer nach LoadConfig, ohne ??? *)
- ⓪ VAR merkindex: MerkIndex;
- ⓪ BEGIN
- ⓪"WITH Puff^ DO
- ⓪$ZeilenAnzahl := 1; (* da sie durch Laden inkrementiert wird! *)
- ⓪$MerkPunkte [LaufendeZeile].zeilpos := 1;
- ⓪$AllocLine (Puffer, 0);
- ⓪$IF Puffer = NIL THEN RETURN; END;
- ⓪$WITH Puffer^ DO
- ⓪&AllocLine (naechste, 0);
- ⓪&naechste^.vorige := Puffer;
- ⓪$END (* WITH *);
- ⓪"END (* WITH *);
- ⓪"FOR merkindex := ErsteZeile TO LaufendeZeile DO
- ⓪$WITH Puff^.MerkPunkte [merkindex] DO
- ⓪&merkline := Puff^.Puffer^.naechste;
- ⓪$END (* WITH *);
- ⓪"END (* FOR *);
- ⓪ END ReInit;
- ⓪
- ⓪ VAR expandBlankCompr: BOOLEAN;
- ⓪
- ⓪ CONST DLE = 20C;
- ⓪&ctrlZ = CHR (26);
- ⓪
- ⓪(
- ⓪"PROCEDURE LiesPuffer (VAR index, ende: LONGCARD; texthandle: INTEGER);
- ⓪"(* Diese Routine liest möglichst schnell einen Textblock aus der Datei
- ⓪%"texthandle" in den internen Puffer (puffer). Dabei wird festgehalten,
- ⓪%wo das Ende des gültigen Textinhaltes steht (globaler Parameter ende).
- ⓪%"index" wird wieder auf Null gesetzt, außer es war vorher schon Null,
- ⓪%dann auf 1. Dann ist nämlich index > ende, was das Ende des Textes
- ⓪%bedeutet.
- ⓪#*)
- ⓪%
- ⓪"BEGIN
- ⓪$(*Trace ('LiesPuffer');*)
- ⓪$index := VAL (LONGCARD, cpuffer) + 1L; (* versuche, ganzen Block zu les. *)
- ⓪$Read (texthandle, index, ADDRESS (puffer)); (* wird i. d. R. cpuffer + 1 *)
- ⓪$(*Trace ('Read fertig');*)
- ⓪$ende := index;
- ⓪$(* Anzahl gelesener Zeichen, im Fehlerfall eigentlich negative LONGINT *)
- ⓪$IF (ende > (*VAL (LONGCARD, 0)*) 0L) THEN
- ⓪&(*Trace ('ende > 0');*)
- ⓪&index := (*VAL (LONGCARD, 0)*) 0L; DEC (ende); (* Da 0-based, ist der gueltige Index
- ⓪Adie Anzahl Zeichen - 1 *)
- ⓪>(* Index auf 0, um Puffer vom Anfang aus-
- ⓪Azulesen *)
- ⓪$ELSE index := 1; (* index > ende! *)
- ⓪$END (* IF *);
- ⓪$(*Trace ('LiesPuffer fertig');*)
- ⓪"END LiesPuffer;
- ⓪
- ⓪ PROCEDURE FastLen ( texthandle: INTEGER;
- ⓪3VAR index, ende: LONGCARD; TabWeite: CARDINAL;
- ⓪3VAR blanks, len, endindex: CARDINAL;
- ⓪3VAR zeilenende, dateiende: BOOLEAN): BOOLEAN;
- ⓪ (* Diese Funktion ermittelt die effektive Länge einer Zeile im Puffer.
- ⓪#Sie startet ab der globalen Variablen index und liefert den endindex
- ⓪#in Puffer. "len" ist die expandierte Länge, dh. die Länge der zu
- ⓪#kopierenden Zeile, wenn Tabs und DLE expandiert werden. Die Funktion
- ⓪#liefert TRUE, wenn Zeile ungültige Daten enthält
- ⓪!*)
- ⓪ VAR end: CARDINAL;
- ⓪&error, first, fertig: BOOLEAN;
- ⓪ BEGIN
- ⓪"(*
- ⓪$endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);
- ⓪$len := 0; blanks := 0;
- ⓪$zeilenende := FALSE; fertig := FALSE;
- ⓪$IF dateiende OR (endindex > end) THEN RETURN FALSE; END;
- ⓪$error:= FALSE;
- ⓪$first:= TRUE;
- ⓪$REPEAT
- ⓪&CASE puffer^ [endindex] OF
- ⓪((* DLE darf nur am Zeilenanfang stehen... *)
- ⓪(DLE: IF NOT first THEN
- ⓪2error:= TRUE;
- ⓪2fertig := TRUE;
- ⓪2zeilenende := TRUE;
- ⓪0INC (endindex); (* Skip DLE *) INC (index);
- ⓪0IF (endindex > end) THEN
- ⓪2LiesPuffer (index, ende, texthandle);
- ⓪2endindex := VAL (CARDINAL, index);
- ⓪2end := VAL (CARDINAL, ende);
- ⓪0END (* IF *);
- ⓪0IF (ORD (puffer^[endindex]) >= ORD (' ')) THEN
- ⓪2blanks := ORD (puffer^[endindex]) - ORD (' ');
- ⓪0ELSE
- ⓪2error:= TRUE;
- ⓪0END (* IF *);
- ⓪0INC (index);
- ⓪(|
- ⓪(lf: INC (index); (* Skip Linefeed *);
- ⓪(|
- ⓪(tab: INC (len,
- ⓪2TabWeite * ((len + blanks) DIV TabWeite + 1)
- ⓪3- len);
- ⓪(|
- ⓪(cr: fertig := TRUE;
- ⓪0zeilenende := TRUE;
- ⓪(|
- ⓪(ctrlZ: dateiende:= TRUE; fertig:= TRUE
- ⓪(|
- ⓪(ELSE INC (len);
- ⓪&END (* CASE *);
- ⓪&first:= FALSE;
- ⓪&INC (endindex); IF endindex > end THEN fertig := TRUE; END;
- ⓪$UNTIL fertig;
- ⓪ *)
- ⓪"ASSEMBLER
- ⓪&; endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);
- ⓪&MOVE.L index(A6),A0
- ⓪&MOVE.L endindex(A6),A1
- ⓪&MOVE.L (A0),D1
- ⓪&MOVE D1,(A1)
- ⓪&MOVE.L ende(A6),A0
- ⓪&MOVE.L (A0),D2
- ⓪&MOVE D2,end(A6)
- ⓪&; len := 0; blanks := 0;
- ⓪&MOVE.L len(A6),A0
- ⓪&CLR (A0)
- ⓪&MOVE.L blanks(A6),A0
- ⓪&CLR (A0)
- ⓪&; zeilenende := FALSE; fertig := FALSE; first:= TRUE; error:= FALSE;
- ⓪&MOVE.L zeilenende(A6),A0
- ⓪&CLR (A0)
- ⓪&CLR first(A6)
- ⓪&CLR error(A6)
- ⓪&; IF dateiende OR (endindex > end) THEN RETURN FALSE; END;
- ⓪&MOVE.L dateiende(A6),A0
- ⓪&TST (A0)
- ⓪&BNE.W endRepeat
- ⓪&CMP.L D2,D1
- ⓪&BLS repeat
- ⓪&BRA.W endRepeat
- ⓪
- ⓪&; REPEAT
- ⓪$repeat:
- ⓪&; CASE puffer^ [endindex] OF
- ⓪&MOVE.L endindex(A6),A1
- ⓪&MOVE (A1),D1
- ⓪&MOVE.L puffer,A0
- ⓪&MOVE.B 0(A0,D1.W),D0
- ⓪
- ⓪&CMPI.B #DLE,D0
- ⓪&BNE noDLE
- ⓪
- ⓪&; IF ~first THEN <ende> END;
- ⓪&; INC (endindex); INC (index);
- ⓪&; IF (endindex > end) THEN
- ⓪&; LiesPuffer (index, ende, texthandle);
- ⓪&; endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);
- ⓪&; END (* IF *);
- ⓪&; blanks:= ORD (puffer^[endindex]) - ORD (' ');
- ⓪&; INC (index);
- ⓪&TAS first(A6)
- ⓪&BPL isfirst
- ⓪$isnotext:
- ⓪&; Garbage im File!
- ⓪&MOVE #1,error(A6)
- ⓪&BRA.W endOfLine
- ⓪$isfirst:
- ⓪&ADDQ #1,D1 ; endindex
- ⓪&MOVE D1,(A1)
- ⓪&MOVE.L index(A6),A0
- ⓪&ADDQ.L #1,(A0)
- ⓪&MOVE end(A6),D0
- ⓪&CMP D0,D1
- ⓪&BLS not1
- ⓪&END;
- ⓪(LiesPuffer (index, ende, texthandle);
- ⓪&ASSEMBLER
- ⓪&MOVE.L index(A6),A0
- ⓪&MOVE.L endindex(A6),A1
- ⓪&MOVE.L (A0),D1
- ⓪&MOVE D1,(A1)
- ⓪&MOVE.L ende(A6),A0
- ⓪&MOVE.L (A0),D2
- ⓪&MOVE D2,end(A6)
- ⓪$not1:
- ⓪&MOVE.L puffer,A0
- ⓪&MOVE.L endindex(A6),A1
- ⓪&MOVE (A1),D1
- ⓪&MOVEQ #0,D0
- ⓪&MOVE.B 0(A0,D1.W),D0
- ⓪&SUBI.B #' ',D0
- ⓪&BCS isnotext
- ⓪&MOVE.L blanks(A6),A0
- ⓪&MOVE D0,(A0)
- ⓪&MOVE.L index(A6),A0
- ⓪&ADDQ.L #1,(A0)
- ⓪&BRA.W endCase
- ⓪
- ⓪$noDLE:
- ⓪&; lf: INC (index); (* Skip Linefeed *);
- ⓪&CMPI.B #lf,D0
- ⓪&BNE noLF
- ⓪&MOVE.L index(A6),A0
- ⓪&ADDQ.L #1,(A0)
- ⓪&BRA.W endCase
- ⓪
- ⓪$noLF:
- ⓪&; tab: INC (len, TabWeite * ((len + blanks) DIV TabWeite + 1) - len);
- ⓪&CMPI.B #tab,D0
- ⓪&BNE noTAB
- ⓪&MOVE TabWeite(A6),D1
- ⓪&MOVE D1,D2
- ⓪&ADDQ #1,D2
- ⓪&MOVE.L len(A6),A0
- ⓪&MOVE.W (A0),D0
- ⓪&MOVE.L blanks(A6),A0
- ⓪&ADD (A0),D0
- ⓪&MULU D1,D0
- ⓪&DIVU D2,D0
- ⓪&MOVE.L len(A6),A0
- ⓪&SUB (A0),D0
- ⓪&ADD D0,(A0)
- ⓪&BRA endCase
- ⓪
- ⓪$noTAB:
- ⓪&; cr: fertig := TRUE; zeilenende := TRUE;
- ⓪&CMPI.B #cr,D0
- ⓪&BNE noCR
- ⓪
- ⓪$endOfLine
- ⓪&MOVE.L zeilenende(A6),A0
- ⓪&MOVE #1,(A0)
- ⓪&MOVE.L endindex(A6),A0
- ⓪&ADDQ #1,(A0)
- ⓪&BRA endRepeat
- ⓪
- ⓪$noCR:
- ⓪&CMPI.B #ctrlZ,D0
- ⓪&BNE noEOF
- ⓪&
- ⓪&MOVE.L dateiende(A6),A0
- ⓪&MOVE #1,(A0)
- ⓪&BRA endRepeat
- ⓪&
- ⓪$noEOF:
- ⓪&MOVE.L len(A6),A0
- ⓪&ADDQ #1,(A0)
- ⓪
- ⓪$endCase:
- ⓪&; INC (endindex); IF endindex > end THEN fertig := TRUE; END;
- ⓪&MOVE.L endindex(A6),A0
- ⓪&ADDQ #1,(A0)
- ⓪&MOVE (A0),D0
- ⓪&MOVE end(A6),D1
- ⓪&CMP D1,D0
- ⓪&BHI endRepeat
- ⓪
- ⓪&; UNTIL fertig;
- ⓪&BRA repeat
- ⓪
- ⓪$endRepeat:
- ⓪"END;
- ⓪"RETURN error
- ⓪ END FastLen;
- ⓪
- ⓪ PROCEDURE FastCopyExpand (VAR index, ende: LONGCARD; texthandle: INTEGER;
- ⓪:TabWeite: CARDINAL;
- ⓪:blanks, laenge, end: CARDINAL; VAR z: ARRAY OF CHAR);
- ⓪ (* Kopiert Zeile oder Zeilenteil von
- ⓪#start..end aus puffer^ in Zielstring. Expandiert Tab-Codes.
- ⓪ *)
- ⓪ VAR ztab: CARDINAL;
- ⓪&start, zindex: CARDINAL;
- ⓪ BEGIN
- ⓪ (*
- ⓪$zindex := 0;
- ⓪$start := VAL (CARDINAL, index); laenge := laenge + blanks;
- ⓪
- ⓪$(* !JL 11. 12. 90 *)
- ⓪$IF laenge > HIGH (z) THEN
- ⓪&Nachricht ('Sourcezeile ist zu lang!');
- ⓪&laenge := HIGH (z);
- ⓪$END (* IF *);
- ⓪$
- ⓪$WHILE blanks > zindex DO
- ⓪&z [zindex] := ' '; INC (zindex);
- ⓪$END (* WHILE *);
- ⓪$WHILE zindex < laenge DO
- ⓪&CASE puffer^[start] OF
- ⓪(tab: ztab := TabWeite * (zindex DIV TabWeite + 1);
- ⓪0WHILE (zindex < ztab) DO
- ⓪2z [zindex] := ' '; INC (zindex);
- ⓪0END (* WHILE *);
- ⓪(|
- ⓪(ELSE z [zindex] := puffer^[start]; INC (zindex);
- ⓪&END (* CASE *);
- ⓪&INC (start);
- ⓪$END (* WHILE *);
- ⓪$z [zindex] := nul;
- ⓪$index := VAL (LONGCARD, end);
- ⓪$IF index > ende THEN
- ⓪&LiesPuffer (index, ende, texthandle);
- ⓪$END;
- ⓪ *)
- ⓪"ASSEMBLER
- ⓪&; zindex := 0;
- ⓪&; start := VAL (CARDINAL, index); laenge := laenge + blanks;
- ⓪&MOVE.L index(A6),A0
- ⓪&MOVE.L (A0),D0
- ⓪&MOVE D0,start(A6)
- ⓪&MOVE blanks(A6),D0
- ⓪&ADD D0,laenge(A6)
- ⓪&
- ⓪&; IF laenge > HIGH (z) THEN
- ⓪&; Nachricht ('Sourcezeile ist zu lang!');
- ⓪&; laenge := HIGH (z);
- ⓪&; END;
- ⓪&MOVE.W laenge(A6),D1
- ⓪&CMP.W z+4(A6),D1
- ⓪&BLS nope
- ⓪&MOVE.W z+4(A6),laenge(A6)
- ⓪&END;
- ⓪(Nachricht ('Sourcezeile ist zu lang!');
- ⓪&ASSEMBLER
- ⓪$nope:
- ⓪&
- ⓪&; WHILE blanks > zindex DO z [zindex] := ' '; INC (zindex); END
- ⓪&MOVE blanks(A6),D0
- ⓪&MOVEQ #0,D1
- ⓪&MOVE.L z(A6),A2
- ⓪$while1:
- ⓪&CMP D1,D0
- ⓪&BLS endWhile1
- ⓪&MOVE.B #' ',(A2)+
- ⓪&ADDQ #1,D1
- ⓪&BRA while1
- ⓪$endWhile1:
- ⓪
- ⓪$while2:
- ⓪&; WHILE zindex < laenge DO
- ⓪&MOVE laenge(A6),D0
- ⓪&CMP D1,D0
- ⓪&BLS.W endWhile2
- ⓪&; CASE puffer^[start] OF
- ⓪&MOVE.L puffer,A0
- ⓪&MOVE start(A6),D0
- ⓪&MOVE.B 0(A0,D0.W),D0
- ⓪&; tab: ztab := TabWeite * (zindex DIV TabWeite + 1);
- ⓪&; WHILE (zindex < ztab) DO z [zindex] := ' '; INC (zindex); END
- ⓪&CMPI.B #tab,D0
- ⓪&BNE noTAB
- ⓪&MOVE TabWeite(A6),D0
- ⓪&ADDQ #1,D0
- ⓪&MOVEQ #0,D2
- ⓪&MOVE D1,D2
- ⓪&DIVU D0,D2
- ⓪&MULU TabWeite(A6),D2
- ⓪$while3:
- ⓪&CMP D1,D2
- ⓪&BLS endWhile3
- ⓪&MOVE.B #' ',(A2)+
- ⓪&ADDQ #1,D1
- ⓪&BRA while3
- ⓪$endWhile3:
- ⓪&BRA endCase
- ⓪
- ⓪$noTAB:
- ⓪&; ELSE z [zindex] := puffer^[start]; INC (zindex);
- ⓪&MOVE.B D0,(A2)+
- ⓪&ADDQ #1,D1
- ⓪
- ⓪$endCase:
- ⓪&; END (* CASE *);
- ⓪&; INC (start);
- ⓪&ADDQ #1,start(A6)
- ⓪&BRA while2
- ⓪
- ⓪$endWhile2:
- ⓪&; z [zindex] := nul;
- ⓪&CLR.B (A2)+
- ⓪>; MOVE.L zindex(A6),A0
- ⓪>; MOVE D1,(A0)
- ⓪&; index := VAL (LONGCARD, end);
- ⓪&MOVEQ #0,D0
- ⓪&MOVE end(A6),D0
- ⓪&MOVE.L index(A6),A0
- ⓪&MOVE.L D0,(A0)
- ⓪&; IF index > ende THEN
- ⓪&; LiesPuffer (index, ende, texthandle);
- ⓪&; END;
- ⓪&MOVE.L ende(A6),A0
- ⓪&CMP.L (A0),D0
- ⓪&BLS noLies
- ⓪&END;
- ⓪(LiesPuffer (index, ende, texthandle);
- ⓪&ASSEMBLER
- ⓪$noLies:
- ⓪"END (* Assembler *)
- ⓪ END FastCopyExpand;
- ⓪!
- ⓪ PROCEDURE TextLesen (Puff: einPufferPointer; initialisiere: BOOLEAN;
- ⓪5frage, loadconfig, message: BOOLEAN);
- ⓪ (* Stellt yoffset auf 0 *)
- ⓪
- ⓪ VAR z, z2: eineZeile;
- ⓪(indent: Moden; (* Menge der Zustaende von Puff *)
- ⓪(Info: eineInfo;
- ⓪(pf, na: eineInfo;
- ⓪(dummys: eineInfo;
- ⓪!
- ⓪(index, ende: LONGCARD;
- ⓪(zindex: CARDINAL;
- ⓪(ok: BOOLEAN;
- ⓪(texthandle: INTEGER;
- ⓪(dummy, dum: CHAR;
- ⓪(button: INTEGER;
- ⓪(nulldeleted: BOOLEAN;
- ⓪(tabsgefiltert: BOOLEAN;
- ⓪(tabsfiltern: BOOLEAN;
- ⓪(dot: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
- ⓪(
- ⓪(zlaenge, endindex,
- ⓪(blanks: CARDINAL;
- ⓪(dateiende: BOOLEAN;
- ⓪(zeilenende: BOOLEAN; (* Zeilenende steht im Puffer *)
- ⓪
- ⓪ VAR PName: eineInfo;
- ⓪(AlteZeilenNummer: CARDINAL;
- ⓪(erstezeilpos, erstecharpos, laufendezeilpos,
- ⓪(laufendecharpos: CARDINAL;
- ⓪(nextpuff: einPufferPointer;
- ⓪(helpline: einLinePointer;
- ⓪(OldPfad: eineInfo;
- ⓪(Message: ARRAY [0..60] OF CHAR;
- ⓪(dname: eineInfo;
- ⓪(suff: ARRAY [0..3] OF CHAR;
- ⓪(h: CARDINAL;
- ⓪(timeptr: ADDRESS;
- ⓪
- ⓪ PROCEDURE keinTextNachricht;
- ⓪"BEGIN
- ⓪$Nachricht ('Dies ist kein Text!');
- ⓪"END keinTextNachricht;
- ⓪
- ⓪ BEGIN (* TextLesen *)
- ⓪"nulldeleted := FALSE; tabsgefiltert := FALSE;
- ⓪"tabsfiltern := (* TabFiltern IN Puff^.Modus; *) TRUE;
- ⓪"expandBlankCompr := TRUE; (*DLECompr IN Puff^.Modus; *)
- ⓪"IF message THEN CursorAus; END;
- ⓪"REPEAT
- ⓪$IF message THEN
- ⓪&LoescheBild;
- ⓪&SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);
- ⓪&GotoXY (0, 0);
- ⓪$END (* IF message *);
- ⓪$IF (Editiert IN Puff^.Modus) & initialisiere THEN
- ⓪&IF ~FrageJaNein (Ja, 'Puffer wurde editiert|Überschreiben?')
- ⓪&THEN RETURN END;
- ⓪&LoescheBild;
- ⓪$END (* IF Puffer nicht leer *);
- ⓪$IF Puff^.Pfad [0] = nul THEN
- ⓪&SplitFileName (GlobalPfad, Puff^.Pfad, dname, suff);
- ⓪&IF suff [0] = nul THEN Append ('*.*', Puff^.Pfad, ok);
- ⓪&ELSE Append ('*.', Puff^.Pfad, ok); FastStrings.Append (suff, Puff^.Pfad);
- ⓪&END (* IF suff *);
- ⓪$END (* IF *);
- ⓪$Info := Puff^.Pfad; DeleteTail (Info);
- ⓪$FastStrings.Append (Puff^.Name, Info);
- ⓪$IF message THEN
- ⓪&HighLight; WriteConst (version); Normal; WriteLn; WriteLn;
- ⓪&IF initialisiere THEN Message := 'File lesen';
- ⓪&ELSE Message := 'Block lesen';
- ⓪&END;
- ⓪&HighLight; WriteConst (Info); Normal;
- ⓪&WriteLn;
- ⓪&WriteLn;
- ⓪$END (* IF message *);
- ⓪$IF frage THEN
- ⓪&PName := Puff^.Name;
- ⓪&GetDirectory (Puff^.Pfad, Puff^.Name, Message, button, FALSE);
- ⓪&IF button # 1 THEN
- ⓪(IF ~initialisiere THEN
- ⓪*Puff^.Name := PName;
- ⓪(ELSE Puff^.Name [0] := nul;
- ⓪(END;
- ⓪(RETURN;
- ⓪&END;
- ⓪&GlobalPfad := Puff^.Pfad;
- ⓪&MausEin;
- ⓪&Info := Puff^.Pfad; DeleteTail (Info);
- ⓪&FastStrings.Append (Puff^.Name, Info);
- ⓪$ELSE MausEin;
- ⓪$END (* IF frage *);
- ⓪$Paths.SearchFile (Info, ShellMsg.SrcPaths, Paths.fromStart, ok, Info);
- ⓪$IF ok THEN FileNames.SplitPath (Info, Puff^.Pfad, Puff^.Name); END;
- ⓪$Open (Info, ORD (read), texthandle);
- ⓪$frage := TRUE;
- ⓪"UNTIL (texthandle >= 0);
- ⓪"IF texthandle >= 0 THEN
- ⓪$WITH Puff^ DO
- ⓪'pf := Pfad; na := Name;
- ⓪'IF initialisiere THEN
- ⓪)Loeschen (Puff);
- ⓪)Pfad := pf; Name := na;
- ⓪'END (* IF *);
- ⓪'indent := Modus;
- ⓪'EXCL (Modus, AutoIndent);
- ⓪'dateiende:= FALSE;
- ⓪'index := 0; ende := 0;
- ⓪
- ⓪ (****************************** Abspeichern von *.GME ***********************)
- ⓪'IF loadconfig THEN
- ⓪)nextpuff := NaechsterPuffer;
- ⓪)LoadConfig (Puff, FALSE, message);
- ⓪)(* Änderung 10. 6. 89: *)
- ⓪)loadconfig := KonfigSpeichern IN Modus;
- ⓪)(* ******************* *)
- ⓪)indent := Modus;
- ⓪)Pfad := pf; Name := na;
- ⓪)erstezeilpos := MerkPunkte [ErsteZeile].zeilpos;
- ⓪)erstecharpos := MerkPunkte [ErsteZeile].charpos;
- ⓪)laufendezeilpos := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪)laufendecharpos := MerkPunkte [LaufendeZeile].charpos;
- ⓪)ReInit (Puff);
- ⓪'END (* IF loadconfig *);
- ⓪
- ⓪'IF message THEN
- ⓪)WriteConst ('Text laden');
- ⓪'END;
- ⓪'IF puffer = NIL THEN
- ⓪)Nachricht ('Speicher reicht|nicht für Puffer');
- ⓪)RETURN;
- ⓪'END (* IF *);
- ⓪'LiesPuffer (index, ende, texthandle);
- ⓪'IF FastLen (texthandle, index, ende, TabWeite,
- ⓪,blanks, zlaenge, endindex, zeilenende, dateiende) THEN
- ⓪)keinTextNachricht; RETURN;
- ⓪'END;
- ⓪'FastCopyExpand (index, ende, texthandle, TabWeite, blanks, zlaenge, endindex, z);
- ⓪'IF ~zeilenende THEN
- ⓪)IF FastLen (texthandle, index, ende, TabWeite,
- ⓪0blanks, zlaenge, endindex, zeilenende, dateiende) THEN
- ⓪+keinTextNachricht; RETURN;
- ⓪)END;
- ⓪)FastCopyExpand (index, ende, texthandle, TabWeite,
- ⓪9blanks, zlaenge, endindex, z2);
- ⓪)FastStrings.Append (z2, z);
- ⓪'END;
- ⓪'(* *)
- ⓪'IF initialisiere THEN
- ⓪)PutLine (MerkPunkte [LaufendeZeile].merkline, z);
- ⓪'ELSE
- ⓪)LineUp (Puff);
- ⓪)InsertLine (Puff, z, FALSE, FALSE, ~initialisiere);
- ⓪'END (* IF *);
- ⓪'IF message THEN
- ⓪)GotoXY (38, 12); HighLight; (* CursorAus; *)
- ⓪)WriteConst (' 0'); MausBusy;
- ⓪'END;
- ⓪'AlteZeilenNummer := 1;
- ⓪'z:= '';
- ⓪'LOOP
- ⓪)IF index > ende THEN
- ⓪+(*Nachricht ('EXIT 1');*)
- ⓪+EXIT
- ⓪)END;
- ⓪)IF FastLen (texthandle, index, ende, TabWeite,
- ⓪1blanks, zlaenge, endindex, zeilenende, dateiende) THEN
- ⓪+keinTextNachricht; EXIT;
- ⓪)END;
- ⓪)(* *)
- ⓪)WITH MerkPunkte [LaufendeZeile] DO
- ⓪+WITH merkline^ DO
- ⓪
- ⓪ (********** INLINE-Code fuer einen Sonderfall von InsertLine **********)
- ⓪(
- ⓪-IF initialisiere & zeilenende THEN
- ⓪/NEW (helpline);
- ⓪/IF helpline # NIL THEN
- ⓪1helpline^.terminator [0] := nul;
- ⓪1zindex := zlaenge + blanks;
- ⓪1IF zindex > 0 THEN
- ⓪3WITH helpline^ DO
- ⓪5laenge := (zindex DIV cgrain + 1) * cgrain;
- ⓪!
- ⓪5ALLOCATE (ZeilPointer, VAL (LONGCARD, laenge));
- ⓪5IF ZeilPointer = NIL THEN
- ⓪7DISPOSE (helpline);
- ⓪7Nachricht ('Speicher reicht nicht 1');
- ⓪7EXIT;
- ⓪5ELSE
- ⓪7FastCopyExpand (index, ende, texthandle, TabWeite,
- ⓪Gblanks, zlaenge, endindex, ZeilPointer^);
- ⓪7(* *)
- ⓪7INC (zeilpos); INC (ZeilenAnzahl);
- ⓪5END (* IF noch Speicher *);
- ⓪3END (* WITH *);
- ⓪1ELSE
- ⓪3WITH helpline^ DO
- ⓪5ZeilPointer := ADR (terminator);
- ⓪5laenge := 0;
- ⓪3END (* WITH *);
- ⓪3INC (zeilpos); INC (ZeilenAnzahl);
- ⓪
- ⓪3(* Pufferindex weiterschalten!!! *)
- ⓪3FastCopyExpand (index, ende, texthandle, TabWeite,
- ⓪Cblanks, zlaenge, endindex, z2);
- ⓪3(* Dummy-Aufruf zur Zeilenweiterschaltung *)
- ⓪,
- ⓪1END;
- ⓪1IF zeilpos > AlteZeilenNummer THEN
- ⓪3helpline^.vorige := merkline;
- ⓪3helpline^.naechste := NIL;
- ⓪3naechste := helpline;
- ⓪3merkline := helpline;
- ⓪1END (* IF *);
- ⓪/ELSE Nachricht ('Speicher reicht nicht 2');
- ⓪4EXIT;
- ⓪/END (* IF # NIL *);
- ⓪
- ⓪ (********** INLINE-Code fuer einen Sonderfall von InsertLine **********)
- ⓪
- ⓪-ELSE
- ⓪/(* *)
- ⓪/FastCopyExpand (index, ende, texthandle, TabWeite,
- ⓪?blanks, zlaenge, endindex, z);
- ⓪/IF ~zeilenende THEN
- ⓪1IF FastLen (texthandle, index, ende, TabWeite,
- ⓪5blanks, zlaenge, endindex, zeilenende, dateiende) THEN
- ⓪3keinTextNachricht; EXIT;
- ⓪1END;
- ⓪1FastCopyExpand (index, ende, texthandle, TabWeite,
- ⓪Ablanks, zlaenge, endindex, z2);
- ⓪1FastStrings.Append (z2, z);
- ⓪/END;
- ⓪
- ⓪/IF zeilenende OR dateiende OR (index > ende) THEN
- ⓪1InsertLine (Puff, z, FALSE, FALSE, ~initialisiere);
- ⓪/ELSE (* Textende *)
- ⓪1(*Nachricht ('EXIT 2');*)
- ⓪1EXIT;
- ⓪/END (* IF *);
- ⓪/IF dateiende THEN EXIT END;
- ⓪-END (* IF initialisiere *);
- ⓪-IF zeilpos > AlteZeilenNummer THEN
- ⓪/AlteZeilenNummer := zeilpos
- ⓪-ELSE
- ⓪/Nachricht ('Speicher reicht nicht! 3');
- ⓪/EXIT;
- ⓪-END (* IF ZeilenNummer *);
- ⓪+END (* WITH merkline^ *);
- ⓪)END (* WITH *);
- ⓪)IF message & (ZeilenAnzahl MOD 50 = 0) THEN
- ⓪+CursorAus; MausAus; GotoXY (38, 12);
- ⓪+ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 4, dummys);
- ⓪+WriteConst (dummys); MausBusy;
- ⓪)END (* IF *);
- ⓪'END (* LOOP *);
- ⓪'IF message THEN Normal; END;
- ⓪'(*GetDateTime (texthandle, fullDate, fullTime);
- ⓪'datum:= Clock.PackDate (fullDate);
- ⓪'tageszeit:= Clock.PackTime (fullTime)
- ⓪'*)
- ⓪'timeptr := ADR (tageszeit);
- ⓪'DaTime (texthandle, timeptr, getTime);
- ⓪'
- ⓪'ok := Close (texthandle);
- ⓪'Modus := indent;
- ⓪$END (* WITH *);
- ⓪$IF nulldeleted & message THEN
- ⓪&Nachricht ('Null-Characters ausgefiltert!');
- ⓪$END (* IF *);
- ⓪$IF tabsgefiltert & message THEN
- ⓪&Nachricht ('Tab-Zeichen ausgefiltert!');
- ⓪$END (* IF *);
- ⓪"ELSE LoescheBild; HighLight;
- ⓪'Assign ('Datei "', dummys, ok); FastStrings.Append (Info, dummys);
- ⓪'Append ('"|nicht vorhanden!', dummys, ok);
- ⓪'Nachricht (dummys);
- ⓪'Info := "Neue Datei: ";
- ⓪"END (* IF File *);
- ⓪"IF initialisiere THEN
- ⓪$WITH Puff^ DO (* Nach Lesen wieder auf Anfang einstellen *)
- ⓪$
- ⓪&IF loadconfig THEN (* wenn oben auskommentiert... *)
- ⓪((* WriteConst ('restaurieren'); *)
- ⓪(NaechsterPuffer := nextpuff;
- ⓪(MerkPunkte [ErsteZeile].zeilpos := erstezeilpos;
- ⓪(MerkPunkte [ErsteZeile].charpos := erstecharpos;
- ⓪(MerkPunkte [LaufendeZeile].zeilpos := laufendezeilpos;
- ⓪(MerkPunkte [LaufendeZeile].charpos := laufendecharpos;
- ⓪((* ReAdjustMerkpointer (Puff); *)
- ⓪
- ⓪(StelleZeileEin (Puff, laufendezeilpos, laufendezeilpos - erstezeilpos);
- ⓪&ELSE
- ⓪(MerkPunkte [ErsteZeile].zeilpos := 0;
- ⓪(MerkPunkte [LaufendeZeile].charpos := 0;
- ⓪(MerkPunkte [LaufendeZeile].zeilpos := 1;
- ⓪(MerkPunkte [LaufendeZeile].merkline := Puffer^.naechste;
- ⓪(MerkPunkte [ErsteZeile].merkline := Puffer^.naechste;
- ⓪&END (* IF loadconfig *);
- ⓪&
- ⓪$END (* WITH *);
- ⓪"ELSE StelleZeileEin (Puff, Puff^.MerkPunkte [LaufendeZeile].zeilpos,
- ⓪7LinesOnScreen DIV 2);
- ⓪"END (* IF *);
- ⓪"WITH Puff^ DO
- ⓪$EXCL (Modus, Exit); EXCL (Modus, Editiert); EXCL (Modus, BlockIstMarkiert);
- ⓪$EXCL (Modus, Compiliert);
- ⓪$MerkPunkte [CompilerInfo].charpos := 0;
- ⓪$MerkPunkte [CompilerInfo].zeilpos := 1;
- ⓪$MerkPunkte [CompilerInfo].merkline := Puffer^.naechste;
- ⓪"END (* WITH *);
- ⓪"Trace ('TextLesen fertig');
- ⓪ END TextLesen;
- ⓪
- ⓪ PROCEDURE TextSchreiben (Puff: einPufferPointer; backup, markiert,
- ⓪9frage, saveconfig, controlfil: BOOLEAN;
- ⓪9VAR erfolgreich: BOOLEAN);
- ⓪ (* 'erfolgreich' ist auch TRUE, wenn "Abbruch" beim Selektor gewählt wurde! *)
- ⓪ VAR Help: einLinePointer;
- ⓪(i: CARDINAL;
- ⓪(Info: eineInfo;
- ⓪(BakName: eineInfo;
- ⓪(oldPfad, oldName: eineInfo;
- ⓪
- ⓪(index: LONGCARD;
- ⓪(ok: BOOLEAN;
- ⓪(texthandle: INTEGER;
- ⓪(rest: eineZeile;
- ⓪(ende: BOOLEAN;
- ⓪(button: INTEGER;
- ⓪
- ⓪"PROCEDURE SchreibPuffer (texthandle: INTEGER): BOOLEAN;
- ⓪"VAR count: LONGCARD;
- ⓪(ok: BOOLEAN;
- ⓪"BEGIN
- ⓪$(* GEMDOS-Funktion 40H, D0 = Resultat (LONGINT) *)
- ⓪$count := index;
- ⓪$Write (texthandle, count, ADDRESS (puffer));
- ⓪$ok := count = index;
- ⓪$(* count sollte negative LONGINT sein, wenn Fehlermeldung,
- ⓪'sonst Echo der geschriebenen Anzahl *)
- ⓪$index := VAL (LONGCARD, 0); (* Puffer wieder vom Anfang her beschreiben *)
- ⓪$RETURN ok;
- ⓪"END SchreibPuffer;
- ⓪!
- ⓪"PROCEDURE SchreibZeile (texthandle: INTEGER; REF z: ARRAY OF CHAR;
- ⓪:keinZeilenEndeAnfuegen: BOOLEAN; VAR ok: BOOLEAN);
- ⓪"VAR (*$Reg*)zindex: CARDINAL;
- ⓪((*$Reg*)l: CARDINAL;
- ⓪((*$Reg*)ztab: CARDINAL;
- ⓪((*$Reg*)ind: CARDINAL;
- ⓪"BEGIN
- ⓪"
- ⓪$zindex := 0; (* Stringanfang *)
- ⓪$(* Zeileninhalt in Puffer schreiben: *)
- ⓪$l := LENGTH (z); (* Laenge des Strings - um 1 groesser als max. Index *)
- ⓪$ok := TRUE;
- ⓪$ind := VAL (CARDINAL, index);
- ⓪$WHILE (ind <= cpuffer) & (zindex < l) & ok DO
- ⓪&IF (z [zindex] < 40C) THEN
- ⓪(IF (z [zindex] = tab) & (TabFiltern IN Puff^.Modus) THEN
- ⓪*ztab := Puff^.TabWeite * ((zindex DIV Puff^.TabWeite) + 1);
- ⓪*WHILE (ztab > 0) & ok DO
- ⓪,puffer^ [ind] := ' '; INC (ind); DEC (ztab);
- ⓪,IF (ind > cpuffer) & ok THEN
- ⓪.index := VAL (LONGCARD, ind);
- ⓪.ok := SchreibPuffer (texthandle);
- ⓪.ind := 0;
- ⓪,END;
- ⓪*END (* WHILE *);
- ⓪*INC (ind);
- ⓪(ELSIF ~controlfil THEN
- ⓪*puffer^ [ind] := z [zindex]; INC (ind);
- ⓪(END (* IF Control-Code *);
- ⓪&ELSE
- ⓪(puffer^ [ind] := z [zindex]; INC (ind);
- ⓪&END (* IF Tab *);
- ⓪&INC (zindex);
- ⓪&IF (ind > cpuffer) & ok THEN
- ⓪(index := VAL (LONGCARD, ind);
- ⓪(ok := SchreibPuffer (texthandle);
- ⓪(ind := 0;
- ⓪&END (* IF *);
- ⓪$END (* WHILE *);
- ⓪$IF ok & NOT keinZeilenEndeAnfuegen THEN
- ⓪&(* cr schreiben: *)
- ⓪&puffer^ [ind] := cr; INC (ind);
- ⓪&IF (ind > cpuffer) & ok THEN
- ⓪(index := VAL (LONGCARD, ind);
- ⓪(ok := SchreibPuffer (texthandle);
- ⓪(ind := 0;
- ⓪&END (* IF *);
- ⓪&(* lf schreiben: *)
- ⓪&puffer^ [ind] := lf; INC (ind);
- ⓪&IF (ind > cpuffer) & ok THEN
- ⓪(index := VAL (LONGCARD, ind);
- ⓪(ok := SchreibPuffer (texthandle);
- ⓪(ind := 0;
- ⓪&END (* IF *);
- ⓪$END;
- ⓪$index := VAL (LONGCARD, ind);
- ⓪"END SchreibZeile;
- ⓪
- ⓪ VAR PName: eineInfo;
- ⓪(dummy: CHAR;
- ⓪(dummys: eineInfo;
- ⓪(dot: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)
- ⓪(Message: ARRAY [0..60] OF CHAR;
- ⓪(timeptr: ADDRESS;
- ⓪
- ⓪ BEGIN (* TextSchreiben *)
- ⓪"erfolgreich:= FALSE;
- ⓪"WriteChar (bel);
- ⓪"IF (Puff^.Puffer^.naechste^.naechste = NIL) &
- ⓪%(Puff^.Puffer^.naechste^.ZeilPointer^[0] = nul) THEN
- ⓪$erfolgreich:= TRUE;
- ⓪$RETURN
- ⓪"END (* IF Puffer leer *);
- ⓪"CursorAus;
- ⓪"REPEAT
- ⓪$REPEAT
- ⓪&Info := Puff^.Pfad; DeleteTail (Info);
- ⓪&FastStrings.Append (Puff^.Name, Info);
- ⓪&oldPfad := Puff^.Pfad; oldName := Puff^.Name;
- ⓪&GotoXY (0, 0);
- ⓪&HighLight; WriteConst (version); Normal; LoescheZeile;
- ⓪&WriteLn; LoescheZeile; WriteLn; LoescheZeile;
- ⓪&IF markiert THEN Message := 'Fileblock schreiben';
- ⓪&ELSE Message := 'File schreiben';
- ⓪&END;
- ⓪&HighLight;
- ⓪&WriteConst (Info); Normal;
- ⓪&IF frage THEN
- ⓪(PName := Puff^.Name;
- ⓪(GetDirectory (Puff^.Pfad, Puff^.Name, Message, button, FALSE);
- ⓪(IF button # 1 THEN
- ⓪*Puff^.Name := PName;
- ⓪*erfolgreich:= TRUE;
- ⓪*RETURN;
- ⓪(END;
- ⓪(MausEin;
- ⓪&ELSE MausEin;
- ⓪&END (* IF frage *);
- ⓪&(*
- ⓪&IF Puff^.Name [0] = nul THEN
- ⓪(Nachricht ('Noch kein Dateiname angegeben!');
- ⓪&END (* IF kein Name *);
- ⓪&*)
- ⓪&frage := TRUE;
- ⓪$UNTIL Puff^.Name [0] # nul;
- ⓪$Info := Puff^.Pfad; DeleteTail (Info);
- ⓪$FastStrings.Append (Puff^.Name, Info);
- ⓪!
- ⓪$IF ~markiert & (backup OR (MakeBAK IN Puff^.Modus)) THEN
- ⓪&(*
- ⓪(BakName := Info;
- ⓪(dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)
- ⓪(IF FastStrings.Pos (dot, BakName) > 0 THEN
- ⓪*i := LENGTH (BakName); DEC (i);
- ⓪*WHILE BakName [i] # '.' DO
- ⓪,DEC (i);
- ⓪*END (* WHILE *);
- ⓪*BakName [i] := nul;
- ⓪(END (* IF Punkt *);
- ⓪(Append ('.BAK', BakName, ok);
- ⓪&*)
- ⓪&FileNames.ConcatName (Info, 'BAK', BakName);
- ⓪&ok := Delete (BakName);
- ⓪&Rename (Info, BakName);
- ⓪$END (* IF nicht markiert *);
- ⓪$Create (Info, 0, texthandle);
- ⓪$IF texthandle < 0 THEN
- ⓪&Nachricht ('Fehler beim Erzeugen der Text-Datei');
- ⓪&RETURN;
- ⓪$END (* IF Handle ungueltig *);
- ⓪"UNTIL texthandle >= 0;
- ⓪"WITH Puff^ DO
- ⓪$IF markiert THEN
- ⓪&StelleZeileEin (Puff, MerkPunkte [BlockMarke1].zeilpos, 0);
- ⓪&Help := MerkPunkte [LaufendeZeile].merkline;
- ⓪&i := MerkPunkte [LaufendeZeile].zeilpos;
- ⓪$ELSE
- ⓪&Help := Puffer^.naechste;
- ⓪&i := 1;
- ⓪$END (* IF *);
- ⓪$index := VAL (LONGCARD, 0); ende := FALSE; ok := TRUE;
- ⓪$HighLight;
- ⓪
- ⓪$GotoXY (38, 12); HighLight;
- ⓪$WriteConst (' 0'); MausBusy;
- ⓪
- ⓪$IF puffer = NIL THEN
- ⓪&Nachricht ('Speicher reicht|nicht für Puffer');
- ⓪&RETURN;
- ⓪$END (* IF *);
- ⓪$WHILE ~ende & ok DO
- ⓪&ende := (Help^.naechste = NIL)
- ⓪/OR (markiert & (i >= MerkPunkte [BlockMarke2].zeilpos));
- ⓪&IF markiert & (i = MerkPunkte [LaufendeZeile].zeilpos) THEN
- ⓪(FastStrings.Copy (Help^.ZeilPointer^, MerkPunkte [BlockMarke1].charpos,
- ⓪.LENGTH (Help^.ZeilPointer^) - MerkPunkte [BlockMarke1].charpos,
- ⓪.rest);
- ⓪(SchreibZeile (texthandle, rest, ende, ok);
- ⓪&ELSIF ende & markiert THEN
- ⓪(FastStrings.Copy (Help^.ZeilPointer^, 0,
- ⓪.MerkPunkte [BlockMarke2].charpos, rest);
- ⓪(SchreibZeile (texthandle, rest, ende, ok);
- ⓪&ELSE
- ⓪(SchreibZeile (texthandle, Help^.ZeilPointer^, ende, ok);
- ⓪&END (* IF *);
- ⓪&Help := Help^.naechste;
- ⓪&INC (i);
- ⓪&IF i MOD 50 = 0 THEN
- ⓪(CursorAus; MausAus; GotoXY (38, 12);
- ⓪(ConvCard (i, 4, dummys);
- ⓪(WriteConst (dummys); MausBusy;
- ⓪&END (* IF *);
- ⓪$END (* WHILE *);
- ⓪$Normal;
- ⓪$IF (index > VAL (LONGCARD, 0)) & ok THEN
- ⓪&ok := SchreibPuffer (texthandle);
- ⓪$END (* IF *);
- ⓪$IF ~ok THEN
- ⓪&Nachricht ('Fehler beim Abspeichern|Eventuell Diskette voll');
- ⓪&LoescheBild;
- ⓪&ok := Close (texthandle);
- ⓪&RETURN
- ⓪$END (* IF ~ok *);
- ⓪$erfolgreich:= Close (texthandle);
- ⓪$Open (Info, ORD (read), texthandle);
- ⓪$timeptr := ADR (tageszeit);
- ⓪$DaTime (texthandle, timeptr, CAST (TimeAccessMode, Compiliert IN Modus));
- ⓪$ok := Close (texthandle);
- ⓪"END (* WITH *);
- ⓪"IF erfolgreich THEN
- ⓪$IF markiert THEN Puff^.Pfad := oldPfad; Puff^.Name := oldName;
- ⓪$ELSIF saveconfig THEN
- ⓪&SaveConfig (Puff, FALSE);
- ⓪$END (* IF *);
- ⓪$AutoCount := 0;
- ⓪$IF NOT markiert THEN
- ⓪&EXCL (Puff^.Modus, Editiert);
- ⓪$END
- ⓪"END
- ⓪ END TextSchreiben;
- ⓪
- ⓪ (************************* EditCommand *************************************)
- ⓪
- ⓪ CONST cErrName = 'TLGE.ERR';
- ⓪
- ⓪ VAR FehlerMeldung: eineInfo;
- ⓪(ErrName: eineInfo;
- ⓪(FehlerText: eineZeile;
- ⓪(Start: CARDINAL;
- ⓪(FehlerStart: einLinePointer;
- ⓪(ok: BOOLEAN;
- ⓪(ErrZeil, ErrPos: CARDINAL;
- ⓪(ErrLine: einLinePointer;
- ⓪(FehlerAnzahl: CARDINAL;
- ⓪(LaufenderFehler: CARDINAL;
- ⓪(Backslash: ARRAY [0..0] OF CHAR;
- ⓪
- ⓪"(* Megamax-Modula: *)
- ⓪"PROCEDURE SetCompilerInfo (Puff: einPufferPointer;
- ⓪0VAR FehlerMeldung: ARRAY OF CHAR);
- ⓪"VAR mp, hp: einMerkPointer;
- ⓪(ch: CHAR;
- ⓪"BEGIN
- ⓪%
- ⓪%(* Einstellen der Fehlermeldung in Merkpunktliste Compilerinfo: *)
- ⓪%(* Alte Compilerinfo-Liste löschen: *)
- ⓪$
- ⓪%WITH Puff^.MerkPunkte [CompilerInfo] DO
- ⓪'zeilpos := Puff^.MerkPunkte [LaufendeZeile].zeilpos;
- ⓪'merkline := Puff^.MerkPunkte [LaufendeZeile].merkline;
- ⓪'charpos := Puff^.MerkPunkte [LaufendeZeile].charpos;
- ⓪'PutLine (merkinfo, FehlerMeldung);
- ⓪%END (* WITH *);
- ⓪"END SetCompilerInfo;
- ⓪"
- ⓪"PROCEDURE SetPath;
- ⓪"VAR dummy: eineInfo;
- ⓪(Button: INTEGER;
- ⓪"BEGIN
- ⓪$LoescheBild; (*WriteConst ('Pfad für Dienstprogramme: ');*)
- ⓪$dummy [0] := nul;
- ⓪$GetDirectory (CompilerPfad, dummy, 'Pfad für TDI-Programme', Button, FALSE);
- ⓪$DeleteTail (CompilerPfad);
- ⓪$IF CompilerPfad [0] = nul THEN
- ⓪&CompilerPfad [0] := '\'; CompilerPfad [1] := nul;
- ⓪$END;
- ⓪"END SetPath;
- ⓪
- ⓪ (*
- ⓪"PROCEDURE DoRunProgram (Pfadname, Dateiname, Argument: ARRAY OF CHAR): INTEGER;
- ⓪"(* korrigiert von Peter Hellinger *)
- ⓪"
- ⓪"VAR (*Pfadname, Dateiname: eineInfo;*)
- ⓪(Programmname: eineInfo;
- ⓪(Button: INTEGER;
- ⓪(laenge: ARRAY [0..0] OF CHAR;
- ⓪(newDrive, oldDrive: CARDINAL;
- ⓪(map: LONGCARD;
- ⓪(oldPfad: eineInfo;
- ⓪(Result: (*INTEGER*) LONGINT;
- ⓪(key: einTasteneintrag;
- ⓪(b: CHAR;
- ⓪(ok: BOOLEAN;
- ⓪"BEGIN
- ⓪$GEMDOS.GetPath (oldPfad, 0);
- ⓪$GEMDOS.GetDrv (oldDrive);
- ⓪$IF Pfadname [0] = nul THEN
- ⓪&Pfadname [0] := '\'; Pfadname [1] := nul;
- ⓪$END (* IF *);
- ⓪$GotoXY (0, 0);
- ⓪$WriteLine (Pfadname);
- ⓪$Assign (Pfadname, Programmname);
- ⓪$DeleteTail (Programmname);
- ⓪$Append (Dateiname, Programmname); (* Sehr richtig!! *)
- ⓪$
- ⓪$WriteConst ('--> '); WriteLine (Programmname);
- ⓪$WriteConst (': '); WriteLine (Argument);
- ⓪$
- ⓪$laenge [0] := CHR (LENGTH (Argument));
- ⓪$Insert (laenge, 0, Argument);
- ⓪
- ⓪$(* Jetzt wirds interessant: *)
- ⓪
- ⓪$IF (Programmname [0] >= 'A') & (Programmname [0] <= 'Z') THEN
- ⓪&newDrive := ORD (Programmname [0]) - 65;
- ⓪&IF (newDrive # oldDrive) THEN
- ⓪(GEMDOS.SetDrv (newDrive, map);
- ⓪&END (* IF *);
- ⓪$END (* IF *);
- ⓪$DeleteTail (Pfadname);
- ⓪$IF GEMDOS.SetPath (Pfadname) THEN
- ⓪'MausEin; (* Muss **hier** stehen! *)
- ⓪
- ⓪'GEMDOS.Exec (GEMDOS.loadExecute, Programmname, Argument,
- ⓪+Pfadname, Result);
- ⓪ (* WriteConst ('Programm-Resultat: ');
- ⓪&WriteInt (output, Result, 5);
- ⓪&LiesZeichen (b);
- ⓪ *)
- ⓪&TastInit;
- ⓪&(*RestoreFont; (*-- Golem-Font wieder herstellen --*)*)
- ⓪
- ⓪$ELSE (* Falscher Pfad! *)
- ⓪&Nachricht ('Illegaler Zugriffspfad');
- ⓪$END (* IF SetPath *);
- ⓪$(* Altes Laufwerk und Pfad restaurieren *)
- ⓪$GEMDOS.SetDrv (oldDrive, map);
- ⓪$ok := GEMDOS.SetPath (oldPfad);
- ⓪$(* Aechz - erstmal auf die Schnelle lokale Anpassung: *)
- ⓪$RETURN VAL (INTEGER, Result);
- ⓪"END DoRunProgram;
- ⓪ *)
- ⓪
- ⓪"PROCEDURE CommandLine (VAR FILENAME, FEHLERMELD: ARRAY OF CHAR): BOOLEAN;
- ⓪"VAR I, Z, s: CARDINAL;
- ⓪(CmdLine: POINTER TO ARRAY [0..127] OF CHAR;
- ⓪"BEGIN
- ⓪$CmdLine:= ActiveProcess ();
- ⓪$INC (CmdLine, 128);
- ⓪$IF CmdLine^ [0] = nul THEN (* Ist eigentlich das Längenbyte...*)
- ⓪&(* Wenn Null, keine Commandline. *)
- ⓪&RETURN FALSE
- ⓪$ELSE
- ⓪&(* Komandozeile wurde übergeben *)
- ⓪&
- ⓪&(* Trace ('CommandLine'); *)
- ⓪&
- ⓪&LoescheBild;
- ⓪&(*
- ⓪&GotoXY (2, 2);
- ⓪&WriteConst ('CML: -->'); WriteLine (CmdLine^); WriteLn;
- ⓪&*)
- ⓪&Z := 0;
- ⓪&s := ORD (CmdLine^ [0]);
- ⓪&IF s >= 126 THEN s := 126; END;
- ⓪&I := 1; CmdLine^ [s(*!TT:*)+1] := nul; (* Nullterminierung sicherstellen *)
- ⓪&WHILE (I <= s) & (CmdLine^ [I] > ' ') & (CmdLine^ [I] # nul) DO
- ⓪(FILENAME [Z] := CmdLine^ [I];
- ⓪(INC (Z);
- ⓪(INC (I);
- ⓪&END (* WHILE *);
- ⓪&FILENAME [Z] := nul;
- ⓪
- ⓪&Z := 0;
- ⓪&WHILE (I <= s) & (CmdLine^ [I] >= ' ') & (CmdLine^ [I] # nul) DO
- ⓪(FEHLERMELD [Z] := CmdLine^ [I];
- ⓪(INC (Z); INC (I);
- ⓪&END (* WHILE *);
- ⓪&FEHLERMELD [Z] := nul;
- ⓪&
- ⓪&RETURN TRUE
- ⓪$END (* ELSE Kommandozeile vorhanden *);
- ⓪"END CommandLine;
- ⓪
- ⓪"PROCEDURE NextArgument (VAR n, arg: ARRAY OF CHAR): BOOLEAN;
- ⓪"(* Kopiert aus n das erste Argument (bis zum Blank) in arg und löscht
- ⓪%es in n. FALSE wenn n der leere String ist. *)
- ⓪"VAR quindex, zindex, laenge: CARDINAL;
- ⓪(delimiter: CHAR;
- ⓪"BEGIN
- ⓪$laenge := LENGTH (n); quindex := 0;
- ⓪$IF laenge = 0 THEN RETURN FALSE; END;
- ⓪$WHILE (n [quindex] = ' ') & (quindex < laenge) DO
- ⓪&INC (quindex);
- ⓪$END;
- ⓪$FastStrings.Delete (n, 0, quindex); laenge := laenge (* + 1 *) - quindex;
- ⓪$zindex := 0; quindex := 0;
- ⓪$IF n [quindex] = '"' THEN
- ⓪&delimiter := '"'; INC (quindex);
- ⓪$ELSE delimiter := ' ';
- ⓪$END;
- ⓪$WHILE (n [quindex] # delimiter) & (quindex < laenge) DO
- ⓪&arg [zindex] := n [quindex];
- ⓪&INC (zindex); INC (quindex);
- ⓪$END (* WHILE *);
- ⓪$(* Skip '"'! *)
- ⓪$IF (n [quindex] = '"') & (quindex < laenge) THEN INC (quindex); END;
- ⓪$FastStrings.Delete (n, 0, quindex);
- ⓪$arg [zindex] := nul;
- ⓪$RETURN arg [0] # nul;
- ⓪"END NextArgument;
- ⓪"
- ⓪"PROCEDURE SplitFileName (name: ARRAY OF CHAR;
- ⓪;VAR path, file, suff: ARRAY OF CHAR);
- ⓪"(* Kopiert den Pfad- und Dateinamensanteil aus name getrennt nach
- ⓪%path und file *)
- ⓪"VAR i, index, laenge, pfadlaenge: CARDINAL;
- ⓪"VAR dummy: ARRAY [0..7] OF CHAR;
- ⓪"BEGIN
- ⓪$FileNames.SplitPath (name, path, file);
- ⓪$FileNames.SplitName (file, dummy, suff);
- ⓪$(* Punkt nach Suff:
- ⓪&Strings.Insert ('.',0,suff,BOOLEAN);
- ⓪$*)
- ⓪"END SplitFileName;
- ⓪
- ⓪"PROCEDURE GetScrapPath (VAR ScrapPfad, ScrapName: ARRAY OF CHAR);
- ⓪ (*
- ⓪"CONST cClipVar = 'CLIPBRD';
- ⓪"
- ⓪"VAR clipPath: eineInfo;
- ⓪*bootdev[0446H]: CARDINAL;
- ⓪*bootfrom: CARDINAL;
- ⓪*stack: ADDRESS;
- ⓪*clipVar: ARRAY [0..8] OF CHAR;
- ⓪*ok: BOOLEAN;
- ⓪ *)
- ⓪"VAR dummySuff: (*einSuffix*) ARRAY [0..3] OF CHAR;
- ⓪"BEGIN
- ⓪ (*
- ⓪$AESMisc.ReadScrapDir (ScrapPfad);
- ⓪$IF ScrapPfad [0] = nul THEN
- ⓪&clipVar:= cClipVar;
- ⓪&AESMisc.ShellEnvironment (clipVar, clipPath);
- ⓪&IF clipPath [0] # nul THEN
- ⓪((*Nachricht (clipPath);*)
- ⓪(Assign (clipPath, ScrapPfad);
- ⓪&ELSE
- ⓪((*Nachricht ('warnix|');*)
- ⓪(SysUtil1.SuperPeek (ADR (bootdev), bootfrom);
- ⓪(Strings.Assign (':\CLIPBRD\SCRAP.TXT', ScrapPfad, ok);
- ⓪(Strings.Insert (CHR (bootfrom + ORD ('A')), 0, ScrapPfad, ok);
- ⓪&END (* IF clipPath *);
- ⓪&AESMisc.WriteScrapDir (ScrapPfad);
- ⓪$END (* IF ScrapPfad *);
- ⓪ *)
- ⓪$MakeScrapName ('TXT', ScrapPfad);
- ⓪$SplitFileName (ScrapPfad, ScrapPfad, ScrapName, dummySuff);
- ⓪$FastStrings.Assign (ScrapPfad, ClipBoard^.Pfad);
- ⓪$FastStrings.Assign (ScrapName, ClipBoard^.Name);
- ⓪"END GetScrapPath;
- ⓪
- ⓪ (* ENDE EditCommand *)
- ⓪
- ⓪ VAR f: PathCtrl.PathEntry;
- ⓪((*ok: BOOLEAN;*)
- ⓪(result: INTEGER;
- ⓪
- ⓪ BEGIN (* EditFile *)
- ⓪
- ⓪ (* EditCommand *)
- ⓪"BackPointer := NIL;
- ⓪"
- ⓪"InitBuffer;
- ⓪
- ⓪ (* !JL 12. 12. 90 *)
- ⓪"NEW (puffer);
- ⓪"IF puffer = NIL THEN OutOfMemory END;
- ⓪"expandBlankCompr := TRUE;
- ⓪
- ⓪"NEW (ConfigPuffer);
- ⓪"IF ConfigPuffer = NIL THEN OutOfMemory END;
- ⓪"PuffInit (ConfigPuffer);
- ⓪"IF ConfigPuffer = NIL THEN
- ⓪$Nachricht ('Kann ConfigPuffer|nicht anlegen.109');
- ⓪$RETURN;
- ⓪"END;
- ⓪"ConfigPuffer^.NaechsterPuffer := ConfigPuffer;
- ⓪"ConfigInit := FALSE;
- ⓪"InitConfig (ConfigPuffer);
- ⓪"ConfigInit := TRUE;
- ⓪"ConfigPuffer^.Name := DefaultConfigName;
- ⓪"FileNames.ConcatPath (ShellPath, ConfigPuffer^.Name, ConfigPuffer^.Pfad);
- ⓪"IF KonfigSpeichern IN ConfigPuffer^.Modus THEN
- ⓪$LoadConfig (ConfigPuffer, FALSE, TRUE);
- ⓪"END;
- ⓪"
- ⓪"NEW (HilfsPuffer);
- ⓪"IF HilfsPuffer = NIL THEN OutOfMemory END;
- ⓪"PuffInit (HilfsPuffer);
- ⓪"IF HilfsPuffer = NIL THEN
- ⓪$Nachricht ('Kann Hilfspuffer|nicht anlegen.110');
- ⓪$RETURN;
- ⓪"END;
- ⓪"HilfsPuffer^.NaechsterPuffer := HilfsPuffer;
- ⓪"EditPuffer := InsertPuffer (HilfsPuffer);
- ⓪"Tausch := EditPuffer; MailPuffer := EditPuffer; GolemPuffer := EditPuffer;
- ⓪"AlternEdit := EditPuffer;
- ⓪"NEW (ClipBoard);
- ⓪"IF ClipBoard = NIL THEN OutOfMemory END;
- ⓪"PuffInit (ClipBoard);
- ⓪"IF ClipBoard = NIL THEN
- ⓪$Nachricht ('Kann ClipBoard|nicht anlegen.111');
- ⓪$RETURN;
- ⓪"END;
- ⓪"ClipBoard^.NaechsterPuffer := ClipBoard;
- ⓪"NEW (UndoPuffer);
- ⓪"IF UndoPuffer = NIL THEN OutOfMemory END;
- ⓪"PuffInit (UndoPuffer);
- ⓪"IF UndoPuffer = NIL THEN
- ⓪$Nachricht ('Kann UndoPuffer|nicht anlegen.112');
- ⓪$RETURN;
- ⓪"END;
- ⓪"UndoPuffer^.NaechsterPuffer := UndoPuffer;
- ⓪"
- ⓪"NEW (FehlerPuffer);
- ⓪"IF FehlerPuffer = NIL THEN OutOfMemory END;
- ⓪"PuffInit (FehlerPuffer);
- ⓪"IF UndoPuffer = NIL THEN
- ⓪$Nachricht ('Kann FehlerPuffer|nicht anlegen.112');
- ⓪$RETURN;
- ⓪"END;
- ⓪"FehlerPuffer^.NaechsterPuffer := FehlerPuffer;
- ⓪"FastStrings.Assign (cErrName, ErrName);
- ⓪"FehlerMeldung := '';
- ⓪"GetPfad (CompilerPfad); DeleteTail (CompilerPfad);
- ⓪"GetScrapPath (ScrapPfad, ScrapName);
- ⓪"(* DoClipboard := FALSE; *) (* IN GMEBase!!! *)
- ⓪
- ⓪ (* EditFile *)
- ⓪
- ⓪"Trace ('EditFile');
- ⓪"GetVersion (version); GlobalPfad [0] := nul; (*GetPfad (GlobalPfad);*)
- ⓪"Lists.ResetList (ShellMsg.SrcPaths);
- ⓪"f := Lists.NextEntry (ShellMsg.SrcPaths);
- ⓪"
- ⓪"IF f # NIL THEN
- ⓪$FastStrings.Assign (f^, GlobalPfad);
- ⓪$Paths.MakeFullName (GlobalPfad, FALSE, ok);
- ⓪"END;
- ⓪"
- ⓪"Directory.MakeFullPath (GlobalPfad, result);
- ⓪"IF result < 0 THEN
- ⓪$GlobalPfad:= '';
- ⓪$GetPfad (GlobalPfad);
- ⓪"END;
- ⓪"(*!TT 18.12.90 - steht oben schon einmal
- ⓪$NEW (puffer);
- ⓪"*)
- ⓪"expandBlankCompr := TRUE;
- ⓪ END GMEFile.
- ⓪
- ⓪ ə
- (* $FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82DÇ$00008356T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$0000BC45$FFEB97DE$00001AD8$0000BB22$0000BC14$0000BBB3$0000BB6A$00001F53$0000BC76$0000BB9D$00000431$000082F2$00009C46$00008356$0000832C$00008356ÇÇé*)
-