DIRECTORY OtherNode, TextNode, RefTab, Rope; OtherNodeImpl: CEDAR PROGRAM IMPORTS RefTab, TextNode EXPORTS OtherNode = BEGIN OPEN OtherNode; ROPE: TYPE = Rope.ROPE; ReaderProcRef: TYPE = REF ReaderProcRec; ReaderProcRec: TYPE = RECORD [proc: ReadSpecsProc]; WriterProcRef: TYPE = REF WriterProcRec; WriterProcRec: TYPE = RECORD [proc: WriteSpecsProc]; CopierProcRef: TYPE = REF CopierProcRec; CopierProcRec: TYPE = RECORD [proc: CopyInfoProc]; readerTable: RefTab.Ref _ RefTab.Create[zone: TextNode.pZone]; writerTable: RefTab.Ref _ RefTab.Create[zone: TextNode.pZone]; copierTable: RefTab.Ref _ RefTab.Create[zone: TextNode.pZone]; Register: PUBLIC PROC [variety: ATOM, reader: ReadSpecsProc, writer: WriteSpecsProc, copier: CopyInfoProc] = { IF variety=NIL THEN RETURN; [] _ RefTab.Store[readerTable,variety,TextNode.pZone.NEW[ReaderProcRec _ [reader]]]; [] _ RefTab.Store[writerTable,variety,TextNode.pZone.NEW[WriterProcRec _ [writer]]]; [] _ RefTab.Store[copierTable,variety,TextNode.pZone.NEW[CopierProcRec _ [copier]]] }; DoSpecs: PUBLIC PROC [n: RefOtherNode, specs: ROPE] = { procRef: ReaderProcRef; proc: ReadSpecsProc; IF n.variety=NIL OR (procRef _ NARROW[RefTab.Fetch[readerTable,n.variety].val])=NIL OR (proc _ procRef.proc)=NIL THEN n.info _ specs ELSE proc[n,specs] }; GetSpecs: PUBLIC PROC [n: RefOtherNode] RETURNS [specs: ROPE] = { procRef: WriterProcRef; proc: WriteSpecsProc; IF n.variety=NIL OR (procRef _ NARROW[RefTab.Fetch[writerTable,n.variety].val])=NIL OR (proc _ procRef.proc)=NIL THEN IF n.info=NIL THEN specs _ NIL ELSE WITH n.info SELECT FROM rope: ROPE => specs _ rope; ENDCASE => specs _ NIL ELSE specs _ proc[n] }; CopyInfo: PUBLIC PROC [old: RefOtherNode] RETURNS [newinfo: REF ANY] = { procRef: CopierProcRef; proc: CopyInfoProc; IF old.variety=NIL OR (procRef _ NARROW[RefTab.Fetch[copierTable,old.variety].val])=NIL OR (proc _ procRef.proc)=NIL THEN newinfo _ old.info ELSE newinfo _ proc[old] }; Start: PUBLIC PROC = { }; END. ´-- OtherNodeImpl.Mesa -- Written by Bill Paxton, May 1981 -- last written by McGregor. June 10, 1982 4:46 pm -- ***** Operations -- registers these procs for this variety of node -- they will be called by DoSpecs, GetSpecs, and CopyInfo -- used when reading files -- calls the registered reader for this variety of node -- sets n.info _ specs if no reader is registered -- used when writing files -- calls the registered writer for this variety of node -- if no writer is registered, returns n.info if it is a rope, NIL otherwise -- used when copying nodes -- calls the registered copier for this variety of node -- if no copier is registered, returns old.info -- ***** Initialization Ê8˜JšÏc™Jš#™#Jš2™2J˜J˜JšÏk ˜ J˜ J˜ J˜J˜J˜šœž ˜Jšžœ˜Jšžœ ˜—Jšž˜Jšžœ ˜J˜Jšžœžœžœ˜J˜J˜Jš™J˜Jšœžœžœ˜(Jšœžœžœ˜3J˜Jšœžœžœ˜(Jšœžœžœ˜4J˜Jšœžœžœ˜(Jšœžœžœ˜2J˜J˜>J˜>J˜>J˜šÏnœžœžœ žœ˜%J˜J˜J˜Jš1™1Jš:™:Jšžœ žœžœžœ˜Jšœ5žœ˜TJšœ5žœ˜TJšœ5žœ˜VJ˜—šŸœžœžœžœ˜7Jš™Jš7™7Jš1™1J˜J˜šžœ žœž˜Jšœ žœ+žœž˜BJšœž˜—Jšžœ˜Jšžœ˜J˜—š Ÿœžœžœžœ žœ˜AJš™Jš7™7JšL™LJ˜J˜šžœ žœž˜Jšœ žœ+žœž˜BJšœž˜—š žœžœžœžœ ž˜#šžœžœžœž˜Jšœžœ˜Jšžœ ž˜——Jšžœ˜J˜—š Ÿœžœžœžœ žœžœ˜HJš™Jš7™7Jš/™/J˜J˜šžœ žœž˜Jšœ žœ-žœž˜DJšœž˜—Jšžœ˜Jšžœ˜J˜J˜—Jš™J˜šŸœžœžœ˜J˜J˜—Jšžœ˜J˜—…—Ä °