DIRECTORY Atom, CIFS, ConvertUnsafe, Directory, FileIO, IO, Juniper, OrderedSymbolTableRef, PutGet, Rope, RoseTranslateTypes, RoseTranslateInsides, ShowTime, TextNode, TiogaFileOps, TiogaOps, TiogaStreams, UserExec, UserExecExtras, ViewerClasses, ViewerOps, ViewerTools, Volume; RoseTranslateRandoms: CEDAR PROGRAM IMPORTS Atom, CIFS, ConvertUnsafe, Directory, FileIO, IO, Juniper, OSTR: OrderedSymbolTableRef, PutGet, Rope, ShowTime, TFO: TiogaFileOps, TiogaOps, TS: TiogaStreams, RoseTranslateInsides, UserExec, ViewerOps, ViewerTools, Volume EXPORTS RoseTranslateTypes, RoseTranslateInsides = BEGIN OPEN RoseTranslateTypes, RoseTranslateInsides; Circularity: PUBLIC ERROR = CODE; signalTypes: PUBLIC SymbolTable _ OSTR.CreateTable[CompareSymbolTableEntries]; error: PUBLIC REF ANY _ NEW [INT _ 47]; ignoreMe: PUBLIC REF ANY _ NEW[INT _ 86]; RegisterSignalTypeConstructor: PUBLIC PROC [name: ROPE, stc: SignalTypeConstructor] = BEGIN signalTypes.Insert[NEW [SymbolTableEntryRep[signalTypeConstructor] _ [name: name, value: signalTypeConstructor[stc: stc]]]]; END; ForceMesaType: PUBLIC PROC [mesaType: ROPE, on: SignalType] RETURNS [forced: SignalType] = BEGIN forced _ NEW [SignalTypeRep _ [forcedProcs, NEW [ForcedDataRep _ [on, mesaType]] ]]; END; ForcedData: TYPE = REF ForcedDataRep; ForcedDataRep: TYPE = RECORD [ unforced: SignalType, mesaType: ROPE]; forcedProcs: SignalTypeProcs _ NEW [SignalTypeProcsRep _ [ Info: ForcedInfo, Describe: DescribeForced, Cannonize: CannonizeForced, MesaTypeDecl: ForcedDecl]]; ForcedInfo: PROC [data: REF ANY] RETURNS [bitWidth: INT, roseType, mesaType: ROPE] = BEGIN fd: ForcedData _ NARROW[data]; [bitWidth, roseType, ] _ fd.unforced.procs.Info[fd.unforced.data]; mesaType _ fd.mesaType; END; DescribeForced: PROC [data: REF ANY] RETURNS [description: ROPE] = BEGIN fd: ForcedData _ NARROW[data]; description _ fd.unforced.procs.Describe[fd.unforced.data].Cat[" ~ \"", fd.mesaType, "\""]; END; CannonizeForced: PROC [data: REF ANY] RETURNS [cannonized: REF ANY] = BEGIN fd: ForcedData _ NARROW[data]; cannonized _ fd.unforced.procs.Cannonize[fd.unforced.data]; END; ForcedDecl: PROC [data: REF ANY] RETURNS [ROPE] = {RETURN [NIL]}; TranslateCmd: UserExec.CommandProc = BEGIN event.commandLineStream.SkipOver[IO.WhiteSpace]; WHILE NOT event.commandLineStream.EndOf[] DO name: ROPE _ event.commandLineStream.GetToken[IO.IDProc]; errs: CARDINAL _ 1; errs _ Translate[exec, name, NIL, TranslateJob !Circularity => CONTINUE]; IF errs > 0 THEN ok _ FALSE; event.commandLineStream.SkipOver[IO.WhiteSpace]; ENDLOOP; END; Translate: PUBLIC PROC [exec: UserExec.ExecHandle, rootName: ROPE, pathIn: LIST OF ROPE, type: JobType] RETURNS [errCount: CARDINAL] = TRUSTED BEGIN inRoot: TextNode.Ref _ NIL; job: Job _ NEW [JobRep _ [ exec: exec, rootName: rootName, path: CONS[rootName, pathIn], outRoot: TFO.CreateRoot[], symbolsRoot: TFO.CreateRoot[], directory: OSTR.CreateTable[CompareRopes], imports: OSTR.CreateTable[CompareRopes], opened: OSTR.CreateTable[CompareRopes], libbed: OSTR.CreateTable[CompareRopes], things: OSTR.CreateTable[CompareSymbolTableEntries], used: OSTR.CreateTable[CompareRefAnies], type: type, start: ShowTime.GetMark[]]]; logFile: IO.STREAM; sourceName, logName: ROPE; inRoot _ PutGet.FromFile[sourceName _ rootName.Concat[".Rose"] !FileIO.OpenFailed, Juniper.Error, CIFS.Error, Volume.InsufficientSpace => BEGIN viewerLog.PutF["\nOpen failed on %g\n", IO.rope[sourceName]]; inRoot _ NIL; CONTINUE; END]; IF inRoot = NIL THEN RETURN [1]; job.from _ TS.CreateInput[inRoot]; job.to _ TS.CreateOutput[job.outRoot, "code"]; job.symbolsStream _ TS.CreateOutput[job.symbolsRoot]; logFile _ FileIO.Open[fileName: logName _ rootName.Concat[".log"], accessOptions: overwrite]; job.log _ IO.CreateDribbleStream[stream: logFile, dribbleTo: viewerLog]; Open[job, sourceName]; [job.parseTree, ] _ ParseExpression[job, FALSE]; Close[job]; logFile.Close[]; viewerLog.PutRope["Done.\n\n"]; errCount _ job.errCount; END; Open: PROC [job: Job, sourceName: ROPE] = TRUSTED BEGIN ls: LONG STRING _ [256]; lt: LONG STRING _ [256]; ConvertUnsafe.AppendRope[ls, sourceName]; job.log.PutF["\nTranslating %g into %g.Mesa, log on %g.Log\n", IO.rope[sourceName], IO.rope[job.rootName], IO.rope[job.rootName]]; job.to.PutF["--%g.Mesa", IO.rope[job.rootName]]; TS.EndNode[job.to]; job.to.PutF["--created by RoseTranslate from %g of %g for %g at %g", IO.rope[sourceName], IO.time[Directory.GetProps[Directory.Lookup[ls], lt].createDate], IO.rope[UserExec.GetNameAndPassword[].name], IO.time[]]; TS.EndNode[job.to]; TS.EndNode[job.to]; TS.EndNode[job.to]; job.to.PutRope["DIRECTORY"]; job.directoryStream _ TS.CreateOutput[TS.CurOutNode[job.to], "code"]; TS.EndNode[job.to]; TS.EndNode[job.to]; job.to.PutF["%g: CEDAR PROGRAM", IO.rope[job.rootName]]; job.importsStream _ TS.CreateOutput[TS.CurOutNode[job.to], "code"]; job.importsStream.PutRope["IMPORTS "]; TS.EndNode[job.to]; TS.EndNode[job.to]; job.to.PutRope["BEGIN OPEN"]; job.openStream _ TS.CreateOutput[TS.CurOutNode[job.to], "code"]; TS.EndNode[job.to]; TS.EndNode[job.to]; job.to.PutRope["--Signal Type decls"]; job.typeStream _ TS.CreateOutput[TS.CurOutNode[job.to], "code"]; TS.EndNode[job.to]; TS.EndNode[job.to]; job.to.PutRope["RegisterCells: PROC ="]; job.regStream _ TS.CreateOutput[TS.CurOutNode[job.to], "code"]; TS.EndNode[job.to]; job.regStream.PutRope["BEGIN"]; TS.EndNode[job.regStream]; AddOpen[job, "Rosemary"]; AddImport[job, "Rosemary"]; AddOpen[job, "IntTypes"]; AddImport[job, "IntTypes"]; END; DoMesaFormatting: PROC [fileName: ROPE] = TRUSTED BEGIN check: ATOM _ Atom.MakeAtom[fileName]; asAny: REF ANY _ Atom.GetProp[atom: check, prop: $mjsMesaFmtCheck]; ri: REF INT; v: ViewerClasses.Viewer; viewerName: ROPE; IF asAny = NIL THEN Atom.PutProp[atom: check, prop: $mjsMesaFmtCheck, val: asAny _ ri _ NEW [INT _ 0]] ELSE ri _ NARROW[asAny]; ri^ _ ri^ + 1; viewerName _ IF ri^ = 1 THEN fileName ELSE IO.PutFR["%g!%g", IO.rope[fileName], IO.int[ri^]]; v _ ViewerTools.MakeNewTextViewer[info: [name: viewerName, file: fileName, iconic: FALSE]]; TiogaOps.SelectDocument[v]; TiogaOps.MesaFormatting[]; END; Complain: PUBLIC PROC [context: REF ANY, complaint: ROPE, v1, v2, v3, v4, v5: IO.Value _ [null[]]] RETURNS [reduced: REF ANY] = BEGIN job: Job _ NARROW[context]; job.log.PutF["Somewhere before %g: ", IO.int[job.from.GetIndex[]]]; job.log.PutF[complaint.Concat["\n"], v1, v2, v3, v4, v5]; job.errCount _ job.errCount + 1; reduced _ error; END; Whimper: PUBLIC PROC [context: REF ANY, complaint: ROPE, v1, v2, v3, v4, v5: IO.Value _ [null[]]] = BEGIN job: Job _ NARROW[context]; job.log.PutF["Somewhere before %g: ", IO.int[job.from.GetIndex[]]]; job.log.PutF[complaint.Concat["\n"], v1, v2, v3, v4, v5]; job.warnCount _ job.warnCount + 1; END; CompareSymbolTableEntries: OSTR.CompareProc = BEGIN s1, s2: ROPE; s1 _ WITH r1 SELECT FROM r: ROPE => r, st: SymbolTableEntry => st.name, ENDCASE => ERROR; s2 _ WITH r2 SELECT FROM r: ROPE => r, st: SymbolTableEntry => st.name, ENDCASE => ERROR; RETURN [s1.Compare[s2, FALSE]]; END; CompareRopes: OSTR.CompareProc = {RETURN [Rope.Compare[NARROW[r1], NARROW[r2]]]}; CompareRefAnies: OSTR.CompareProc = BEGIN c1: LONG CARDINAL _ LOOPHOLE[r1]; c2: LONG CARDINAL _ LOOPHOLE[r2]; RETURN [IF c1 < c2 THEN less ELSE IF c1 > c2 THEN greater ELSE equal]; END; Setup: PROC = BEGIN UserExec.RegisterCommand["RoseTranslate", TranslateCmd, "Translates rosemary sources (.Rose) into Mesa files", "Syntax: \"RoseTranslate *\". Each root name should not include the .Rose extension"]; END; Setup[]; END. RRoseTranslateRandoms.Mesa Last Edited by: Spreitzer, July 13, 1983 10:49 am ΚΪ˜J™J™1J˜šΟk ˜ Jšœœ$œά˜Œ—Icode˜šΠbxœœ˜#Kš œœ$œ œ1œœN˜εKšœ+˜2—K˜Kšœœ*˜4K˜Kšœ œœœ˜!K˜K˜Kšœ œœ(˜NK˜Kš œœœœœœ˜'Kš œ œœœœœ˜)K˜K˜šΟnœœœœ˜UKš˜Kšœœf˜|Kšœ˜—K˜š Ÿ œœœ œœ˜ZKš˜Kšœ œ œ%˜TKšœ˜—K˜Kšœ œœ˜%šœœœ˜K˜Kšœ œ˜—K˜šœœ˜:Kšœ˜Kšœ˜Kšœ˜Kšœ˜—K˜šŸ œœœœœ œœ˜TKš˜Kšœœ˜KšœB˜BK˜Kšœ˜—K˜š Ÿœœœœœœ˜BKš˜Kšœœ˜K˜[Kšœ˜—K˜šŸœœœœœœœ˜EKš˜Kšœœ˜K˜;Kšœ˜—K˜KšŸ œœœœœœœœ˜AK˜šŸ œ˜$Kš˜Kšœ!œ ˜0šœœ!˜,Kšœœ$œ ˜9Kšœœ˜Kšœœœ˜IKšœ œœ˜Kšœ!œ ˜0Kšœ˜—Kšœ˜—K˜šŸ œœœ'œ œœœœ œ˜ŽKš˜Kšœœ˜šœ œ ˜Kšœ ˜ Kšœ˜Kšœœ˜Kšœ œ˜Kšœ œ˜Kšœ œ˜*Kšœ œ˜(Kšœœ˜'Kšœœ˜'Kšœœ(˜4Kšœœ˜(K˜ Kšœ˜—Kšœ œœ˜Kšœœ˜K˜šœbœ#˜‰Kš˜Kšœ(œ˜=Kšœ œ˜ Kšœ˜ Kšœ˜—Kšœ œœœ˜ Kšœ œ˜"Kšœ œ#˜.Kšœœ˜5K˜]Kšœ œ<˜HK˜Kšœ)œ˜0K˜ Kšœ˜K˜K˜Kšœ˜—K˜šŸœœœ˜1Kš˜Kšœœœ ˜Kšœœœ ˜Kšœ)˜)Kšœ?œœœ˜‚Kšœœœ˜DKš œEœœ@œ+œ œ˜θKšœ˜Kšœ˜K˜Kšœœœ˜EKšœ˜Kšœ˜Kšœ!œ˜8Kšœœœ˜CK˜&Kšœ˜Kšœ˜K˜Kšœ!œ˜@Kšœ˜Kšœ˜K˜&K˜@Kšœ˜Kšœ˜K˜(Kšœœœ˜?Kšœ˜Kšœ œ˜:K˜5K˜5Kšœ˜—K˜šŸœœ œ˜1Kš˜Kšœœ˜&Kšœœœ5˜CKšœœœ˜ K˜Kšœ œ˜Kšœ œœEœœœœ˜K˜Kš œ œ œ œœœœ ˜]KšœSœ˜[K˜K˜Kšœ˜—K˜šŸœœœ œœ œœœ œœ˜Kš˜Kšœ œ ˜Kšœ&œ˜CK˜9K˜ K˜Kšœ˜—K˜šŸœœœ œœ œœ˜cKš˜Kšœ œ ˜Kšœ&œ˜CK˜9K˜"Kšœ˜—K˜šŸœœ˜-Kš˜Kšœœ˜ šœœœ˜Kšœœ˜ Kšœ ˜ Kšœœ˜—šœœœ˜Kšœœ˜ Kšœ ˜ Kšœœ˜—Kšœœ˜Kšœ˜—K˜Kš Ÿ œœœœœ˜QK˜šŸœœ˜#Kš˜Kšœœœœ˜!Kšœœœœ˜!Kšœœ œœœ œ œ˜FKšœ˜—K˜šŸœœ˜ Kš˜K˜K˜ΟK˜Kšœ˜—K˜K˜K˜Kšœ˜—…— &Μ