ð24Syntax10.Scn.Fnt6õÿÿÿzÀÔStampElemsAlloc30 Aug 96ÿÿÿ€8ÀÔFoldElemsNew<Syntax10.Scn.FntSyntax10i.Scn.FntÄÅ (**************************************************** Revision History: 960126: GO added Writer object 960103: GO added SourceCopy to CopyDir ****************************************************) Syntax10i.Scn.Fntÿÿÿÿ€8ÀÔ"Syntax10b.Scn.Fnt         5 K  >             'ùýÿÿ€8ÀÔ#Syntax10.Scn.Fntåå VAR i: INTEGER; c1, c2: CHAR; BEGIN i := 0; c1 := elem1.name[i]; c2 := elem2.name[i]; WHILE (c1 # 0X) & (c2 # 0X) DO IF ("a" <= c1) & (c1 <= "z") THEN c1 := CAP(c1) END; IF ("a" <= c2) & (c2 <= "z") THEN c2 := CAP(c2) END; IF c1 < c2 THEN RETURN less END; IF c1 > c2 THEN RETURN greater END; INC(i); c1 := elem1.name[i]; c2 := elem2.name[i] END; IF (c1 = 0X) & (c2 = 0X) THEN RETURN equal ELSIF c1 = 0X THEN RETURN less ELSE RETURN greater END END CompareName; ÿÿÿÿ€8ÀÔ  '=ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt¡¡ BEGIN IF elem1.size < elem2.size THEN RETURN less END; IF elem1.size > elem2.size THEN RETURN greater END; RETURN CompareName(elem1, elem2) END CompareSize; ÿÿÿÿ€8ÀÔ  'Öþÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN IF elem1.date < elem2.date THEN RETURN less END; IF elem1.date > elem2.date THEN RETURN greater END; IF elem1.time < elem2.time THEN RETURN less END; IF elem1.time > elem2.time THEN RETURN greater END; RETURN CompareName(elem1, elem2) END CompareDate; ÿÿÿÿ€8ÀÔ  '¦ûÿÿ€8ÀÔ#Syntax10.Scn.Fnt88 VAR i, j, k: INTEGER; c1, c2: CHAR; BEGIN IF (elem1 IS FMElems.FolderElem) & (elem2 IS FMElems.FolderElem) THEN RETURN CompareName(elem1, elem2) END; IF elem1 IS FMElems.FolderElem THEN RETURN less END; IF elem2 IS FMElems.FolderElem THEN RETURN greater END; k := 0; i := -1; WHILE elem1.name[k] # 0X DO IF elem1.name[k] = "." THEN i := k END; INC(k) END; k := 0; j := -1; WHILE elem2.name[k] # 0X DO IF elem2.name[k] = "." THEN j := k END; INC(k) END; IF (i < 0) & (j < 0) THEN RETURN CompareName(elem1, elem2) END; IF (i < 0) THEN RETURN less END; IF (j < 0) THEN RETURN greater END; INC(i); INC(j); c1 := elem1.name[i]; c2 := elem2.name[j]; WHILE (c1 # 0X) & (c2 # 0X) DO IF ("a" <= c1) & (c1 <= "z") THEN c1 := CAP(c1) END; IF ("a" <= c2) & (c2 <= "z") THEN c2 := CAP(c2) END; IF c1 < c2 THEN RETURN less END; IF c1 > c2 THEN RETURN greater END; INC(i); INC(j); c1 := elem1.name[i]; c2 := elem2.name[j] END; IF (c1 = 0X) & (c2 = 0X) THEN RETURN CompareName(elem1, elem2) END; IF c1 = 0X THEN RETURN less END; RETURN greater END CompareType; ÿÿÿÿ€8ÀÔþÿÿ€8ÀÔ#Syntax10.Scn.FntÆÆ VAR node: Run; BEGIN IF list.head = NIL THEN NEW(list.head); list.head.entries := 0; list.head.next := NIL; NEW(list.head.elems, 100); list.head.maxEntries := 100; ELSIF list.head.entries = list.head.maxEntries THEN NEW(node); node.next := list.head; node.entries := 0; NEW(node.elems, 100); node.maxEntries := 100; list.head := node; END; list.head.elems[list.head.entries] := elem; INC(list.head.entries); INC(list.entries) END Insert; ÿÿÿÿ€8ÀÔ-÷ýÿÿ€8ÀÔ#Syntax10.Scn.Fntçç VAR i, j: INTEGER; help, m: FMElems.Elem; head: Run; BEGIN i := l; j := r; head := list.head; m := head.elems[(l + r) DIV 2]; REPEAT WHILE list.compare(head.elems[i], m) = less DO INC(i) END; WHILE list.compare(head.elems[j], m) = greater DO DEC(j) END; IF i <= j THEN help := head.elems[i]; head.elems[i] := head.elems[j]; head.elems[j] := help; INC(i); DEC(j) END UNTIL i > j; IF l < j THEN list.Sort(l, j) END; IF i < r THEN list.Sort(i, r) END; END Sort; ÿÿÿÿ€8ÀÔ Öýÿÿ€8ÀÔ#Syntax10.Scn.Fnt VAR curr, head: Run; i, j: INTEGER; BEGIN head := list.head; IF head = NIL THEN RETURN END; IF list.entries # head.entries THEN curr := head; NEW(head); head.next := NIL; head.maxEntries := list.entries; head.entries := list.entries; NEW(head.elems, list.entries); list.head := head; i := 0; WHILE curr # NIL DO FOR j := 0 TO curr.entries - 1 DO head.elems[i] := curr.elems[j]; INC(i) END; curr := curr.next END END; IF list.entries > 0 THEN list.Sort(0, list.entries - 1) END END SortList; ÿÿÿÿ€8ÀÔ   Œÿÿÿ€8ÀÔ#Syntax10.Scn.FntRR BEGIN list.entries := 0; list.head := NIL; list.compare := cmp; END InitList; ÿÿÿÿ€8ÀÔ #¤þÿÿ€8ÀÔ#Syntax10.Scn.Fnt:: BEGIN IF iter.curr = NIL THEN RETURN FALSE END; IF (iter.index = iter.curr.entries) & (iter.curr.next = NIL) THEN RETURN FALSE END; IF (iter.index = iter.curr.entries) THEN iter.curr := iter.curr.next; iter.index := 0 END; elem := iter.curr.elems[iter.index]; INC(iter.index); RETURN TRUE END NextElem; ÿÿÿÿ€8ÀÔ¢ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt<< BEGIN iter.curr := iter.head; iter.index := 0 END Reset; ÿÿÿÿ€8ÀÔ  tÿÿÿ€8ÀÔ#Syntax10.Scn.Fntjj VAR iter: Iterator; BEGIN NEW(iter); iter.head := list.head; iter.Reset; RETURN iter END NewIterator; ÿÿÿÿ€8ÀÔ /]ÿÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10i.Scn.FntAa (* len contains the amount of bytes which are stored in buffer *) BEGIN len := 0 END GetBytes; ÿÿÿÿ€8ÀÔ +gÿÿÿ€8ÀÔCSyntax10.Scn.FntSyntax10i.Scn.FntAW (* len contains the amount of bytes which are stored in buffer *) BEGIN END PutBytes; ÿÿÿÿ€8ÀÔ °ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt.. BEGIN RETURN FALSE END NeedCopyMoveControl; ÿÿÿÿ€8ÀÔ0”þÿÿ€8ÀÔ#Syntax10.Scn.FntJJ VAR i, j, len: INTEGER; BEGIN i := 0; WHILE path[i] # 0X DO INC(i) END; len := SHORT(LEN(path)) - 2; IF i < len THEN IF (i > 0) & (path[i-1] # d.delimiter) THEN path[i] := d.delimiter; INC(i) END; j := 0; WHILE (name[j] # 0X) & (i < len) DO path[i] := name[j]; INC(i); INC(j) END; path[i] := 0X END END Append; ÿÿÿÿ€8ÀÔ3¶ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt(( BEGIN RETURN FALSE END CheckIdentity; ÿÿÿÿ€8ÀÔ :¼ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt"" BEGIN RETURN NIL END NewReader; ÿÿÿÿ€8ÀÔ :¼ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt"" BEGIN RETURN NIL END NewWriter; ÿÿÿÿ€8ÀÔ BÈÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN END Enumerate; ÿÿÿÿ€8ÀÔA¾ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN RETURN NIL END GetElem; ÿÿÿÿ€8ÀÔ7Êÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN END GetPath; ÿÿÿÿ€8ÀÔ T½ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt!! BEGIN RETURN NIL END GetTrash; ÿÿÿÿ€8ÀÔ 3´ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt** BEGIN d.done := FALSE END NewDirectory; ÿÿÿÿ€8ÀÔ $¬þÿÿ€8ÀÔ#Syntax10.Scn.Fnt22 VAR list: List; BEGIN NEW(list); IF sortDate = folder.sortOrder THEN InitList(list, CompareDate) ELSIF sortType = folder.sortOrder THEN InitList(list, CompareType) ELSIF sortSize = folder.sortOrder THEN InitList(list, CompareSize) ELSE InitList(list, CompareName) END; RETURN list END NewSortList; ÿÿÿÿ€8ÀÔ2Íÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt BEGIN END Open; ÿÿÿÿ€8ÀÔK¹ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt%% BEGIN d.done := FALSE END Rename; ÿÿÿÿ€8ÀÔ 2µÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt)) BEGIN d.done := FALSE END MoveToTrash; ÿÿÿÿ€8ÀÔ þÿÿ€8ÀÔšSyntax10.Scn.Fnt"¿þÿÿ€8ÀÔFoldElemsNew#Syntax10.Scn.Fnt VAR curr: Node; BEGIN curr := root.desc; WHILE curr # NIL DO IF (curr.elem IS FMElems.FolderElem) & curr.elem(FMElems.FolderElem).open THEN Delete(curr) ELSE d.MoveToTrash(root.elem(FMElems.FolderElem), curr.elem); END; curr := curr.next END END Delete; ÿÿÿÿ€8ÀÔ(L PROCEDURE Delete (root: Node); BEGIN Delete(root) END DeleteFiles; ÿÿÿÿ€8ÀÔQ¼ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt"" BEGIN d.done := FALSE END Copy; ÿÿÿÿ€8ÀÔ Q¶ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt(( BEGIN d.done := FALSE END SourceCopy; ÿÿÿÿ€8ÀÔC#ýÿÿ€8ÀÔCSyntax10.Scn.FntâSyntax10i.Scn.Fnt¨› VAR folder: FMElems.Elem; list: List; e: FMElems.Elem; iter: Iterator; BEGIN d.NewDirectory(destParent, elem.name); folder := d.GetElem(destParent, elem.name); IF folder # NIL THEN list := srcDev.NewSortList(elem); srcDev.Enumerate(elem, list, "*"); iter := NewIterator(list); WHILE iter.NextElem(e) DO IF e IS FMElems.FolderElem THEN d.CopyDir(folder(FMElems.FolderElem), elem, e(FMElems.FolderElem), srcDev) ELSE IF srcDev.NeedCopyMoveControl() THEN (* GO, 010396 *) srcDev.SourceCopy(folder(FMElems.FolderElem), elem, e, d) ELSE d.Copy(folder(FMElems.FolderElem), elem, e, srcDev) END END END END END CopyDir; ÿÿÿÿ€8ÀÔQ¼ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt"" BEGIN d.done := FALSE END Move; ÿÿÿÿ€8ÀÔ Q¶ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt(( BEGIN d.done := FALSE END SourceMove; ÿÿÿÿ€8ÀÔ A¹ÿÿÿ€8ÀÔ#Syntax10.Scn.Fnt%% BEGIN d.done := FALSE END MoveDir; ÿÿÿÿ€8ÀÔOWõÿÿ€8ÀÔ9Syntax10.Scn.Fnt}\üÿÿ€8ÀÔFoldElemsNewCSyntax10.Scn.Fnt¼Syntax10i.Scn.Fnt-yb VAR destPath, srcPath: Path; BEGIN d.GetPath(destParent, destPath); srcDev.GetPath(srcParent, srcPath); IF destPath # srcPath THEN d.MoveToTrash(destParent, srcElem); IF d.done THEN WITH srcElem: FMElems.FolderElem DO IF copy THEN d.CopyDir(destParent, srcParent, srcElem, srcDev) ELSE d.MoveDir(destParent, srcParent, srcElem, srcDev) END ELSE IF copy THEN IF srcDev.NeedCopyMoveControl() THEN (* GO, 270196: added NeedCopyMoveControl() *) srcDev.SourceCopy(destParent, srcParent, srcElem, d) ELSE d.Copy(destParent, srcParent, srcElem, srcDev) END ELSE IF srcDev.NeedCopyMoveControl() THEN srcDev.SourceMove(destParent, srcParent, srcElem, d) ELSE d.Move(destParent, srcParent, srcElem, srcDev) END END END END END END CopyMoveFileDir; ÿÿÿÿ€8ÀÔFšþÿÿ€8ÀÔ#Syntax10.Scn.FntDD VAR curr: Node; BEGIN curr := root.desc; WHILE curr # NIL DO IF (curr.elem IS FMElems.FolderElem) & curr.elem(FMElems.FolderElem).open THEN CopyMoveFlat(destParent, curr) ELSE CopyMoveFileDir(destParent, root.elem(FMElems.FolderElem), curr.elem) END; curr := curr.next END END CopyMoveFlat; ÿÿÿÿ€8ÀÔF¨ýÿÿ€8ÀÔCSyntax10.Scn.FntiSyntax10i.Scn.Fnt0} VAR curr: Node; folder: FMElems.Elem; BEGIN curr := root.desc; WHILE curr # NIL DO IF (curr.elem IS FMElems.FolderElem) & curr.elem(FMElems.FolderElem).open THEN d.NewDirectory(destParent, curr.elem.name); folder := d.GetElem(destParent, curr.elem.name); IF folder # NIL THEN CopyMoveDeep(folder(FMElems.FolderElem), curr) END ELSE (* move single files or entire directory *) CopyMoveFileDir(destParent, root.elem(FMElems.FolderElem), curr.elem) END; curr := curr.next END END CopyMoveDeep; ÿÿÿÿ€8ÀÔ<Syntax10i.Scn.Fnt¸=q VAR folder: FMElems.Elem; PROCEDURE CopyMoveFileDir (destParent, srcParent: FMElems.FolderElem; srcElem: FMElems.Elem);  PROCEDURE CopyMoveFlat (destParent: FMElems.FolderElem; root: Node); PROCEDURE CopyMoveDeep (destParent: FMElems.FolderElem; root: Node); BEGIN IF srcRoot.elem(FMElems.FolderElem).selected THEN (* copy or move deep *) d.NewDirectory(destParent, srcRoot.elem.name); folder := d.GetElem(destParent, srcRoot.elem.name); IF folder # NIL THEN CopyMoveDeep(folder(FMElems.FolderElem), srcRoot) END ELSE (* copy or move flat *) CopyMoveFlat(destParent, srcRoot) END END CopyMoveFiles; ÿÿÿÿ€8ÀÔ'MODULE FMDevObj; (* Christian Mayrhofer 14 Dec 95, GO  *) Revision History IMPORT Display, FMElems; CONST less* = -1; equal* = 0; greater* = 1; insert* = 1; remove* = 0; sortName* = "name"; sortDate* = "date"; sortType* = "type"; sortSize* = "size"; TYPE Run = POINTER TO RunDesc; RunDesc = RECORD elems: POINTER TO ARRAY OF FMElems.Elem; entries, maxEntries: INTEGER; next: Run END; CompareProc* = PROCEDURE (elem1, elem2: FMElems.Elem): INTEGER; List* = POINTER TO ListDesc; ListDesc* = RECORD head: Run; entries: INTEGER; compare: CompareProc END; Iterator* = POINTER TO IteratorDesc; IteratorDesc* = RECORD head: Run; curr: Run; index: INTEGER END; Path*= ARRAY 256 OF CHAR; Reader* = POINTER TO ReaderDesc; ReaderDesc* = RECORD END; Writer* = POINTER TO WriterDesc; (* GO, 270196 *) WriterDesc* = RECORD END; Device* = POINTER TO DeviceDesc; DeviceDesc* = RECORD done*: BOOLEAN; delimiter*: CHAR; END; Node* = POINTER TO NodeDesc; NodeDesc* = RECORD elem*: FMElems.Elem; next*, desc*: Node END; NotifyMsg* = RECORD (Display.FrameMsg) path*: Path; name*: FMElems.Name; devObj*: Device; id*: INTEGER (* insert, remove *) END; PROCEDURE CompareName* (elem1, elem2: FMElems.Elem): INTEGER; PROCEDURE CompareSize* (elem1, elem2: FMElems.Elem): INTEGER; PROCEDURE CompareDate* (elem1, elem2: FMElems.Elem): INTEGER; PROCEDURE CompareType* (elem1, elem2: FMElems.Elem): INTEGER; PROCEDURE (list: List) Insert* (elem: FMElems.Elem); PROCEDURE (list: List) Sort (l, r: INTEGER); PROCEDURE (list: List) SortList*; PROCEDURE InitList* (list: List; cmp: CompareProc); PROCEDURE (iter: Iterator) NextElem* (VAR elem: FMElems.Elem): BOOLEAN; PROCEDURE (iter: Iterator) Reset*; PROCEDURE NewIterator* (list: List): Iterator; PROCEDURE (r: Reader) GetBytes* (VAR buffer: ARRAY OF CHAR; VAR len: INTEGER); PROCEDURE (w: Writer) PutBytes* (VAR buffer: ARRAY OF CHAR; len: INTEGER); (* GO, 270196 *) PROCEDURE (d: Device) NeedCopyMoveControl*(): BOOLEAN; (* GO, 270196 *) PROCEDURE (d: Device) Append* (VAR path: ARRAY OF CHAR; name: ARRAY OF CHAR); PROCEDURE (d: Device) CheckIdentity* (elem: FMElems.Elem; name: ARRAY OF CHAR): BOOLEAN; PROCEDURE (d: Device) NewReader* (parent: FMElems.FolderElem; elem: FMElems.Elem): Reader; PROCEDURE (d: Device) NewWriter* (parent: FMElems.FolderElem; elem: FMElems.Elem): Writer; (* GO, 270195 *) PROCEDURE (d: Device) Enumerate* (parent: FMElems.FolderElem; list: List; pattern: ARRAY OF CHAR); PROCEDURE (d: Device) GetElem* (parent: FMElems.FolderElem; name: ARRAY OF CHAR): FMElems.Elem; PROCEDURE (d: Device) GetPath* (folder: FMElems.FolderElem; VAR path: ARRAY OF CHAR); PROCEDURE (d: Device) GetTrash* (VAR attributes: FMElems.Attributes; sortOrder: ARRAY OF CHAR): FMElems.FolderElem; PROCEDURE (d: Device) NewDirectory* (parent: FMElems.FolderElem; name: ARRAY OF CHAR); PROCEDURE (d: Device) NewSortList* (folder: FMElems.FolderElem): List; PROCEDURE (d: Device) Open* (parent: FMElems.FolderElem; elem: FMElems.Elem); PROCEDURE (d: Device) Rename* (parent: FMElems.FolderElem; elem: FMElems.Elem; VAR name: ARRAY OF CHAR); PROCEDURE (d: Device) MoveToTrash* (parent: FMElems.FolderElem; elem: FMElems.Elem); PROCEDURE (d: Device) DeleteFiles* (root: Node); PROCEDURE (d: Device) Copy* (destParent, srcParent: FMElems.FolderElem; elem: FMElems.Elem; srcDev: Device); PROCEDURE (d: Device) SourceCopy* (destParent, srcParent: FMElems.FolderElem; elem: FMElems.Elem; srcDev: Device); PROCEDURE (d: Device) CopyDir* (destParent, srcParent, elem: FMElems.FolderElem; srcDev: Device); PROCEDURE (d: Device) Move* (destParent, srcParent: FMElems.FolderElem; elem: FMElems.Elem; srcDev: Device); PROCEDURE (d: Device) SourceMove* (destParent, srcParent: FMElems.FolderElem; elem: FMElems.Elem; srcDev: Device); PROCEDURE (d: Device) MoveDir* (destParent, srcParent, elem: FMElems.FolderElem; srcDev: Device); PROCEDURE (d: Device) CopyMoveFiles*(destParent: FMElems.FolderElem; srcDev: Device; srcRoot: Node; copy: BOOLEAN); END FMDevObj.