DIRECTORY CommandUtil: TYPE USING [GetRootName], FileIO: TYPE USING [Open, StreamFromOpenFile], FS: TYPE USING [Open, OpenFile], IO: TYPE USING [Close, GetLength, SetIndex, STREAM, UnsafeGetBlock, UnsafePutBlock], PGSConDefs: TYPE USING [ objectVersion, sourceVersion, FixupBcdHeader, WriteBcdHeader], PrincOps: TYPE USING [bytesPerWord], Rope: TYPE USING [Equal, Find, Length, ROPE], TableCommand: TYPE USING [CreateTime, GenerateVersion], VM: TYPE USING [Allocate, Free, Interval, PageNumberToAddress, WordsToPages]; ModuleMaker: PROGRAM IMPORTS CommandUtil, FileIO, FS, IO, PGSConDefs, Rope, TableCommand, VM EXPORTS TableCommand = { StreamIndex: TYPE = INT; -- FileStream.FileByteIndex bytesPerWord: NAT = PrincOps.bytesPerWord; CreateBCDStream: PUBLIC PROC [ in: IO.STREAM, modId, interfaceId: Rope.ROPE, altoCode: BOOL _ FALSE] RETURNS [output: IO.STREAM] = { modRoot: Rope.ROPE; interfaceRoot: Rope.ROPE; SetSourceVersion[in]; PGSConDefs.objectVersion _ TableCommand.GenerateVersion[]; modRoot _ CommandUtil.GetRootName[modId]; output _ FileIO.Open[modId, write]; interfaceRoot _ CommandUtil.GetRootName[interfaceId]; PGSConDefs.WriteBcdHeader[ outStream: output, tableId: modRoot, binaryId: modId, interfaceId: IF Rope.Equal[interfaceRoot, "SELF", FALSE] THEN NIL ELSE interfaceRoot, fileId: NIL, -- for now altoCode: altoCode]; RETURN}; FinishBcdStream: PUBLIC PROC = { PGSConDefs.FixupBcdHeader[]}; CheckForBr: PROC [name: Rope.ROPE] RETURNS [BOOL] = { index: INT _ Rope.Find[s1: name, s2: ".BR", case: FALSE]; IF index < 0 THEN RETURN[FALSE]; RETURN[name.Length[] = index + 3]}; FindSegmentSize: PROC [br: BOOL, file: FS.OpenFile] RETURNS [count: CARDINAL, in: IO.STREAM] = { GetWord: PROC[stream: IO.STREAM] RETURNS[word: WORD _ 0] = INLINE { [] _ stream.UnsafeGetBlock[[@word, 0, 1]]}; in _ FileIO.StreamFromOpenFile[file]; IF br THEN { IO.SetIndex[in, 7*PrincOps.bytesPerWord]; count _ GetWord[in]; IO.SetIndex[in, count*PrincOps.bytesPerWord]; count _ GetWord[in]} ELSE { eof: StreamIndex = IO.GetLength[in]; count _ eof/PrincOps.bytesPerWord; IO.SetIndex[in, 0]}; RETURN}; CreateSegmentStream: PROC [segmentId: Rope.ROPE] RETURNS [in: IO.STREAM, count: CARDINAL] = { brFile: BOOL = CheckForBr[segmentId]; file: FS.OpenFile; file _ FS.Open[segmentId, read]; [count, in] _ FindSegmentSize[brFile, file]; RETURN}; SetSourceVersion: PROC [sh: IO.STREAM] = { PGSConDefs.sourceVersion _ [0, 0, TableCommand.CreateTime[sh]]}; WriteSegment: PROC [in, out: IO.STREAM, count: CARDINAL] = { interval: VM.Interval _ VM.Allocate[VM.WordsToPages[count]]; p: LONG POINTER _ VM.PageNumberToAddress[interval.page]; [] _ in.UnsafeGetBlock[[p, 0, count*PrincOps.bytesPerWord]]; out.UnsafePutBlock[[p, 0, count*PrincOps.bytesPerWord]]; VM.Free[interval]}; MakeModule: PUBLIC PROC [ inputFile, moduleId, interfaceId: Rope.ROPE, altocode: BOOL] = { in, output: IO.STREAM; count: CARDINAL; [in, count] _ CreateSegmentStream[inputFile]; output _ CreateBCDStream[in, moduleId, interfaceId, altocode]; WriteSegment[in, output, count]; FinishBcdStream[]; IO.Close[in]; IO.Close[output]}; }. Òfile ModuleMaker.mesa last edited by Satterthwaite, November 2, 1982 11:52 am Last Edited by: Maxwell, August 10, 1983 3:29 pm interface to PGSBcd fill in interface info input management overall control Ê2˜Jšœ™Jšœ7™7J™0J˜šÏk ˜ Jšœ œœ˜&Jšœœœ˜.Jšœœœ˜ Jšœœœœ ˜Tšœ œœ˜J˜>—Jšœ œœ˜$Jšœœœœ˜-Jšœœœ˜7Jšœœœ?˜MJ˜—šœ ˜š˜Jšœœœ"˜?—Jšœ˜J˜Jšœ œœÏc˜4Jšœœ˜*J˜Jšœ™˜šÏnœœœ˜Jšœœœ˜Jšœœ˜Jšœ œœ˜Jšœ œœ˜Jšœœ˜Jšœœ˜J˜J˜:J˜)Jšœ#˜#Jšœ™J˜5˜J˜J˜"Jš œ œ#œœœœ˜UJšœœž ˜J˜—Jšœ˜J˜—šŸœœœ˜ J˜J˜—Jšœ™J˜š Ÿ œœ œœœ˜5Jšœœ(œ˜9Jšœ œœœ˜ Jšœ˜#J˜—šŸœœœœ ˜3Jšœ œœœ˜,šŸœœ œœœœœ˜CJ˜+—Jšœ%˜%šœœ˜ Jšœ'˜)J˜Jšœ+˜-J˜—šœ˜Jšœœ˜$J˜"Jšœ˜—Jšœ˜J˜—šŸœœœ˜0Jšœœœ œ˜,Jšœœ˜%Jšœœ ˜Jšœœ˜ J˜,Jšœ˜J˜—šŸœœœœ˜*J˜@J˜——Jšœ™˜š Ÿ œœ œœ œ˜J˜ J˜Jšœ ˜ Jšœ˜J˜—J˜J˜———…—