-- TiogaPGSupport.Mesa -- written by Bill Paxton, January 1981 -- last written by Paxton. March 20, 1981 1:47 PM DIRECTORY TiogaFileOps, TextLooks, TextNode, Rope; TiogaPGSupport: DEFINITIONS = BEGIN OPEN nodeI:TextNode, fOpsI:TiogaFileOps, looksI:TextLooks; PGF: TYPE = REF PGFBody; -- PGF is the file-level symbol table structure for put/get PGFBody: TYPE; PGS: TYPE = REF PGSBody; -- PGS if the style-level symbol table structure for put/get PGSBody: PRIVATE TYPE = RECORD [ stylename: nodeI.StyleName, typeNext: CARDINAL ← 0, -- next available TypeIndex typeTable: ARRAY fOpsI.TypeIndex OF nodeI.TypeName, typeHashKeys: ARRAY TypeHashIndex OF TypeHashKey, typeHashVals: ARRAY TypeHashIndex OF TypeHashVal, looksNext: CARDINAL ← 0, -- next available LooksIndex looksTable: ARRAY fOpsI.LooksIndex OF looksI.Looks, looksHashKeys: ARRAY LooksHashIndex OF LooksHashKey, looksHashVals: ARRAY LooksHashIndex OF LooksHashVal ]; TypeHashIndex: TYPE = [0 .. typeHashSize); typeHashSize: PRIVATE CARDINAL = IF fOpsI.numTypes > 85 THEN 256 ELSE 128; -- Should be power of 2 TypeHashKey: PRIVATE TYPE = RECORD [key: nodeI.TypeName ← nodeI.nullTypeName]; TypeHashVal: PRIVATE TYPE = RECORD [index: fOpsI.TypeIndex]; LooksHashIndex: TYPE = [0 .. looksHashSize); looksHashSize: PRIVATE CARDINAL = IF fOpsI.numLooks > 85 THEN 256 ELSE 128; -- Should be power of 2 LooksHashKey: PRIVATE TYPE = RECORD [key: looksI.Looks ← looksI.noLooks]; LooksHashVal: PRIVATE TYPE = RECORD [index: fOpsI.LooksIndex]; CreatePGF: PROC RETURNS [PGF]; GetPGS: PROC [stylename: nodeI.StyleName, pgf: PGF] RETURNS [PGS]; -- creates a new one if necessary -- keeps record of them with the pgf RetrievePGS: PROC [index: fOpsI.StyleIndex, pgf: PGF] RETURNS [PGS]; EnterPGS: PROC [pgs: PGS, pgf: PGF] RETURNS [ok: BOOLEAN, index: fOpsI.StyleIndex]; RetrieveStyleName: PROC [pgs: PGS] RETURNS [stylename: nodeI.StyleName] = INLINE { RETURN [pgs.stylename] }; RetrieveTypeName: PROC [index: fOpsI.TypeIndex, pgs: PGS] RETURNS [typename: nodeI.TypeName] = INLINE BEGIN IF index >= pgs.typeNext THEN ERROR; RETURN [pgs.typeTable[index]]; END; EnterTypeName: PROC [typename: nodeI.TypeName, pgs: PGS] RETURNS [ok: BOOLEAN, index: fOpsI.TypeIndex]; RetrieveLooks: PROC [index: fOpsI.LooksIndex, pgs: PGS] RETURNS [looks: looksI.Looks] = INLINE BEGIN IF index >= pgs.looksNext THEN ERROR; RETURN [pgs.looksTable[index]]; END; EnterLooks: PROC [looks: looksI.Looks, pgs: PGS] RETURNS [ok: BOOLEAN, index: fOpsI.LooksIndex]; END.