IPXeroxDisassemblerImpl.mesa
Copyright © 1984 Xerox Corporation. All rights reserved.
Doug Wyatt, November 8, 1984 5:52:38 pm PST
DIRECTORY
BasicTime,
FS,
Loader,
IO,
IPBasic,
IPXerox,
Rope;
IPXeroxDisassemblerImpl: CEDAR PROGRAM
IMPORTS BasicTime, FS, Loader, IO, IPXerox, Rope
~ BEGIN
ROPE: TYPE ~ Rope.ROPE;
STREAM: TYPE ~ IO.STREAM;
ShortNumber: TYPE ~ IPXerox.ShortNumber;
EncodingValue: TYPE ~ IPXerox.EncodingValue;
SequenceType: TYPE ~ IPXerox.SequenceType;
Op: TYPE ~ IPBasic.Op;
Seq: TYPE ~ {nil, sequenceString, sequenceInteger, sequenceRational, sequenceIdentifier, sequenceComment, sequenceContinued, sequenceLargeVector, sequencePackedPixelVector, sequenceCompressedPixelVector, sequenceInsertFile, sequenceAdaptivePixelVector};
EvFromOpArray: TYPE ~ ARRAY Op OF EncodingValue;
OpFromEvArray: TYPE ~ ARRAY EncodingValue OF Op;
StFromSeqArray: TYPE ~ ARRAY Seq OF SequenceType;
SeqFromStArray: TYPE ~ ARRAY SequenceType OF Seq;
NonDefaultingRope: TYPE ~ ROPE
RopeFromOpArray: TYPE ~ ARRAY Op OF NonDefaultingRope;
RopeFromSeqArray: TYPE ~ ARRAY Seq OF NonDefaultingRope;
evFromOp: REF EvFromOpArray ~ NEW[EvFromOpArray ← [nil: nil, get: get, makeveclu: makeveclu, makevec: makevec, shape: shape, openvec: openvec, getprop: getprop, getp: getp, mergeprop: mergeprop, frame: frame, fget: fget, fset: fset, poolop: poolop, pool: pool, pget: pget, pset: pset, env: env, makepool: makepool, nopool: nopool, makeco: makeco, makesimpleco: makesimpleco, do: do, dosave: dosave, dosaveall: dosaveall, dobody: dobody, dosavebody: dosavebody, dosaveallbody: dosaveallbody, dosavesimplebody: dosavesimplebody, makecompiledimage: makecompiledimage, pop: pop, copy: copy, dup: dup, roll: roll, exch: exch, mark: mark, unmark: unmark, unmark0: unmark0, count: count, nop: nop, error: error, if: if, ifelse: ifelse, ifcopy: ifcopy, loop: loop, eq: eq, eqname: eqname, gt: gt, ge: ge, and: and, or: or, not: not, type: type, add: add, sub: sub, neg: neg, abs: abs, floor: floor, ceiling: ceiling, trunc: trunc, round: round, mul: mul, div: div, mod: mod, rem: rem, max: max, min: min, sqrt: sqrt, exp: exp, log: log, sin: sin, cos: cos, atan: atan, iget: iget, iset: iset, dround: dround, maket: maket, opent: opent, translate: translate, rotate: rotate, scale: scale, scale2: scale2, concat: concat, invert: invert, transform: transform, transformvec: transformvec, roundxy: roundxy, roundxyvec: roundxyvec, concatt: concatt, move: move, trans: trans, show: show, showandxrel: showandxrel, setxy: setxy, setxyrel: setxyrel, setxrel: setxrel, setyrel: setyrel, getcp: getcp, getcprounded: getcprounded, makepixelarray: makepixelarray, extractpixelarray: extractpixelarray, joinpixelarrays: joinpixelarrays, finddecompressor: finddecompressor, makegray: makegray, findcolor: findcolor, findcoloroperator: findcoloroperator, findcolormodeloperator: findcolormodeloperator, makesampledcolor: makesampledcolor, makesampledblack: makesampledblack, setgray: setgray, moveto: moveto, lineto: lineto, linetox: linetox, linetoy: linetoy, curveto: curveto, conicto: conicto, arcto: arcto, makeoutline: makeoutline, maskfill: maskfill, maskfillparity: maskfillparity, maskstroke: maskstroke, maskstrokeclosed: maskstrokeclosed, maskvector: maskvector, maskrectangle: maskrectangle, startunderline: startunderline, maskunderline: maskunderline, masktrapezoidx: masktrapezoidx, masktrapezoidy: masktrapezoidy, maskpixel: maskpixel, clipoutline: clipoutline, cliprectangle: cliprectangle, findfont: findfont, findfontvec: findfontvec, modifyfont: modifyfont, setfont: setfont, correctmask: correctmask, correctspace: correctspace, correct: correct, setcorrectmeasure: setcorrectmeasure, setcorrecttolerance: setcorrecttolerance, space: space, beginBody: beginBody, endBody: endBody, beginBlock: beginBlock, endBlock: endBlock, pageInstructions: pageInstructions, noPages: noPages, metricMaster: metricMaster, environmentMaster: environmentMaster, beginVec: nil, comma: nil, endVec: nil]];
opFromEv: REF OpFromEvArray ~ InvertEvFromOp[evFromOp];
InvertEvFromOp: PROC[evFromOp: REF EvFromOpArray] RETURNS[REF OpFromEvArray] ~ {
opFromEv: REF OpFromEvArray ~ NEW[OpFromEvArray ← ALL[nil]];
FOR op: Op IN Op DO opFromEv[evFromOp[op]] ← op ENDLOOP;
RETURN[opFromEv];
};
stFromSeq: REF StFromSeqArray ~ NEW[StFromSeqArray ← [nil: nil, sequenceString: sequenceString, sequenceInteger: sequenceInteger, sequenceRational: sequenceRational, sequenceIdentifier: sequenceIdentifier, sequenceComment: sequenceComment, sequenceContinued: sequenceContinued, sequenceLargeVector: sequenceLargeVector, sequencePackedPixelVector: sequencePackedPixelVector, sequenceCompressedPixelVector: sequenceCompressedPixelVector, sequenceInsertFile: sequenceInsertFile, sequenceAdaptivePixelVector: sequenceAdaptivePixelVector]];
seqFromSt: REF SeqFromStArray ~ InvertStFromSeq[stFromSeq];
InvertStFromSeq: PROC[stFromSeq: REF StFromSeqArray] RETURNS[REF SeqFromStArray] ~ {
seqFromSt: REF SeqFromStArray ~ NEW[SeqFromStArray ← ALL[nil]];
FOR seq: Seq IN Seq DO seqFromSt[stFromSeq[seq]] ← seq ENDLOOP;
RETURN[seqFromSt];
};
ropeFromOp: REF RopeFromOpArray ~ NEW[RopeFromOpArray ← [nil: NIL, get: "GET", makeveclu: "MAKEVECLU", makevec: "MAKEVEC", shape: "SHAPE", openvec: "OPENVEC", getprop: "GETPROP", getp: "GETP", mergeprop: "MERGEPROP", frame: "FRAME", fget: "FGET", fset: "FSET", poolop: "POOLOP", pool: "POOL", pget: "PGET", pset: "PSET", env: "ENV", makepool: "MAKEPOOL", nopool: "NOPOOL", makeco: "MAKECO", makesimpleco: "MAKESIMPLECO", do: "DO", dosave: "DOSAVE", dosaveall: "DOSAVEALL", dobody: "DOBODY", dosavebody: "DOSAVEBODY", dosaveallbody: "DOSAVEALLBODY", dosavesimplebody: "DOSAVESIMPLEBODY", makecompiledimage: "MAKECOMPILEDIMAGE", pop: "POP", copy: "COPY", dup: "DUP", roll: "ROLL", exch: "EXCH", mark: "MARK", unmark: "UNMARK", unmark0: "UNMARK0", count: "COUNT", nop: "NOP", error: "ERROR", if: "IF", ifelse: "IFELSE", ifcopy: "IFCOPY", loop: "LOOP", eq: "EQ", eqname: "EQNAME", gt: "GT", ge: "GE", and: "AND", or: "OR", not: "NOT", type: "TYPE", add: "ADD", sub: "SUB", neg: "NEG", abs: "ABS", floor: "FLOOR", ceiling: "CEILING", trunc: "TRUNC", round: "ROUND", mul: "MUL", div: "DIV", mod: "MOD", rem: "REM", max: "MAX", min: "MIN", sqrt: "SQRT", exp: "EXP", log: "LOG", sin: "SIN", cos: "COS", atan: "ATAN", iget: "IGET", iset: "ISET", dround: "DROUND", maket: "MAKET", opent: "OPENT", translate: "TRANSLATE", rotate: "ROTATE", scale: "SCALE", scale2: "SCALE2", concat: "CONCAT", invert: "INVERT", transform: "TRANSFORM", transformvec: "TRANSFORMVEC", roundxy: "ROUNDXY", roundxyvec: "ROUNDXYVEC", concatt: "CONCATT", move: "MOVE", trans: "TRANS", show: "SHOW", showandxrel: "SHOWANDXREL", setxy: "SETXY", setxyrel: "SETXYREL", setxrel: "SETXREL", setyrel: "SETYREL", getcp: "GETCP", getcprounded: "GETCPROUNDED", makepixelarray: "MAKEPIXELARRAY", extractpixelarray: "EXTRACTPIXELARRAY", joinpixelarrays: "JOINPIXELARRAYS", finddecompressor: "FINDDECOMPRESSOR", makegray: "MAKEGRAY", findcolor: "FINDCOLOR", findcoloroperator: "FINDCOLOROPERATOR", findcolormodeloperator: "FINDCOLORMODELOPERATOR", makesampledcolor: "MAKESAMPLEDCOLOR", makesampledblack: "MAKESAMPLEDBLACK", setgray: "SETGRAY", moveto: "MOVETO", lineto: "LINETO", linetox: "LINETOX", linetoy: "LINETOY", curveto: "CURVETO", conicto: "CONICTO", arcto: "ARCTO", makeoutline: "MAKEOUTLINE", maskfill: "MASKFILL", maskfillparity: "MASKFILLPARITY", maskstroke: "MASKSTROKE", maskstrokeclosed: "MASKSTROKECLOSED", maskvector: "MASKVECTOR", maskrectangle: "MASKRECTANGLE", startunderline: "STARTUNDERLINE", maskunderline: "MASKUNDERLINE", masktrapezoidx: "MASKTRAPEZOIDX", masktrapezoidy: "MASKTRAPEZOIDY", maskpixel: "MASKPIXEL", clipoutline: "CLIPOUTLINE", cliprectangle: "CLIPRECTANGLE", findfont: "FINDFONT", findfontvec: "FINDFONTVEC", modifyfont: "MODIFYFONT", setfont: "SETFONT", correctmask: "CORRECTMASK", correctspace: "CORRECTSPACE", correct: "CORRECT", setcorrectmeasure: "SETCORRECTMEASURE", setcorrecttolerance: "SETCORRECTTOLERANCE", space: "SPACE", beginBody: "{", endBody: "}", beginBlock: "BEGIN", endBlock: "END", pageInstructions: "PAGEINSTRUCTIONS", noPages: "NOPAGES", metricMaster: "METRICMASTER", environmentMaster: "ENVIRONMENTMASTER", beginVec: "[", comma: ",", endVec: "]"]];
ropeFromSeq: REF RopeFromSeqArray ~ NEW[RopeFromSeqArray ← [nil: NIL, sequenceString: "sequenceString", sequenceInteger: "sequenceInteger", sequenceRational: "sequenceRational", sequenceIdentifier: "sequenceIdentifier", sequenceComment: "sequenceComment", sequenceContinued: "sequenceContinued", sequenceLargeVector: "sequenceLargeVector", sequencePackedPixelVector: "sequencePackedPixelVector", sequenceCompressedPixelVector: "sequenceCompressedPixelVector", sequenceInsertFile: "sequenceInsertFile", sequenceAdaptivePixelVector: "sequenceAdaptivePixelVector"]];
GetHeader: PROC[stream: STREAM, text: REF TEXT] RETURNS[error: ROPENIL] ~ {
prefix: ROPE ~ "Interpress/Xerox/";
prefixLength: NAT ~ Rope.Length[prefix];
FOR i: NAT IN[0..prefixLength) DO
text[i] ← IO.GetChar[stream]; text.length ← i+1;
IF text[i]#Rope.Fetch[prefix, i] THEN RETURN[IO.PutFR[
"'%g' does not match '%g'.", IO.text[text], IO.rope[prefix]]];
ENDLOOP;
FOR i: NAT IN[prefixLength..text.maxLength) DO
text[i] ← IO.GetChar[stream]; text.length ← i+1;
IF text[i]=' THEN EXIT;
REPEAT FINISHED => RETURN[IO.PutFR[
"'%g...' is an unreasonably long header.", IO.text[text]]];
ENDLOOP;
};
AnnotateNumber: PROC[output: STREAM, n: ShortNumber] ~ {
output.PutF[" -- %g", IO.int[n]];
};
AnnotateOp: PROC[output: STREAM, ev: EncodingValue] ~ {
op: Op ~ opFromEv[ev];
IF op=nil THEN output.PutRope[" -- ???"]
ELSE output.PutF[" -- %g", IO.rope[ropeFromOp[op]]];
};
AnnotateSeq: PROC[output: STREAM, type: SequenceType] ~ {
seq: Seq ~ seqFromSt[type];
IF seq=nil THEN output.PutRope[" -- ???"]
ELSE output.PutF[" -- %g", IO.rope[ropeFromSeq[seq]]];
};
Disassemble: PROC[name: ROPE, output: STREAM] ~ {
startTime: BasicTime.GMT ~ BasicTime.Now[];
buildTime: BasicTime.GMT ~ Loader.BCDBuildTime[Disassemble];
file: FS.OpenFile ~ FS.Open[name];
input: STREAM ~ FS.StreamFromOpenFile[file];
fullFName, attachedTo: ROPENIL;
createTime: BasicTime.GMT;
header: REF TEXT ~ NEW[TEXT[100]];
error: ROPENIL;
[fullFName: fullFName, attachedTo: attachedTo] ← FS.GetName[file];
createTime ← FS.GetInfo[file].created;
output.PutF["Interpress Disassembler of %g\n", IO.time[buildTime]];
output.PutF["Started at %g\n", IO.time[startTime]];
output.PutF["File name: %g\n", IO.rope[fullFName]];
IF attachedTo#NIL THEN output.PutF["Attached to: %g\n", IO.rope[attachedTo]];
output.PutF["Created: %g\n\n", IO.time[createTime]];
error ← GetHeader[input, header];
IF error=NIL THEN output.PutF["0: header[%g]\n", IO.text[header]]
ELSE { output.PutF["Aborted: %g\n", IO.rope[error]]; RETURN };
UNTIL IO.EndOf[input] DO
index: INT ~ IO.GetIndex[input];
token: IPXerox.Token ~ IPXerox.GetToken[input];
output.PutF["%g: ", IO.int[index]];
WITH token: token SELECT FROM
shortNumber => {
output.PutF["shortNumber[%g]", IO.int[token.n-ShortNumber.FIRST]];
AnnotateNumber[output, token.n];
};
shortOp => {
output.PutF["shortOp[%g]", IO.int[ORD[token.op]]];
AnnotateOp[output, token.op];
};
longOp => {
output.PutF["longOp[%g]", IO.int[ORD[token.op]]];
AnnotateOp[output, token.op];
};
shortSequence => {
output.PutF["shortSequence[%g, %g]", IO.int[ORD[token.type]], IO.int[token.length]];
AnnotateSeq[output, token.type];
input.SetIndex[input.GetIndex+token.length];
};
longSequence => {
output.PutF["longSequence[%g, %g]", IO.int[ORD[token.type]], IO.int[token.length]];
AnnotateSeq[output, token.type];
input.SetIndex[input.GetIndex+token.length];
};
ENDCASE => ERROR;
output.PutF["\n"];
ENDLOOP;
IO.Close[output];
};
END.