-- DirExtras.mesa, Edit: HGM July 28, 1980 11:45 PM -- From Jim White's FTPAltoFile.mesa of FTP 4.1 -- Copyright Xerox Corporation 1979, 1980 DIRECTORY AltoFileDefs USING [FP], DirectoryDefs USING [EnumerateDirectory], String USING [UpperCase], DirExtraDefs USING [wildString, wildChar]; DirExtras: PROGRAM IMPORTS DirectoryDefs, String EXPORTS DirExtraDefs = BEGIN OPEN DirExtraDefs, String, AltoFileDefs; EnumerateDirectoryMasked: PUBLIC PROCEDURE [ files: STRING, proc: PROCEDURE [fp: POINTER TO FP, file: STRING] RETURNS [BOOLEAN] ] = BEGIN PreProcessFile: PROCEDURE [fp: POINTER TO FP, file: STRING] RETURNS [BOOLEAN] = BEGIN file.length _ file.length - 1; -- discard terminating period IF MaskFilename[file, 0, files, 0] THEN BEGIN RETURN[proc[fp, file]]; END; RETURN[FALSE]; -- keep scanning END; MaskFilename: PROCEDURE [file: STRING, fileIndex: CARDINAL, mask: STRING, maskIndex: CARDINAL] RETURNS [outcome: BOOLEAN] = BEGIN -- local variables i, j: CARDINAL; -- process each character in mask FOR i IN [maskIndex..mask.length) DO SELECT mask[i] FROM wildString => -- matches any string of zero or more characters BEGIN FOR j IN [fileIndex..file.length] DO IF MaskFilename[file, j, mask, i+1] THEN RETURN[TRUE]; ENDLOOP; RETURN[FALSE]; END; wildChar => -- matches any single character IF fileIndex = file.length THEN RETURN[FALSE] ELSE fileIndex _ fileIndex + 1; ENDCASE => IF fileIndex = file.length OR UpperCase[file[fileIndex]] # UpperCase[mask[i]] THEN RETURN[FALSE] ELSE fileIndex _ fileIndex + 1; ENDLOOP; -- filename passes mask if entire filename has been consumed outcome _ fileIndex = file.length; END; DirectoryDefs.EnumerateDirectory[PreProcessFile] END; END. -- of DirExtras