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