<> <> <> DIRECTORY Ascii, Rope USING[ROPE, Concat, Fetch, Size, Equal, Substr, FromChar], IO USING[STREAM, GetChar], FileUtilDefs, FS USING [FileInfo, Error]; FileUtil: PROGRAM IMPORTS IO, FS, Rope EXPORTS FileUtilDefs = BEGIN <> UpperCase: PUBLIC PROC[ch: CHARACTER] RETURNS[CHARACTER] = {SELECT ch FROM IN ['a..'z] => RETURN[ch - 'a + 'A]; ENDCASE => RETURN[ch]}; <<* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>> FileExists: PUBLIC PROC [fileName: Rope.ROPE] RETURNS [ans: BOOL _ TRUE] = { [] _ FS.FileInfo[fileName ! FS.Error => {ans _ FALSE; CONTINUE}]; }; <<* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>> <> <> <> ExtendFileName: PUBLIC PROC [name, extension: Rope.ROPE] RETURNS [extendedName: Rope.ROPE, extended: BOOLEAN] = {s: INT = Rope.Size[name]; FOR i: INT IN [0 .. s) DO IF Rope.Fetch[name,i] = '. THEN -- the name has an extension already RETURN[name, Rope.Equal[Rope.Substr[name, i + 1, s - (i + 1)], extension]]; ENDLOOP; <> IF name = NIL THEN RETURN[NIL, FALSE] ELSE RETURN[Rope.Concat[Rope.Concat[name, "."], extension], TRUE]}; <<* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>> <> <> <> < none found. Otherwise, name is the>> <<(extended) file name.>> GetExtendedFileName: PUBLIC PROC [s: IO.STREAM, extensionName: Rope.ROPE, extensionRequired: BOOLEAN _ TRUE] RETURNS[name, switches: Rope.ROPE] = { letter: CHARACTER; name _ switches _ NIL; letter _ IO.GetChar[s ! ANY => GOTO failure]; WHILE letter = Ascii.SP OR letter = Ascii.TAB OR letter = Ascii.CR DO letter _ IO.GetChar[s ! ANY => GOTO failure] ENDLOOP; <> WHILE letter # Ascii.SP AND letter # Ascii.TAB AND letter # Ascii.CR DO -- get the next name IF letter = '/ THEN {letter _ IO.GetChar[s ! ANY => GOTO out]; UNTIL letter = Ascii.SP OR letter = Ascii.TAB OR letter = Ascii.CR DO switches _ Rope.Concat[switches, Rope.FromChar[letter]]; letter _ IO.GetChar[s ! ANY => GOTO out]; ENDLOOP; EXIT}; name _ Rope.Concat[name, Rope.FromChar[letter]]; letter _ IO.GetChar[s ! ANY => GOTO out]; ENDLOOP; GOTO out; EXITS out => {extended: BOOLEAN _ FALSE; IF extensionName # NIL THEN [name, extended] _ ExtendFileName[name, extensionName]; IF extensionRequired AND NOT extended THEN name _ switches _ NIL}; failure => NULL}; -- no filename found <<* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *>> IsSwitch: PUBLIC PROC [ch: CHARACTER, switches: Rope.ROPE] RETURNS[BOOLEAN] = {FOR i: INT IN [0..Rope.Size[switches]) DO IF UpperCase[ch] = UpperCase[Rope.Fetch[switches,i]] THEN RETURN[TRUE] ENDLOOP; RETURN[FALSE]}; END.