-- FastDirDefs.mesa edited: Bruce July 8, 1980 8:38 AM
-- Copyright Xerox Corporation 1979, 1980
DIRECTORY
AltoFileDefs USING [FP],
Mopcodes USING [zAND];
FastDirDefs: DEFINITIONS =
BEGIN OPEN AltoFileDefs, Mopcodes;
UpCase: CARDINAL = 137B;
HashVal: TYPE = [0..1000);
FileType: TYPE = {source, bcd, config, symbols, code, image};
--extensions: ARRAY FileType OF STRING = ["mesa", "bcd", "config", "symbols", "code", "image"];
FileSwitches: TYPE = PACKED ARRAY FileType OF BOOLEAN;
NilFileSwitches: FileSwitches = [FALSE, FALSE, FALSE, FALSE, FALSE, FALSE];
-- ALL [FALSE] later
AllFileSwitches: FileSwitches = [TRUE, TRUE, TRUE, TRUE, TRUE, TRUE];
-- ALL [TRUE] later
StringItem: TYPE = RECORD [
link: POINTER TO StringItem, hash: HashVal, s: STRING];
ItemHandle: TYPE = POINTER TO Item;
Item: TYPE = RECORD [link: POINTER TO Item, hash: WORD, name: STRING, fp: FP];
EnumerateList: PROCEDURE [
ft: FileType, proc: PROCEDURE [ItemHandle] RETURNS [BOOLEAN]]
RETURNS [ItemHandle];
EquivalentString: PROCEDURE [s1, s2: STRING] RETURNS [BOOLEAN];
GetExtension: PROCEDURE [ft: FileType] RETURNS [ext: STRING];
LocalDir: PROCEDURE [PROCEDURE [POINTER TO FP, STRING] RETURNS [BOOLEAN]] =
LOOPHOLE[3];
LookupItem: PROCEDURE [s: STRING, t: FileType] RETURNS [p: ItemHandle];
ScanDir: PROCEDURE [
files: FileSwitches,
proc: PROCEDURE [PROCEDURE [POINTER TO FP, STRING] RETURNS [BOOLEAN]] ←
LocalDir];
StripExtension: PROCEDURE [name, ext: STRING];
StripSwitches: PROCEDURE [name, switches: STRING];
Cap: PROCEDURE [c: CHARACTER] RETURNS [CHARACTER] = INLINE
BEGIN RETURN[IF c IN ['a..'z] THEN LOOPHOLE[CharMask[c, UpCase]] ELSE c] END;
CharMask: PROCEDURE [CHARACTER, CARDINAL] RETURNS [CARDINAL] = MACHINE CODE
BEGIN zAND END;
Hash: PROCEDURE [s: STRING] RETURNS [HashVal] = INLINE
BEGIN
RETURN[
(CharMask[s[0], UpCase]*s.length + CharMask[s[s.length/2], UpCase]) MOD
(LAST[HashVal] + 1)];
END;
END.