-- 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