home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari FTP
/
ATARI_FTP_0693.zip
/
ATARI_FTP_0693
/
Tex
/
td187src.lzh
/
FILE.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
17KB
|
649 lines
IMPLEMENTATION MODULE File ;
FROM SYSTEM IMPORT ADDRESS , ADR;
FROM Storage IMPORT ALLOCATE , DEALLOCATE ;
FROM Dialoge IMPORT BusyStart, BusyEnd;
FROM Diverses IMPORT GetFSelText, NumAlert;
FROM Types IMPORT DrawObjectTyp, TextPosTyp, CodeAryTyp,
CharPtrTyp, ObjectPtrTyp;
IMPORT MagicDOS ;
IMPORT MagicStrings;
IMPORT MagicSys;
IMPORT mtAlerts ;
IMPORT Diverses;
IMPORT GetFile;
IMPORT FileIO;
IMPORT Variablen ;
IMPORT CommonData ;
(**
IMPORT RTD;
**)
TYPE ReadOrWrite = ( R , W ) ;
VAR FileHandle : INTEGER ;
Button : INTEGER ;
FileVersion: INTEGER ;
Idum : INTEGER ;
Bdum : BOOLEAN ;
Cdum : CARDINAL ;
Ldum : MagicSys.lCARDINAL ;
MergeMode : BOOLEAN;
PROCEDURE Correct(REF Filename : ARRAY OF CHAR;
VAR unilen,
resolution,
release : INTEGER ) : BOOLEAN;
VAR res : BOOLEAN;
long : MagicSys.lCARDINAL;
Handle : INTEGER;
Button : INTEGER;
code : ARRAY [0..39] OF INTEGER;
adr : ADDRESS;
num : ARRAY [0..9] OF CHAR;
dtaptr : MagicDOS.PtrDTA;
BEGIN
(**
RTD.SetDevice(RTD.printer);
RTD.Write('Correct:', Filename);
**)
res := TRUE;
long := 20 ;
adr := ADR ( code );
dtaptr := MagicDOS.Fgetdta() ;
Button := MagicDOS.Fsfirst ( Filename ,
{MagicDOS.ReadOnly, MagicDOS.Archive,
MagicDOS.Hidden, MagicDOS.System});
IF (Button=0) AND (dtaptr^.dLength>=20) THEN
FileIO.Reset(Handle, Filename);
IF Handle<0 THEN
res := FALSE;
ELSE
(**
MagicDOS.Fread ( Handle , long , adr ) ;
**)
FileIO.ReadNWords(Handle, 10, code);
FileIO.Close ( Handle ) ;
IF ORD(code[0])<>ORD(Picture) THEN
res := FALSE;
END;
unilen := code[6];
resolution := code[7];
release := code[8];
IF (resolution<1) OR (resolution>5) THEN
resolution := 3;
END; (* altes Format *)
END;
ELSE
res := FALSE;
END;
IF NOT res THEN
mtAlerts.SetIcon(mtAlerts.Graphic);
(**
Button := Diverses.Alert(1, NoPicFile);
**)
Button := NumAlert(4, 1);
END;
(**
RTD.Message('Leaving Correct');
**)
RETURN res;
END Correct;
PROCEDURE SelectFile ( VAR Name : ARRAY OF CHAR;
MSG : ARRAY OF CHAR;
LeaveName : BOOLEAN;
HasToExist : BOOLEAN ) : INTEGER ;
VAR titel : ARRAY [ 0..128 ] OF CHAR ;
path : ARRAY [ 0..128 ] OF CHAR ;
file : ARRAY [ 0..12 ] OF CHAR ;
ext : ARRAY [ 0..4 ] OF CHAR ;
tmp1,tmp2: ARRAY [ 0..14 ] OF CHAR ;
titeladr : ADDRESS ;
fileadr : ADDRESS ;
drive : CARDINAL ;
index : INTEGER ;
merke : INTEGER ;
dummy : BOOLEAN;
BEGIN
(**
RTD.Message('Into SelectFile ');
**)
IF LeaveName THEN
MagicStrings.Assign(Name, titel);
GetFile.ReplacePath(titel, '');
END;
tmp1 := '*.';
tmp2 := '.';
MagicStrings.Append(CommonData.Extensions[1], tmp1);
MagicStrings.Append(CommonData.Extensions[1], tmp2);
IF GetFile.GetFileName(Name, titel, tmp1, tmp2, CommonData.LTDPath, MSG,
dummy, LeaveName, HasToExist, TRUE, FALSE) THEN
(**
RTD.Message('Leaving SelectFile ');
**)
RETURN 1;
ELSE
(**
RTD.Message('Leaving SelectFile ');
**)
RETURN 0;
END;
END SelectFile ;
PROCEDURE ReadWriteFile ( FileName : ARRAY OF CHAR;
RW : ReadOrWrite;
SelectFlag : BOOLEAN ) : BOOLEAN ;
(* Lese bzw. schreibe Baum *)
VAR rw : CARDINAL ;
long : MagicSys.lCARDINAL ;
long2 : MagicSys.lCARDINAL ;
adr : ADDRESS ;
z : INTEGER;
dummy : BOOLEAN;
lookset : BITSET;
num : ARRAY [ 0..3 ] OF CHAR ;
object : ObjectPtrTyp ;
code : CodeAryTyp ;
cptr : CharPtrTyp ;
eptr : ADDRESS;
cbuffer : ARRAY [0..255] OF CHAR;
Surround : ARRAY [0..3] OF INTEGER;
PROCEDURE SaveTree(first : ObjectPtrTyp;
Subpic, OnlySelected : BOOLEAN) ;
VAR object : ObjectPtrTyp ;
number : INTEGER;
BEGIN
(**
RTD.Message('Into SaveTree');
**)
IF Subpic THEN
object := first^.Children;
ELSE
object := first^.Next;
END;
number := 0;
WHILE object<>NIL DO
IF OnlySelected THEN
IF object^.Selected THEN
number := number + 1;
END;
ELSE
number := number + 1;
END;
object := object^.Next;
END;
first^.Code[5] := number;
adr := ADR ( first^.Code ) ;
long := 20;
MagicDOS.Fwrite ( FileHandle , long , adr ) ;
IF Subpic THEN
object := first^.Children;
ELSE
object := first^.Next;
END;
WHILE object <> NIL DO
IF (NOT OnlySelected) OR
(OnlySelected AND object^.Selected) THEN
IF ORD(object^.Code[0]) <> ORD(Picture) THEN
long := 20 ;
adr := ADR ( object^.Code ) ;
MagicDOS.Fwrite ( FileHandle , long , adr ) ;
IF object^.Code [ 9 ] > 0 THEN
long := MagicSys.CastToLCard ( object^.Code [ 9 ] ) ;
MagicDOS.Fwrite ( FileHandle , long , object^.CPtr ) ;
END;
CASE VAL(DrawObjectTyp, object^.Code[0]) OF
EpicSolidLine,
EpicDottedLine,
EpicDashedLine :
long2 := 4 * MagicSys.CastToLCard ( object^.Code [ 3 ] ) ;
IF long2 > 0 THEN
MagicDOS.Fwrite ( FileHandle , long2 , object^.EPtr ) ;
END;|
ELSE
long2 := 0;
END;
ELSE
SaveTree(object, TRUE, FALSE);
END;
END;
object := object^.Next ;
END;
(**
RTD.Message('Leaving SaveTree');
**)
END SaveTree;
PROCEDURE LoadTree(flag, SelectIt : BOOLEAN;
anzahl: INTEGER) : BOOLEAN;
(* Ist Flag = 0 so merken wir uns den LastObject-Status und hängen *)
(* den Zweig des Baumes um, dabei gehen wir davon aus, da₧ das zuletzt *)
(* erzeugte Objekt das Vaterobjekt ist. *)
VAR laststate : ObjectPtrTyp;
i, read : INTEGER;
ok : BOOLEAN;
BEGIN
(**
RTD.Message('LoadTree');
RTD.ShowVar('anzahl', anzahl);
**)
IF flag THEN
laststate := Variablen.LastObject;
END;
read := 0;
ok := TRUE;
WHILE (read<anzahl) DO
long := 20 ;
adr := ADR ( code ) ;
(**
MagicDOS.Fread ( FileHandle , long , adr ) ;
**)
FileIO.ReadNWords( FileHandle, 10, code );
IF ORD(code[0])<>ORD(Picture) THEN
(**
long := MagicSys.CastToLCard ( code [ 9 ] ) ;
**)
IF code[9] > 0 THEN
(**
MagicDOS.Fread ( FileHandle , long , ADR(cbuffer) ) ;
**)
(**
RTD.Message('Text');
RTD.ShowVar('len', code[9]);
**)
FileIO.ReadNBytes( FileHandle, code[9], cbuffer);
cbuffer[code[9]] := 0C;
(**
RTD.Write('T ready', cbuffer);
FOR i:=0 TO code[9] DO
RTD.ShowVar('cbuf', cbuffer[i]);
END;
**)
END (* if *);
CASE VAL(DrawObjectTyp, code[0]) OF
EpicSolidLine,
EpicDottedLine,
EpicDashedLine :
long2 := 4 * MagicSys.CastToLCard ( code [ 3 ] ) ; (* 2 * 2 Bytes *)
IF code[3] > 0 THEN
(**
MagicDOS.Fread ( FileHandle , long2 , ADR(Variablen.ebuffer) ) ;
**)
(**
RTD.Message('Epic-Line');
**)
FileIO.ReadNWords ( FileHandle, 2 * code[3], Variablen.ebuffer );
(**
RTD.Message('EL ready');
**)
END;|
ELSE
long2 := 0;
END (* case *);
(**
RTD.Message('NewOb');
**)
IF long2<>0 THEN
IF long<> 0 THEN
Variablen.NewObject ( code , ADR(cbuffer), ADR(Variablen.ebuffer), Surround ) ;
ELSE
Variablen.NewObject ( code , NIL, ADR(Variablen.ebuffer), Surround ) ;
END (* if *);
ELSE
IF long<> 0 THEN
Variablen.NewObject ( code , ADR(cbuffer), NIL, Surround ) ;
ELSE
Variablen.NewObject ( code , NIL, NIL, Surround ) ;
END (* if *);
END (* if *);
(**
RTD.Message('NO ready');
**)
Variablen.LastObject^.Selected := SelectIt;
Variablen.LastObject^.SurrDirty := TRUE;
ELSE
Variablen.NewObject(code, NIL, NIL, Surround);
Variablen.LastObject^.SurrDirty := TRUE;
Variablen.LastObject^.Selected := SelectIt;
ok := LoadTree(TRUE, SelectIt, code[5]);
IF NOT ok THEN
read := anzahl;
END (* if *);
END;
read := read + 1;
END (* while *);
IF flag THEN
laststate^.Children := laststate^.Next;
laststate^.Next := NIL;
Variablen.LastObject := laststate;
END;
(**
RTD.Message('Leaving LoadTree');
**)
RETURN ok;
END LoadTree;
BEGIN
(**
RTD.Message('Into ReadWriteFile ');
**)
lookset := {MagicDOS.ReadOnly, MagicDOS.Archive,
MagicDOS.Hidden, MagicDOS.System};
FOR z := 0 TO 3 DO
Surround[z] := 0; (* Das wird ja beim ersten Show korrigiert *)
END;
CASE RW OF
R : rw := MagicDOS.Read ; |
W : rw := MagicDOS.Write ; |
END;
IF RW=R THEN
FileIO.Reset(FileHandle, FileName);
IF FileHandle<0 THEN
(**
RTD.Message('Abort "FileHandle<0"');
**)
RETURN FALSE ;
ELSE
(**
long := 20 ;
adr := ADR ( code );
MagicDOS.Fread ( FileHandle , long , adr ) ;
Button := MagicDOS.Fclose ( FileHandle ) ;
**)
FileIO.ReadNWords( FileHandle, 10, code );
FileIO.Close(FileHandle);
IF ORD(code[0])<>ORD(Picture) THEN
(* Sollte eigentlich schon abgefangen worden sein... *)
RETURN FALSE;
END;
END;
END;
IF RW=W THEN
FileHandle := MagicDOS.Fcreate ( FileName , {} );
Button := MagicDOS.Fclose ( FileHandle ) ;
dummy := FileIO.Fopen ( FileHandle, MagicDOS.Write, FileName );
ELSE
(**
dummy := FileIO.Fopen ( FileHandle, MagicDOS.Read, FileName);
**)
FileIO.Reset ( FileHandle, FileName);
dummy := FileHandle>=0;
(**
RTD.ShowVar('Handle', FileHandle);
**)
END;
IF NOT dummy THEN
(**
RTD.Message('Abort "NOT dummy"');
**)
RETURN FALSE ;
ELSE
BusyStart(FileName, TRUE);
CASE RW OF
R : Idum := MagicDOS.Fsfirst ( FileName , lookset );
cptr := ADR(cbuffer); (* Charpuffer *)
eptr := ADR(Variablen.ebuffer); (* Datenpuffer *)
long := 20 ;
IF MergeMode THEN
adr := ADR ( code );
(**
MagicDOS.Fread ( FileHandle , long , adr ) ;
**)
FileIO.ReadNWords( FileHandle, 10, code );
z := code [ 5 ];
ELSE
(**
adr := ADR ( Variablen.FirstObject^.Code ) ;
MagicDOS.Fread ( FileHandle , long , adr ) ;
**)
FileIO.ReadNWords( FileHandle, 10, code );
FOR z:=0 TO 9 DO
Variablen.FirstObject^.Code[ z ] := code[z];
END;
z := Variablen.FirstObject^.Code[ 7 ];
IF (z<1) OR (z>5) THEN z := 3; END;
CommonData.InternalResolution := z;
Variablen.FirstObject^.Code[ 7 ] := z;
Variablen.FirstObject^.Selected := SelectFlag;
z := Variablen.FirstObject^.Code[ 5 ];
(**
RTD.ShowVar('objects', z);
**)
END;
dummy := LoadTree(FALSE, SelectFlag, z); |
W : SaveTree(Variablen.FirstObject, FALSE, SelectFlag) ; |
END;
Button := MagicDOS.Fclose ( FileHandle ) ;
BusyEnd;
(**
RTD.Message('Leaving ReadWriteFile ');
**)
RETURN TRUE ;
END;
END ReadWriteFile ;
(*------------------------------------------------------------------------*)
(* Exportierte Prozeduren *)
(*------------------------------------------------------------------------*)
PROCEDURE LoadFile (REF FileName : ARRAY OF CHAR ) : BOOLEAN ;
VAR object,
next : ObjectPtrTyp ;
res : BOOLEAN;
dummy: INTEGER;
vers : INTEGER;
BEGIN
(**
RTD.Message('Into LoadFile');
**)
MergeMode := FALSE;
res := Correct(FileName, dummy, dummy, FileVersion);
IF res THEN
(**
RTD.Message('File correct');
**)
(* Alle bisherigen Objekte löschen *)
next := Variablen.FirstObject^.Next ;
WHILE next <> NIL DO
object := next ;
next := next^.Next ;
Variablen.DeleteObject ( object ) ;
END;
Variablen.LastObject := Variablen.FirstObject ;
Variablen.FirstObject^.Next := NIL;
res := ReadWriteFile ( FileName, R, FALSE );
IF res THEN
MagicStrings.Assign(FileName, CommonData.FileName);
END;
END;
(**
RTD.Message('Leaving LoadFile');
**)
RETURN res;
END LoadFile;
PROCEDURE Load ( ) : BOOLEAN ;
VAR tree : ADDRESS ;
object , p1, p2, next : ObjectPtrTyp ;
res : BOOLEAN;
dummy: INTEGER;
msg,
name : ARRAY [0..255] OF CHAR;
BEGIN
(**
RTD.Message('Into Load ');
**)
res := FALSE;
MagicStrings.Assign(CommonData.FileName, name);
GetFSelText(1, msg);
Button := SelectFile ( CommonData.FileName, msg, FALSE, TRUE);
IF Button = 1 THEN
res := LoadFile(CommonData.FileName);
END;
IF NOT res THEN
MagicStrings.Assign(name, CommonData.FileName);
END;
(**
RTD.Message('Leaving Load ');
**)
RETURN res;
END Load ;
PROCEDURE Merge ( SelectObjects : BOOLEAN ) ;
VAR tree : ADDRESS ;
object , next : ObjectPtrTyp ;
dum : BOOLEAN;
msg, MergeName: ARRAY [0..255] OF CHAR; (* zu Konservierungszwecken *)
adr : ADDRESS ;
dummy : BOOLEAN;
i, unilen : INTEGER;
resolution : INTEGER;
num : ARRAY [ 0..9 ] OF CHAR ;
str : ARRAY [ 0..159 ] OF CHAR ;
code : CodeAryTyp ;
BEGIN
(**
RTD.Message('Into Merge ');
**)
MergeMode := TRUE; (* Bisherige Objekte beibehalten *)
GetFSelText(2, msg);
Button := SelectFile ( MergeName, msg, FALSE, TRUE);
IF Button = 1 THEN
IF Correct( MergeName, unilen, resolution, FileVersion ) THEN
IF (unilen<>Variablen.FirstObject^.Code[6]) OR
(resolution<>Variablen.FirstObject^.Code[7]) THEN
Button := NumAlert(25, 1);
IF Button<>1 THEN
RETURN;
END;
END;
dum := ReadWriteFile ( MergeName, R, SelectObjects );
ELSE
RETURN;
END;
END;
IF CommonData.FileName[0]=0C THEN
MagicStrings.Assign( MergeName, CommonData.FileName );
END;
(**
RTD.Message('Leaving Merge ');
**)
END Merge ;
(*------------------------------------------------------------------------*)
PROCEDURE Save ( ) ;
BEGIN
(**
RTD.Message('Into Save ');
**)
Bdum := ReadWriteFile ( CommonData.FileName, W, FALSE ) ;
(**
RTD.Message('Leaving Save ');
**)
END Save ;
(*------------------------------------------------------------------------*)
PROCEDURE SaveAs ( OnlySelectedObjects : BOOLEAN ) : BOOLEAN;
VAR SaveName, msg : ARRAY [0..255] OF CHAR;
dummy : INTEGER;
BEGIN
(**
RTD.Message('Into SaveAs ');
**)
MagicStrings.Assign(CommonData.FileName, SaveName);
REPEAT
IF OnlySelectedObjects THEN
GetFSelText(4, msg);
ELSE
GetFSelText(3, msg);
END;
Button := SelectFile ( SaveName, msg, TRUE, FALSE ) ;
IF Button = 1 THEN
IF NOT GetFile.Check(SaveName) THEN
Button := -1;
END;
END;
UNTIL (Button<>-1);
IF Button = 1 THEN
(*
FileHandle := MagicDOS.Fcreate ( SaveName , {} );
dummy := MagicDOS.Fclose ( FileHandle ) ;
*)
Bdum := ReadWriteFile ( SaveName, W, OnlySelectedObjects );
IF NOT OnlySelectedObjects THEN
IF CommonData.FileName[0]=0C THEN
MagicStrings.Assign(SaveName, CommonData.FileName);
END;
END;
END;
(**
RTD.Message('Leaving SaveAs ');
**)
RETURN Button=1;
END SaveAs ;
PROCEDURE InsertFile (VAR filehandle : INTEGER;
REF SecondFile : ARRAY OF CHAR);
(*
Da das ja nur fürs Schreiben gilt, brauchen wir keine
gro₧en Klimmzüge machen.
*)
VAR SecondHandle : INTEGER;
str : ARRAY [0..255] OF CHAR;
BEGIN
IF CommonData.IncludePath[0]<>0C THEN
MagicStrings.Assign(CommonData.IncludePath, str);
MagicStrings.Append(SecondFile, str);
ELSE
MagicStrings.Assign(SecondFile, str);
END;
FileIO.Reset(SecondHandle, str);
IF (SecondHandle>0) THEN
WHILE NOT FileIO.EOF DO
FileIO.ReadLn(SecondHandle, str);
FileIO.WriteLn(filehandle, str);
END;
FileIO.Close(SecondHandle);
END;
END InsertFile;
(**
BEGIN
RTD.SetDevice(RTD.printer);
**)
END File .