<> <> <> <<>> <> <<>> DIRECTORY Basics USING [BYTE], IO USING [STREAM], Rope USING [MaxLen, ROPE]; IPMaster: CEDAR DEFINITIONS ~ BEGIN BYTE: TYPE ~ Basics.BYTE; STREAM: TYPE ~ IO.STREAM; ROPE: TYPE ~ Rope.ROPE; MaxLen: INT ~ Rope.MaxLen; MaxTextLen: NAT ~ NAT.LAST; <> Version: TYPE ~ RECORD [major, minor: CARDINAL]; -- Interpress version number currentVersion: Version ~ [3, 0]; -- latest version supported by this interface Op: TYPE ~ { nil, -- BASE primitives get, makeveclu, makevec, shape, openvec, getprop, getp, mergeprop, frame, fget, fset, poolop, pool, pget, pset, env, makepool, nopool, makeco, makesimpleco, do, dosave, dosaveall, dobody, dosavebody, dosaveallbody, dosavesimplebody, makecompiledimage, pop, copy, dup, roll, exch, mark, unmark, unmark0, count, nop, error, if, ifelse, ifcopy, loop, eq, eqname, gt, ge, and, or, not, type, add, sub, neg, abs, floor, ceiling, trunc, round, mul, div, mod, rem, max, min, sqrt, exp, log, sin, cos, atan, -- IMAGE primitives iget, iset, dround, maket, opent, translate, rotate, scale, scale2, concat, invert, transform, transformvec, roundxy, roundxyvec, concatt, move, trans, show, showandxrel, setxy, setxyrel, setxrel, setyrel, getcp, getcprounded, makepixelarray, extractpixelarray, joinpixelarrays, finddecompressor, makegray, findcolor, findcoloroperator, findcolormodeloperator, makesampledcolor, makesampledblack, setgray, moveto, lineto, linetox, linetoy, curveto, conicto, arcto, makeoutline, maskfill, maskfillparity, maskstroke, maskstrokeclosed, maskrectangle, maskvector, startunderline, maskunderline, masktrapezoidx, masktrapezoidy, maskpixel, clipoutline, excludeoutline, cliprectangle, excluderectangle, findfont, findfontvec, modifyfont, setfont, correctmask, correctspace, space, amplifiedspace, setcorrectmeasure, setcorrecttolerance, correct, spare1, spare2, spare3, -- Symbols beginBody, endBody, beginBlock, endBlock, pageInstructions, noPages, metricMaster, environmentMaster }; ImagerVariable: TYPE ~ MACHINE DEPENDENT { DCScpx(0), DCScpy(1), correctMX(2), correctMY(3), T(4), priorityImportant(5), mediumXSize(6), mediumYSize(7), fieldXMin(8), fieldYMin(9), fieldXMax(10), fieldYMax(11), showVec(12), color(13), noImage(14), strokeWidth(15), strokeEnd(16), underlineStart(17), amplifySpace(18), correctPass(19), correctShrink(20), correctTX(21), correctTY(22), strokeJoint(23), strokeDashes(24), clipper(25), -- these are not yet standard spare1(26), spare2(27) -- room for spares (correctExpand?) }; StrokeEnd: TYPE ~ MACHINE DEPENDENT {square(0), butt(1), round(2)}; StrokeJoint: TYPE ~ MACHINE DEPENDENT {mitered(0), round(1)}; -- not yet standard ErrorClass: TYPE ~ {nil, masterError, masterWarning, appearanceError, appearanceWarning, comment }; <> shortNumberBias: INTEGER ~ 4000; ShortNumber: TYPE ~ [0-shortNumberBias .. 77777B-shortNumberBias]; -- 15 bits EncodingValue: TYPE ~ MACHINE DEPENDENT { -- 13 bits nil(0), nop(1), setxy(10), setxyrel(11), setxrel(12), setyrel(13), linetox(14), linetoy(15), space(16), get(17), iget(18), iset(19), fget(20), fset(21), show(22), lineto(23), maskstroke(24), moveto(25), metricMaster(100), -- nonstandard environmentMaster(101), -- nonstandard beginBlock(102), endBlock(103), noPages(104), -- nonstandard pageInstructions(105), beginBody(106), endBody(107), correct(110), makesimpleco(114), makeco(115), -- nonstandard makecompiledimage(116), -- nonstandard dosavesimplebody(120), dobody(121), -- nonstandard dosavebody(122), -- nonstandard dosaveallbody(123), -- nonstandard showandxrel(146), findfont(147), modifyfont(148), finddecompressor(149), findfontvec(150), -- nonstandard setfont(151), setcorrectmeasure(154), setcorrecttolerance(155), correctmask(156), correctspace(157), amplifiedspace(158), -- nonstandard getcp(159), maket(160), -- nonstandard opent(161), -- nonstandard translate(162), rotate(163), scale(164), concat(165), scale2(166), invert(167), -- nonstandard concatt(168), move(169), trans(170), transform(174), -- nonstandard transformvec(175), -- nonstandard roundxy(176), -- nonstandard roundxyvec(177), -- nonstandard pop(180), dup(181), copy(183), roll(184), exch(185), mark(186), unmark(187), count(188), unmark0(192), abs(200), add(201), and(202), ceiling(203), div(204), eq(205), floor(206), ge(207), gt(208), mod(209), mul(210), neg(211), not(212), or(213), sub(214), trunc(215), rem(216), round(217), eqname(218), -- nonstandard type(220), atan(221), -- nonstandard cos(222), -- nonstandard exp(223), -- nonstandard log(224), -- nonstandard sin(225), -- nonstandard sqrt(226), -- nonstandard max(227), -- nonstandard min(228), -- nonstandard do(231), dosave(232), dosaveall(233), if(239), ifcopy(240), ifelse(241), loop(242), -- nonstandard frame(250), -- nonstandard poolop(253), -- nonstandard pool(254), -- nonstandard pget(255), -- nonstandard pset(256), -- nonstandard makepool(257), -- nonstandard nopool(258), -- nonstandard env(260), -- nonstandard makeveclu(282), makevec(283), shape(285), openvec(286), -- nonstandard getprop(287), getp(288), -- nonstandard mergeprop(289), -- nonstandard dround(300), -- nonstandard getcprounded(301), -- nonstandard curveto(402), -- nonstandard arcto(403), -- nonstandard conicto(404), -- nonstandard maskfillparity(408), -- nonstandard maskfill(409), maskrectangle(410), masktrapezoidx(411), masktrapezoidy(412), startunderline(413), maskunderline(414), makeoutline(417), clipoutline(418), -- nonstandard cliprectangle(419), -- nonstandard findcoloroperator(421), findcolormodeloperator(422), findcolor(423), setgray(424), makegray(425), makesampledblack(426), makesampledcolor(427), excludeoutline(430), -- nonstandard excluderectangle(431), -- nonstandard maskstrokeclosed(440), -- nonstandard maskvector(441), makepixelarray(450), extractpixelarray(451), maskpixel(452), joinpixelarrays(453), -- nonstandard error(600), (17777B) }; ShortEncodingValue: TYPE ~ EncodingValue[VAL[0]..VAL[37B]]; -- 5 bits SequenceType: TYPE ~ MACHINE DEPENDENT { -- 5 bits nil(0), sequenceString(1), sequenceInteger(2), sequenceReal(3), -- nonstandard sequenceRational(4), sequenceIdentifier(5), sequenceComment(6), sequenceContinued(7), sequenceLargeVector(8), sequencePackedPixelVector(9), sequenceCompressedPixelVector(10), sequenceInsertFile(11), sequenceAdaptivePixelVector(12), (37B) }; ShortSequenceLength: TYPE ~ INT[0..377B]; -- 8 bits LongSequenceLength: TYPE ~ INT--[0..77777777B]--; -- 24 bits <> ErrorDesc: TYPE ~ RECORD[code: ATOM, explanation: ROPE, index: INT _ 0]; Error: ERROR[error: ErrorDesc]; EncodingValueFromOp: PROC [Op] RETURNS [EncodingValue]; <> <<>> OpFromEncodingValue: PROC [EncodingValue] RETURNS [Op]; <> <<>> OpFromRope: PROC [ROPE] RETURNS [Op]; <> <<>> RopeFromOp: PROC [Op] RETURNS [ROPE]; <> <<>> RopeFromImagerVariable: PROC [ImagerVariable] RETURNS [ROPE]; <> PartActionType: TYPE ~ PROC [base: ROPE, start, len: INT] RETURNS [quit: BOOL _ FALSE]; MapParts: PROC [base: ROPE, start: INT _ 0, len: INT _ MaxLen, delimiter: CHAR, action: PartActionType] RETURNS [BOOL]; <> <> <> ValidateIdentifier: PROC [rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <> <> <<>> ValidateName: PROC [rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <> <> <> ValidateString: PROC [rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <> <> ValidateVersion: PROC [rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <> <<>> VersionFromRope: PROC [rope: ROPE, start: INT _ 0, len: INT _ MaxLen] RETURNS [Version]; <> <> PutShortNumber: PROC [stream: STREAM, n: ShortNumber]; <> PutShortOp: PROC [stream: STREAM, ev: ShortEncodingValue]; <> PutLongOp: PROC [stream: STREAM, ev: EncodingValue]; <> PutShortSequence: PROC [stream: STREAM, seq: SequenceType, len: ShortSequenceLength]; <> <<>> PutLongSequence: PROC [stream: STREAM, seq: SequenceType, len: LongSequenceLength]; <> <<>> ByteCount: TYPE ~ NAT[0..4]; BytesInInt: PROC [val: INT] RETURNS [ByteCount]; <> PutIntBytes: PROC [stream: STREAM, val: INT, len: ByteCount]; <> <<>> PutByte: PROC [stream: STREAM, byte: BYTE]; <> <<>> PutOp: PROC [stream: STREAM, op: Op]; <> <<>> PutInt: PROC [stream: STREAM, n: INT]; <> <<>> PutRational: PROC [stream: STREAM, n, d: INT]; <> <> PutReal: PROC [stream: STREAM, val: REAL]; <> PutIdentifier: PROC [stream: STREAM, rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <> PutString: PROC [stream: STREAM, rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <> PutName: PROC [stream: STREAM, rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <; "id" produces < id 1 MAKEVEC >.>> <> <> PutSequence: PROC [stream: STREAM, seq: SequenceType, len: INT]; <> <> <<>> PutSequenceRope: PROC [stream: STREAM, seq: SequenceType, rope: ROPE, start: INT _ 0, len: INT _ MaxLen]; <> <<>> PutSequenceText: PROC [stream: STREAM, seq: SequenceType, text: REF READONLY TEXT, start: NAT _ 0, len: NAT _ MaxTextLen]; <> <<>> <> TokenType: TYPE ~ {nil, op, num, seq}; TokenFormat: TYPE ~ {nil, shortOp, longOp, shortNumber, shortSequence, longSequence}; Token: TYPE ~ RECORD[ index: INT _ 0, -- stream index of token's first byte type: TokenType _ nil, -- token type format: TokenFormat _ nil, -- token format op: Op _ nil, -- op value, if type=op (guaranteed nil if type#op) ev: EncodingValue _ nil, -- encoding value, if type=op num: ShortNumber _ ShortNumber.FIRST, -- number value, if type=num seq: SequenceType _ nil, -- sequence type, if type=seq len: INT _ 0 -- sequence data length, if type=seq (guaranteed 0 if type#seq) ]; Body: TYPE ~ REF BodyRep; BodyRep: TYPE ~ RECORD[index, length: INT]; Node: TYPE ~ REF NodeRep; NodeRep: TYPE ~ RECORD[ index, length: INT, pageInstructions: Body, -- may be NIL content: SELECT tag: * FROM body => [body: Body], block => [block: Block], ENDCASE ]; Block: TYPE ~ REF BlockRep; BlockRep: TYPE ~ RECORD[ index, length: INT, noPages: BOOL, preamble: Node, nodes: SEQUENCE size: NAT OF Node ]; Skeleton: TYPE ~ REF SkeletonRep; SkeletonRep: TYPE ~ RECORD[ instructions: Body, -- may be NIL topBlock: Block ]; GetHeader: PROC [stream: STREAM, prefix: ROPE] RETURNS [ROPE]; <> <> <> <> <<>> GetSkeleton: PROC [stream: STREAM] RETURNS [Skeleton]; <> <> <<>> GetToken: PROC [stream: STREAM, flushComments: BOOL _ TRUE] RETURNS [Token]; <> <> <> <<>> SkipBytes: PROC [stream: STREAM, len: INT]; <> <<>> SetIndex: PROC [stream: STREAM, index: INT]; <> <<>> SkipToEndOfBody: PROC [stream: STREAM]; <> <> <<>> CopyBytes: PROC [to: STREAM, from: STREAM, count: INT] RETURNS [copied: INT]; <> <> <<>> CopySegment: PROC [to: STREAM, from: STREAM, start, length: INT]; <> <> <<>> IntFromSequenceData: PROC [text: REF READONLY TEXT, start: NAT _ 0, len: NAT _ MaxTextLen] RETURNS [INT]; RealFromSequenceData: PROC [text: REF READONLY TEXT, start: NAT _ 0, len: NAT _ MaxTextLen] RETURNS [REAL]; <> <<>> END.