-- ALEIn.mesa -- Edited by Sweet, 9-Oct-80 23:31:58 DIRECTORY ALEFormat, ALEOps, AltoDefs, SegmentDefs, String, Table; ALEIn: PROGRAM IMPORTS ALEOps, SegmentDefs EXPORTS ALEOps = BEGIN htb: Table.Base; ssb: STRING; ht: DESCRIPTOR FOR ARRAY ALEOps.HTIndex OF ALEOps.HTRecord; lineBase, pointBase, labelBase: ALEFormat.SubTableBase; header: ALEFormat.PictureBase; LineEnum: TYPE = PROCEDURE [l: POINTER TO ALEFormat.Line]; LabelEnum: TYPE = PROCEDURE [lb: POINTER TO ALEFormat.Label]; AllMyLines: PROC [action: LineEnum] = BEGIN OPEN ALEFormat; l: LineIndex; FOR l ← FIRST[LineIndex], l + SIZE[Line] WHILE LOOPHOLE[l, CARDINAL] < header.lines.length DO action[@lineBase[l]]; ENDLOOP; END; AllMyLabels: PROC [action: LabelEnum] = BEGIN OPEN ALEFormat; lb: LabelIndex; FOR lb ← FIRST[LabelIndex], lb + SIZE[Label] WHILE LOOPHOLE[lb, CARDINAL] < header.labels.length DO action[@labelBase[lb]]; ENDLOOP; END; seg: SegmentDefs.FileSegmentHandle; ReadPicture: PUBLIC PROC [file: STRING] = BEGIN OPEN SegmentDefs; fh: FileHandle = NewFile[file, Read! FileNameError => GO TO cant]; saveState: ALEOps.State ← ALEOps.state; AddThisLine: LineEnum = BEGIN pos1: ALEOps.APosition = [ x: pointBase[l.p1].pos.x, y: pointBase[l.p1].pos.y]; pos2: ALEOps.APosition = [ x: pointBase[l.p2].pos.x, y: pointBase[l.p2].pos.y]; ALEOps.state.currentWidth ← l.width; ALEOps.state.currentTexture ← l.texture; ALEOps.DrawLine[pos1, pos2, FALSE]; END; AddThisLabel: LabelEnum = BEGIN desc: String.SubStringDescriptor; pos: ALEOps.APosition = [ x: lb.pos.x, y: lb.pos.y]; SubStringForHash[@desc, lb.hti]; ALEOps.SSDrawLabel[@desc, pos, lb.font, lb.mode]; END; seg ← NewFileSegment[fh, DefaultBase, DefaultPages, Read]; SwapIn[seg]; header ← FileSegmentAddress[seg]; IF header.password # ALEFormat.Password THEN GO TO badFormat; htb ← LOOPHOLE[@header[header.hash.offset]]; ht ← DESCRIPTOR[htb, header.hash.length/SIZE[ALEOps.HTRecord]]; ssb ← LOOPHOLE[@header[header.string.offset]]; pointBase ← @header[header.points.offset]; lineBase ← @header[header.lines.offset]; labelBase ← @header[header.labels.offset]; AllMyLines[AddThisLine]; AllMyLabels[AddThisLabel]; ALEOps.ClearText[]; Unlock[seg]; DeleteFileSegment[seg]; ALEOps.state ← saveState; EXITS cant => ALEOps.OutString[" not found"L]; badFormat => BEGIN ALEOps.OutString[" - bad format"L]; Unlock[seg]; DeleteFileSegment[seg]; END; END; SubString: TYPE = String.SubString; SubStringForHash: PROC [s: SubString, hti: ALEOps.HTIndex] = { s.base ← ssb; IF hti = ALEOps.HTNull THEN s.offset ← s.length ← 0 ELSE s.length ← ht[hti].ssIndex - (s.offset ← ht[hti-1].ssIndex)}; END.