DIRECTORY Atom, PS, RefText, Rope; PS2Impl: CEDAR PROGRAM IMPORTS Atom, PS, RefText, Rope ~ BEGIN OPEN PS; ROPE: TYPE ~ Rope.ROPE; ArrayNew: PUBLIC PROC [size: INT] RETURNS [Array] ~ { IF size IN ArrayIndex THEN { base: ArrayBase ~ NEW[ArrayBaseRep[size]]; RETURN[[executable: FALSE, access: unlimited, start: 0, length: size, base: base]]; } ELSE ERROR Error[IF size<0 THEN rangecheck ELSE limitcheck]; }; ArrayTransfer: PUBLIC PROC [to: ArrayBase, toStart: ArrayIndex, from: ArrayBase, fromStart: ArrayIndex, length: ArrayIndex] ~ { FOR i: ArrayIndex IN[0..length) DO to[toStart+i] _ from[fromStart+i]; ENDLOOP; }; ArrayGet: PUBLIC PROC [array: Array, index: INT] RETURNS [Any] ~ { IF index NOT IN[0..array.length) THEN ERROR Error[rangecheck]; RETURN [array.base[array.start+index]]; }; ArrayPut: PUBLIC PROC [array: Array, index: INT, x: Any] ~ { IF index NOT IN[0..array.length) THEN ERROR Error[rangecheck]; array.base[array.start+index] _ x; }; ArrayGetInterval: PUBLIC PROC [array: Array, index, count: INT] RETURNS [Array] ~ { IF index NOT IN[0..array.length] THEN ERROR Error[rangecheck]; IF count NOT IN[0..array.length-index] THEN ERROR Error[rangecheck]; RETURN [[executable: array.executable, access: array.access, start: array.start+index, length: count, base: array.base]]; }; ArrayPutInterval: PUBLIC PROC [array: Array, index: INT, interval: Array] ~ { IF index NOT IN[0..array.length] THEN ERROR Error[rangecheck]; IF interval.length NOT IN[0..array.length-index] THEN ERROR Error[rangecheck]; ArrayTransfer[to: array.base, toStart: array.start+index, from: interval.base, fromStart: interval.start, length: interval.length]; }; ArrayCopy: PUBLIC PROC [array1, array2: Array] RETURNS [Array] ~ { subarray2: Array ~ ArrayGetInterval[array2, 0, array1.length]; ArrayPutInterval[subarray2, 0, array1]; RETURN [subarray2]; }; ArrayStore: PUBLIC PROC [stack: Stack, array: Array] ~ { IF stack.count found _ TRUE; ENDLOOP; }; IF found THEN { match: String ~ StringGetInterval[string, 0, seek.length]; post: String ~ StringGetInterval[string, seek.length, string.length-seek.length]; PushString[self.ostack, post]; PushString[self.ostack, match]; PushBool[self.ostack, TRUE]; } ELSE { PushString[self.ostack, string]; PushBool[self.ostack, FALSE]; }; }; Psearch: PROC [self: Root] ~ { seek: String ~ PopString[self.ostack]; string: String ~ PopString[self.ostack]; found: BOOL _ FALSE; skip: StringIndex _ 0; IF string.access found _ TRUE; ENDLOOP; ENDLOOP; IF found THEN { pre: String ~ StringGetInterval[string, 0, skip]; match: String ~ StringGetInterval[string, skip, seek.length]; post: String ~ StringGetInterval[string, skip+seek.length, string.length-(skip+seek.length)]; PushString[self.ostack, post]; PushString[self.ostack, match]; PushString[self.ostack, pre]; PushBool[self.ostack, TRUE]; } ELSE { PushString[self.ostack, string]; PushBool[self.ostack, FALSE]; }; }; Plength: PROC [self: Root] ~ { x: Any ~ Pop[self.ostack]; length: INT _ 1; SELECT Type[x] FROM array => { array: Array ~ ArrayFromAny[x]; IF array.access { string: String ~ StringFromAny[x]; IF string.access { dict: Dict ~ DictFromAny[x]; IF dict.base.access { array: Array ~ ArrayFromAny[x]; i: INT ~ IntFromAny[index]; IF array.access { string: String ~ StringFromAny[x]; i: INT ~ IntFromAny[index]; IF string.access { dict: Dict ~ DictFromAny[x]; IF dict.base.access ERROR Error[typecheck]; }; Pput: PROC [self: Root] ~ { val: Any ~ Pop[self.ostack]; key: Any ~ Pop[self.ostack]; x: Any ~ Pop[self.ostack]; SELECT Type[x] FROM array => { array: Array ~ ArrayFromAny[x]; index: INT ~ IntFromAny[key]; IF array.access { string: String ~ StringFromAny[x]; index: INT ~ IntFromAny[key]; int: INT ~ IntFromAny[val]; IF string.access { dict: Dict ~ DictFromAny[x]; IF dict.base.access ERROR Error[typecheck]; }; Pgetinterval: PROC [self: Root] ~ { count: INT ~ PopInt[self.ostack]; index: INT ~ PopInt[self.ostack]; x: Any ~ Pop[self.ostack]; SELECT Type[x] FROM array => { array: Array ~ ArrayFromAny[x]; IF array.access { string: String ~ StringFromAny[x]; IF string.access ERROR Error[typecheck]; }; Pputinterval: PROC [self: Root] ~ { x2: Any ~ Pop[self.ostack]; index: INT ~ PopInt[self.ostack]; x1: Any ~ Pop[self.ostack]; SELECT Type[x1] FROM array => { array1: Array ~ ArrayFromAny[x1]; array2: Array ~ ArrayFromAny[x2]; IF array1.access { string1: String ~ StringFromAny[x1]; string2: String ~ StringFromAny[x2]; IF string1.access ERROR Error[typecheck]; }; Pcopy: PROC [self: Root] ~ { x2: Any ~ Pop[self.ostack]; SELECT Type[x2] FROM integer => { n: INT ~ IntFromAny[x2]; Copy[self.ostack, n]; }; array => { array2: Array ~ ArrayFromAny[x2]; array1: Array ~ PopArray[self.ostack]; IF array1.access { string2: String ~ StringFromAny[x2]; string1: String ~ PopString[self.ostack]; IF string1.access { dict2: Dict ~ DictFromAny[x2]; dict1: Dict ~ PopDict[self.ostack]; IF dict1.base.access ERROR Error[typecheck]; }; Register2: PROC [self: Root] ~ { Register[self, "array", Parray]; Register[self, "[", Pstartarray]; Register[self, "]", Pendarray]; Register[self, "aload", Paload]; Register[self, "astore", Pastore]; Register[self, "string", Pstring]; Register[self, "anchorsearch", Panchorsearch]; Register[self, "search", Psearch]; Register[self, "length", Plength]; Register[self, "get", Pget]; Register[self, "put", Pput]; Register[self, "getinterval", Pgetinterval]; Register[self, "putinterval", Pputinterval]; Register[self, "copy", Pcopy]; }; RegisterPrimitives[Register2]; END. PS2Impl.mesa Copyright Σ 1986 by Xerox Corporation. All rights reserved. Doug Wyatt, October 29, 1986 5:22:52 pm PST PostScript implementation: array, string, and name operations. Array operations String operations ***** use ByteBlt here ? ***** Name operations Primitives Κw˜codešœ ™ Kšœ<™K™šΟk ˜ K˜Kšœ˜K˜Kšœ˜—K˜KšΟnœœ˜Kšœœ˜šœœœœ˜K˜Kšœœœ˜—head™š žœœœœœ ˜5šœœ œ˜Kšœœ˜*Kšœœ:˜SK˜—Kš œœœœ œ ˜Kšœ!˜'K˜K˜—šžœœœœ ˜Kšœ"˜"K˜K˜—š žœœœœœ ˜SKš œœœœœ˜>Kš œœœœœ˜DKšœt˜zK˜K˜—šžœœœœ˜MKš œœœœœ˜>Kš œœœœœ˜NKšœ„˜„K˜K˜—šž œœœœ ˜BK˜>K˜'Kšœ ˜K˜K˜—šž œœœ!˜8Kšœœœ˜>Kšœ'˜'K˜uK˜K˜—šž œœœ!˜7Kšœ'œœ˜JK˜uKšœ'˜'K˜K˜——™š ž œœœœœ ˜7šœœ œ˜Kšœœœ˜#Kšœœ:˜SK˜—Kš œœœœ œ ˜Kšœ œœ(˜9Kšœœœ ˜Kšœ\˜\Kšœ&˜&K˜ K˜K˜——™š ž œœœœœœ ˜KKšœœ˜!Kšœ˜K˜K˜—š žœœœœœ ˜QKšœœ˜$Kšœ˜K˜K˜—šž œœœ ˜DKšœœ˜&Kšœ?˜?šœœœ˜"Kšœ2˜2Kšœ˜—Kšœ ˜K˜K˜——™ šžœœ˜Kšœœ˜ Kšœ'˜'K˜K˜—šž œœΟc˜'K˜K˜K˜—šž œœŸ˜%Kšœœ˜%Kšœ˜K˜K˜K˜K˜K˜—šžœœ˜K˜%Kšœœœ˜9K˜K˜K˜K˜—šžœœ˜K˜%Kšœœœ˜:K˜K˜K˜K˜—K˜šžœœ˜Kšœœ˜ Kšœ)˜)K˜K˜—šž œœ˜$K˜&K˜(Kšœœœ˜Kšœœœœ˜Ršœœ˜$šœœ˜(Kšœ5œœ˜AKšœœ œ˜ Kšœ˜—K˜—šœœ˜K˜:K˜QKšœ˜K˜Kšœœ˜K˜—šœ˜Kšœ ˜ Kšœœ˜K˜—K˜K˜—šžœœ˜K˜&K˜(Kšœœœ˜K˜Kšœœœœ˜Ršœœœ"˜Gšœœ˜(Kšœ:œœ˜FKšœœ œ˜ Kšœ˜—Kšœ˜—šœœ˜K˜1K˜=K˜]Kšœ˜K˜K˜Kšœœ˜K˜—šœ˜Kšœ ˜ Kšœœ˜K˜—K˜K˜—J˜šžœœ˜K˜Kšœœ˜šœ ˜šœ ˜ Kšœ˜Kšœœœ˜9K˜Kšœ˜—šœ ˜ Kšœ"˜"Kšœœœ˜:K˜Kšœ˜—šœ ˜ Kšœ˜Kšœœœ˜=K˜Kšœ˜—Kšœ˜—K˜K˜K˜—šžœœ˜Kšœ˜K˜šœ ˜šœ ˜ K˜Kšœœ˜Kšœœœ˜9J˜&Kšœ˜—šœ ˜ K˜"Kšœœ˜Kšœœœ˜:J˜+Kšœ˜—šœ ˜ K˜Kšœœœ˜=J˜(Kšœ˜—Kšœœ˜"—K˜K˜—šžœœ˜Kšœ˜Kšœ˜K˜šœ ˜šœ ˜ K˜Kšœœ˜Kšœœœ˜:Jšœ˜Kšœ˜—šœ ˜ K˜"Kšœœ˜Kšœœ˜Kšœœœ˜;J˜Kšœ˜—šœ ˜ K˜Kšœœœ˜>Jšœ˜Kšœ˜—Kšœœ˜"—K˜K˜—šž œœ˜#Kšœœ˜!Kšœœ˜!K˜šœ ˜šœ ˜ K˜Kšœœœ˜9J˜>Kšœ˜—šœ ˜ K˜"Kšœœœ˜:J˜AKšœ˜—Kšœœ˜"—K˜K˜—šž œœ˜#K˜Kšœœ˜!K˜šœ ˜šœ ˜ K˜!K˜!Kšœœœ˜:Kšœœœ˜;J˜(Kšœ˜—šœ ˜ K˜$K˜$Kšœœœ˜;Kšœœœ˜Kšœœœ˜?J˜.Kšœ˜—Kšœœ˜"—K˜K˜—J˜šž œœ˜ Kšœ ˜ Kšœ!˜!Kšœ˜Kšœ ˜ Kšœ"˜"Kšœ"˜"Kšœ.˜.Kšœ"˜"Kšœ"˜"Kšœ˜Kšœ˜Kšœ,˜,Kšœ,˜,Kšœ˜J˜J˜—J˜—J˜Jšœ˜—…—0’@3