-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- Indirection.mesa, HGM, 13-Mar-83 9:15:13 DIRECTORY CmFile USING [ Close, Error, FindSection, Handle, NextValue, Open, TableError], StringLookUp USING [noMatch, TableDesc], Token USING [FreeTokenString, Item], Indirect USING []; Indirection: PROGRAM IMPORTS CmFile, Token EXPORTS Indirect = BEGIN parmFileName: LONG STRING ← NIL; FindOurName: PROCEDURE = BEGIN cmFile: CmFile.Handle; Option: TYPE = MACHINE DEPENDENT{ parameterFile(0), noMatch(StringLookUp.noMatch)}; DefinedOption: TYPE = Option [parameterFile..parameterFile]; CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc] RETURNS [index: CARDINAL] = CmFile.NextValue; MyNextValue: PROCEDURE [ h: CmFile.Handle, table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING] RETURNS [index: Option] = LOOPHOLE[CheckType]; optionTable: ARRAY DefinedOption OF LONG STRING ← [ parameterFile: "ParameterFile"L]; cmFile ← CmFile.Open[ "User.cm"L ! CmFile.Error => BEGIN cmFile ← NIL; CONTINUE; END]; IF cmFile = NIL THEN RETURN; IF ~CmFile.FindSection[cmFile, "Indirect"L] THEN RETURN; DO option: Option; option ← MyNextValue[cmFile, DESCRIPTOR[optionTable] ! CmFile.TableError => RETRY]; SELECT option FROM noMatch => EXIT; parameterFile => BEGIN [] ← Token.FreeTokenString[parmFileName]; parmFileName ← Token.Item[cmFile, FALSE]; END; ENDCASE => ERROR; ENDLOOP; cmFile ← CmFile.Close[cmFile]; END; GetParmFileName: PUBLIC PROCEDURE RETURNS [LONG STRING] = BEGIN RETURN[parmFileName]; END; OpenSection: PUBLIC PROCEDURE [section: LONG STRING] RETURNS [cmFile: CmFile.Handle] = BEGIN cmFile ← CmFile.Open[ parmFileName ! CmFile.Error => BEGIN cmFile ← NIL; CONTINUE; END]; IF cmFile = NIL THEN RETURN; IF ~CmFile.FindSection[cmFile, section] THEN cmFile ← CmFile.Close[cmFile]; END; NextValue: PUBLIC PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc] RETURNS [index: CARDINAL] = BEGIN RETURN[CmFile.NextValue[h, table]]; END; Close: PUBLIC PROCEDURE [cmFile: CmFile.Handle] = BEGIN [] ← CmFile.Close[cmFile]; END; -- Initialization FindOurName[]; END.