home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1991-02-18 | 3.4 KB | 153 lines |
-
- IMPLEMENTATION MODULE PRFILES;
-
- FROM Storage IMPORT ALLOCATE,DEALLOCATE;
-
- FROM FIO IMPORT ReadFirstEntry,ReadNextEntry,DirEntry,Attrib,FileAttr,
- PathTail;
-
- FROM FIOR IMPORT AddExtension;
-
- FROM Str IMPORT Caps,CharPos,Delete,Compare,Copy,Slice;
-
- FROM Lib IMPORT ParamCount,ParamStr;
-
- FROM IO IMPORT WrStr,WrLn,RdStr,RdKey;
-
- TYPE DirList = POINTER TO ListEntry;
- ListEntry = RECORD
- name : PathTail;
- next : DirList
- END;
-
- VAR Directory : DirList;
-
- PROCEDURE KillDirectory (VAR dir : DirList);
-
- VAR help : DirList;
-
- BEGIN
- WHILE dir # NIL DO
- help := dir;
- dir := dir^.next;
- DISPOSE (help)
- END
- END KillDirectory;
-
- PROCEDURE GetEntry (VAR dir : DirList;
- VAR name : ARRAY OF CHAR);
-
- VAR help : DirList;
-
- BEGIN
- Copy (name,dir^.name);
- help := dir;
- dir := dir^.next;
- DISPOSE (help)
- END GetEntry;
-
- PROCEDURE SearchFirst (VAR name : ARRAY OF CHAR) : BOOLEAN;
-
- VAR entry : DirEntry;
- success : BOOLEAN;
-
- PROCEDURE InsertInList (VAR dir : DirList;
- name : PathTail);
-
- VAR last,help,w : DirList;
-
- BEGIN
- help := dir;
- WHILE (help # NIL) & (Compare (help^.name,name) = - 1) DO
- last := help;
- help := help^.next;
- END;
- NEW (w);
- w^.name := name;
- w^.next := help;
- IF help = dir THEN
- dir := w
- ELSE
- last^.next := w
- END
- END InsertInList;
-
- BEGIN
- KillDirectory (Directory);
- success := ReadFirstEntry (name,FileAttr {archive},entry);
- WHILE success DO
- InsertInList (Directory,entry.Name);
- success := ReadNextEntry (entry);
- END;
- IF Directory # NIL THEN
- GetEntry (Directory,name);
- RETURN TRUE
- ELSE
- RETURN FALSE
- END
- END SearchFirst;
-
- PROCEDURE SearchNext (VAR name : ARRAY OF CHAR) : BOOLEAN;
-
- BEGIN
- IF Directory = NIL THEN
- RETURN FALSE
- ELSE
- GetEntry (Directory,name);
- RETURN TRUE
- END
- END SearchNext;
-
- PROCEDURE GetExt (str : ARRAY OF CHAR;
- VAR ext : ExtStr);
-
- BEGIN
- IF CharPos (str,'.') < MAX (CARDINAL) THEN
- Slice (ext,str,CharPos (str,'.') + 1,3)
- END;
- END GetExt;
-
- PROCEDURE ReadFileNames (VAR source,dest : ARRAY OF CHAR);
-
- VAR wildcard,ende : BOOLEAN;
-
- BEGIN
- IF ParamCount () > 0 THEN
- ParamStr (source,1)
- ELSE
- WrLn;
- WrStr ('Source : ');
- RdStr (source)
- END;
- Caps (source);
- IF source [0] = 0C THEN
- RETURN
- END;
- AddExtension (source,'MOD');
- wildcard := (CharPos (source,'*') < MAX (CARDINAL)) OR (CharPos (source,
- '?') < MAX (CARDINAL));
- Comments := CharPos (source,'@') = MAX (CARDINAL);
- IF NOT Comments THEN
- Delete (source,CharPos (source,'@'),1)
- END;
- IF NOT wildcard THEN
- IF ParamCount () > 1 THEN
- ParamStr (dest,2)
- ELSIF ParamCount () = 0 THEN
- WrStr ('Destination : ');
- RdStr (dest)
- END;
- Caps (dest);
- IF (dest [0] = 0C) THEN
- Copy (dest,source);
- ELSIF (Compare (dest,'PRN') # 0) THEN
- AddExtension (dest,'MOD')
- END
- ELSE
- Copy (dest,source)
- END
- END ReadFileNames;
-
- BEGIN
- Directory := NIL;
- END PRFILES.