DIRECTORY IO, IPInterpreter, Rope; IPVectorImpl: CEDAR PROGRAM IMPORTS IO, IPInterpreter, Rope EXPORTS IPInterpreter ~ BEGIN OPEN IPInterpreter; Shape: PUBLIC PROC[v: Vector] RETURNS[VectorShape] ~ { RETURN[v.class.shape[v]] }; Get: PUBLIC PROC[v: Vector, j: Integer] RETURNS[Any] ~ { RETURN[v.class.get[v, j]] }; GetInteger: PUBLIC PROC[v: Vector, j: Integer] RETURNS[Integer] ~ { RETURN[IntegerFromAny[Get[v, j]]]; }; GetReal: PUBLIC PROC[v: Vector, j: Integer] RETURNS[REAL] ~ { RETURN[RealFromAny[Get[v, j]]]; }; GetProp: PUBLIC PROC[v: Vector, propName: Any] RETURNS[found: BOOL, value: Any] ~ { IF v.class.getProp#NIL THEN [found, value] _ v.class.getProp[v, propName] ELSE { shape: VectorShape ~ Shape[v]; IF NOT Even[shape.n] THEN { MasterError[$invalidArgs, "Property vector has illegal shape."]; ERROR Error; }; FOR i: Integer _ shape.l, i+2 WHILE i<(shape.l+shape.n) DO IF EqName[Get[v, i], propName] THEN RETURN[TRUE, Get[v, i+1]]; ENDLOOP; RETURN[found: FALSE, value: NIL]; }; }; GetP: PUBLIC PROC[v: Vector, propName: Any] RETURNS[Any] ~ { found: BOOL; value: Any; [found, value] _ GetProp[v, propName]; IF found THEN RETURN[value] ELSE { MasterError[$undefinedProperty, "Undefined property."]; ERROR Error; }; }; RunSize: PUBLIC PROC[r: Vector] RETURNS[Integer] ~ { shape: VectorShape ~ Shape[r]; s: Integer _ 0; -- sum of the run lengths IF NOT(shape.l=0 AND Even[shape.n]) THEN { MasterError[$invalidArgs, "Run encoded vector has illegal shape."]; ERROR Error; }; FOR j: Integer _ 0, j+2 WHILE j IF b=255 THEN state _ escape ELSE IF action[offset*256+b] THEN RETURN[TRUE]; escape => IF b=255 THEN state _ escape2 ELSE { offset _ b; state _ run }; escape2 => IF b=0 THEN state _ extended ELSE ERROR; extended => IF b=255 THEN state _ escape ELSE { offset _ b; state _ extended2 }; extended2 => { IF action[offset*256+b] THEN RETURN[TRUE]; state _ extended }; ENDCASE; ENDLOOP; IF NOT(state=run OR state=extended) THEN MasterWarning[$illegalString, "Encoded string ended in wrong state."]; RETURN[FALSE]; }; stringClass: VectorClass ~ NEW[VectorClassRep _ [type: $String, shape: StringShape, get: StringGet]]; StringShape: PROC[v: Vector] RETURNS[VectorShape] ~ { string: ROPE ~ NARROW[v.data]; n: Integer _ 0; action: CharAction ~ { n _ n+1 }; [] _ StringMap[string, action]; RETURN[[l: 0, n: n]]; }; StringGet: PROC[v: Vector, j: Integer] RETURNS[Any] ~ { string: ROPE ~ NARROW[v.data]; n: Integer _ 0; result: Integer; action: CharAction ~ { IF n=j THEN { result _ c; RETURN[TRUE] } ELSE n _ n+1 }; IF StringMap[string, action] THEN RETURN[NumberFromInteger[result]] ELSE { MasterError[$boundsFault, "Invalid index for string."]; ERROR Error; }; }; VectorFromString: PUBLIC PROC[string: ROPE] RETURNS[Vector] ~ { RETURN[NEW[VectorRep _ [class: stringClass, data: string]]]; }; StringFromVector: PUBLIC PROC[v: Vector] RETURNS[ROPE] ~ { IF v.class.type=$String THEN { string: ROPE ~ NARROW[v.data]; RETURN[string]; } ELSE { shape: VectorShape ~ Shape[v]; stream: STREAM ~ IO.ROS[]; offset: BYTE _ 0; FOR i: Integer IN[shape.l .. shape.l+shape.n) DO char: CARDINAL ~ GetInteger[v, i]; IF (char/256)#offset THEN { stream.PutChar[VAL[255]]; stream.PutChar[VAL[offset _ char/256]]; }; stream.PutChar[VAL[char MOD 256]]; ENDLOOP; RETURN[IO.RopeFromROS[stream]]; }; }; RopeFromVector: PUBLIC PROC[v: Vector] RETURNS[ROPE] ~ { IF v.class.type=$String THEN { string: ROPE ~ NARROW[v.data]; stream: STREAM ~ IO.ROS[]; action: CharAction ~ { stream.PutChar[VAL[c]] }; [] _ StringMap[string, action]; RETURN[IO.RopeFromROS[stream]]; } ELSE { shape: VectorShape ~ Shape[v]; i: Integer _ 0; p: PROC RETURNS[CHAR] ~ { b: BYTE ~ GetInteger[v, shape.l+i]; i _ i+1; RETURN[VAL[b]] }; RETURN[Rope.FromProc[len: shape.n, p: p]]; }; }; END. าIPVectorImpl.mesa Copyright c 1984 Xerox Corporation. All rights reserved. Doug Wyatt, November 15, 1984 5:51:59 pm PST InputVectorStreamData: TYPE ~ REF InputVectorStreamRecord; InputVectorStreamRecord: TYPE ~ RECORD [ v: Vector, length: INT, index: INT ]; InputVectorStreamProcs: REF StreamProcs ~ IO.CreateStreamProcs[ variety: $input, class: $InterpressVector, getChar: InputVectorStreamGetChar, endOf: InputVectorStreamEndOf, getIndex: InputVectorStreamGetIndex, setIndex: InputVectorStreamSetIndex, getLength: InputVectorStreamGetLength ]; StreamFromVector: PUBLIC PROC[v: Vector, xxx: Xxx] RETURNS [stream: STREAM] ~ { RETURN[IO.CreateStream[InputVectorStreamProcs, NEW[InputVectorStreamRecord _ [v: v, length: rope.Length[], index: 0]]]]; }; InputVectorStreamGetChar: PROC [self: STREAM] RETURNS [char: CHAR] ~ { data: InputVectorStreamData ~ NARROW[self.streamData]; IF data.index >= data.length THEN ERROR IO.EndOfStream[self] ELSE { j: Integer ~ data.index/data.bytesPerElement; char _ data.rope.InlineFetch[data.index]; data.index _ data.index + 1; }; }; InputVectorStreamEndOf: PROC [self: STREAM] RETURNS [BOOL] ~ { data: InputVectorStreamData ~ NARROW[self.streamData]; RETURN[data.index >= data.length]; }; InputVectorStreamGetIndex: PROC [self: STREAM] RETURNS [INT] ~ { data: InputVectorStreamData ~ NARROW[self.streamData]; RETURN[data.index]; }; InputVectorStreamSetIndex: PROC [self: STREAM, index: INT] ~ { data: InputVectorStreamData ~ NARROW[self.streamData]; IF index NOT IN [0 .. data.length] THEN ERROR IO.Error[$BadIndex, self]; data.index _ index; }; InputVectorStreamGetLength: PROC [self: STREAM] RETURNS [length: INT] ~ { data: InputVectorStreamData ~ NARROW[self.streamData]; RETURN[data.length]; }; ส Z˜šœ™Jšœ ฯmœ.™9Jšœ,™,—J™šฯk ˜ Jšžœ˜Jšœ˜Jšœ˜J˜—Jšœžœž˜Jšžœžœ˜Jšžœ˜Jšœžœžœ˜J˜š ฯnœžœžœ žœžœ˜RJ˜—Jš Ÿœžœžœžœ žœ˜UJ˜šŸ œžœžœžœ ˜CJšžœ˜"J˜J˜—š Ÿœžœžœžœžœ˜=Jšžœ˜J˜J˜—š Ÿœžœžœžœžœ˜SJšžœžœžœ.˜Išžœ˜J˜šžœžœžœ˜Jšœ@˜@Jšžœ˜ J˜—šžœžœž˜:Jšžœžœžœžœ˜>Jšžœ˜—Jšžœžœ žœ˜!J˜—J˜J˜—šŸœžœžœžœ ˜Jš žœžœž œžœ žœžœ˜AJšžœžœ0˜:J˜J˜—šŸ œžœ žœ˜3Jšœžœ(˜1Jš žœžœžœ žœžœ˜3J˜J˜—šŸœžœžœžœ ˜>Jšžœžœ;˜EJ˜J˜—šŸœžœžœ žœ ˜:šžœžœ˜Jšœžœ ˜Jšžœ˜J˜—šžœ˜J˜Jšœžœ,˜>Jš žœžœžœ žœžœ˜BJšžœ˜J˜—J˜J˜—J˜Jšœ žœžœ˜%Jšœžœžœ˜-šœžœ!˜?Jšœ=˜=—J˜šŸ œžœ žœ˜5Jšœžœ ˜"JšœT˜TJšžœ˜ J˜J˜—šŸ œžœžœ ˜7Jšœžœ ˜"JšœR˜RJšžœ˜ Jšœ˜J˜—šŸ œžœžœžœ˜RJšœžœ ˜"J˜,Jšžœžœžœ-˜>Jšœ˜J˜—šŸ œžœžœžœ ˜:Jšœžœ#˜9Jšžœžœ0˜:J˜J˜—J˜Jš œ žœžœžœžœžœžœ˜AJšžœžœ ˜J˜š Ÿ œžœžœžœžœ˜AJšœžœ˜Jšœ9˜9šžœžœžœž˜&Jšœžœžœžœ˜)šžœž˜Jšœžœžœžœžœžœžœžœ˜SJšœ žœžœžœ˜IJš œ žœžœžœžœ˜3Jšœ žœžœžœ#˜PJš œžœžœžœžœ˜MJšžœ˜—Jšžœ˜—šžœžœ žœž˜(JšœF˜F—Jšžœžœ˜J˜J˜—šœžœ!˜?Jšœ%˜%—J˜šŸ œžœ žœ˜5Jšœžœžœ ˜Jšœ˜Jšœ!˜!Jšœ˜Jšžœ˜J˜J˜—šŸ œžœžœ ˜7Jšœžœžœ ˜Jšœ˜J˜Jš œžœžœžœžœžœ ˜OJšžœžœžœ˜Cšžœ˜Jšœ7˜7Jšžœ˜ J˜—Jšœ˜J˜—J˜š Ÿœžœžœ žœžœ ˜?Jšžœžœ2˜—Jšžœ$˜*J˜—J˜J˜—J˜J™Jšœžœžœ™;šœžœžœ™(Jšœ ™ Jšœžœ™ Jšœž™ J™—J™šœžœ$™?Jšœ*™*Jšœ"™"Jšœ™Jšœ$™$Jšœ$™$Jšœ%™%J™—unitšŸœžœžœ™2Jšžœ žœ™šžœžœ%™.JšžœF™I—Jšœ™—š Ÿœžœžœžœžœ™FJšœžœ™6Jšžœžœžœžœ™<šžœ™J™-J™)J™J™—Jšœ™—š Ÿœžœžœžœžœ™>Jšœžœ™6Jšžœ™"Jšœ™—š Ÿœžœžœžœžœ™@Jšœžœ™6Jšžœ ™Jšœ™—šŸœžœžœ žœ™>Jšœžœ™6Jš žœžœžœžœžœžœ™HJ™Jšœ™—š Ÿœžœžœžœ žœ™IJšœžœ™6Jšžœ™Jšœ™—J˜Jšžœ˜—…—4/`