home *** CD-ROM | disk | FTP | other *** search
- UNIT filelist;
- {
- Contains Object List for keeping a list of files.
- }
- INTERFACE
- USES DOS, OPString;
-
- TYPE CmdPtr = ^CmdRec;
- CmdRec = RECORD
- CmdStr : PathStr; {79 char to allow for maximum path length}
- Next : CmdPtr;
- end;
-
- List = OBJECT
- First, Last, Current : CmdPtr;
- ListCount : Word;
-
- CONSTRUCTOR Init;
- Procedure AddName( Name : String );
- Procedure SortList;
- Procedure SortListReverse;
- Function Compare( A, B : String ) : Boolean;
- Function FirstName : String;
- Function LastName : String;
- Function CurrentName : String;
- Function NextName : String;
- Function TotalCount : Word;
- Procedure ClearList;
- Function InList( Name : String; CheckCase : Boolean ) : Boolean;
- DESTRUCTOR Done;
- END;
-
- IMPLEMENTATION
-
- CONSTRUCTOR LIST.INIT;
- BEGIN
- FIRST := NIL;
- LAST := NIL;
- CURRENT := NIL;
- LISTCOUNT := 0;
- END;
-
- PROCEDURE LIST.ADDNAME( NAME : STRING );
- { Add a new CmdRec to the list }
- VAR
- TempCmdPtr : CmdPtr;
- BEGIN
- NEW(TempCmdPtr);
- If First = NIL then begin
- First := TempCmdPtr;
- Current := TempCmdPtr;
- end else
- Last^.Next := TempCmdPtr;
- TempCmdPtr^.Next := NIL;
- TempCmdPtr^.CmdStr := Name;
- Last := TempCmdPtr;
- INC(ListCount);
- END;
-
- PROCEDURE LIST.SORTLIST;
- VAR
- TempCmdPtr : CmdPtr;
- P, Q : CmdPtr;
- BEGIN
- if (First = NIL) or (First^.Next = NIL) then EXIT;
- TempCmdPtr := First;
- First := First^.Next;
- TempCmdPtr^.Next := Nil;
-
- repeat
- p := TempCmdPtr;
-
- if not Compare( p^.CmdStr, First^.CmdStr ) then
- begin
- TempCmdPtr := First;
- First := First^.Next;
- TempCmdPtr^.Next := p;
- end
- else
- begin
- while (compare( p^.CmdStr, First^.CmdStr ) AND
- (p <> NIL)) do
- begin
- q := p;
- p := p^.Next;
- end;
-
- if p = NIL then
- begin
- p := First;
- First := First^.Next;
- q^.Next := p;
- p^.Next := NIL;
- end
- else
- begin
- q^.next := First;
- First := First^.next;
- q^.next^.next := p;
- end;
- end;
- until First = NIL;
-
- First := TempCmdPtr;
- Current := First;
- Last := First;
-
- repeat
- Last := Last^.Next;
- until Last^.Next = NIL;
-
- END;
-
- PROCEDURE LIST.SORTLISTREVERSE;
- VAR
- TempCmdPtr : CmdPtr;
- CheckPtr : CmdPtr;
- tempstr : string;
- BEGIN
- if (First = NIL) or (First^.Next = NIL) then EXIT;
- TempCmdPtr := First;
- CheckPtr := First^.Next;
-
- While (TempCmdPtr <> NIL) DO
- BEGIN
- While (CheckPtr <> NIL) DO
- BEGIN
- { if the tempcmdptr string is less then the checkptr string }
- If compare(TempCmdPtr^.CmdStr, CheckPtr^.CmdStr) then
- BEGIN
- { then swap the strings }
- tempstr := tempCmdPtr^.cmdstr; { save temp's string }
- TempCmdPtr^.cmdStr := CheckPtr^.Cmdstr; { assign check's string to temp
- CheckPtr^.Cmdstr := tempstr; { assign tempptr's string to ch
- end;
- CheckPtr := Checkptr^.next; { get a pointer to next node }
- end; { while checkptr }
- TempCmdPtr := TempCmdPtr^.Next; { get the next compairson base
- end; { while tempcmdptr }
- end; { SortListReverse }
-
- FUNCTION LIST.COMPARE( A, B : String ) : BOOLEAN;
- begin
- Compare := (CompUCString( A,B ) = Less);
- end;
-
-
- FUNCTION LIST.FIRSTNAME : String;
- BEGIN
- if First <> NIL then begin
- FirstName := First^.CmdStr;
- Current := First;
- end else
- FirstName := '';
- END;
-
- FUNCTION LIST.LASTNAME : String;
- BEGIN
- if Last <> NIL then begin
- LastName := Last^.CmdStr;
- Current := Last;
- end else
- LastName := '';
- END;
-
- FUNCTION LIST.CURRENTNAME : String;
- BEGIN
- if Current <> NIL then
- CurrentName := Current^.CmdStr
- else
- CurrentName := '';
- END;
-
- FUNCTION LIST.NEXTNAME : String;
- BEGIN
- if (Current <> NIL) Then begin
- Current := Current^.Next;
- if (Current <> NIL) then
- NextName := Current^.CmdStr
- else
- NextName := '';
- end else
- NextName := '';
- END;
-
- FUNCTION LIST.TOTALCOUNT : Word;
- BEGIN
- TotalCount := ListCount;
- END;
-
- PROCEDURE LIST.CLEARLIST;
- BEGIN
- if First <> NIL then
- repeat
- Current := First^.Next;
- Dispose(First);
- First := Current;
- until First = nil;
- Last := First;
- ListCount := 0;
- END;
-
- Function List.InList(Name:String; CheckCase : Boolean) : Boolean;
- { returns true if string was in list }
- VAR
- TempPtr : CmdPtr;
- OK : Boolean;
- BEGIN
- Ok := false;
- TempPtr := Current;
- Current := First;
- If checkCase then OK := (CompString(FirstName,Name) = Equal)
- Else Ok := (CompUCString(FirstName,Name) = Equal);
- If Not OK then
- BEGIN
- While (Current <> Nil) AND Not OK DO
- If CheckCase then OK := (CompString(NextName,Name) = Equal)
- Else OK := (CompUCString(NextName,Name) = Equal);
- end;
- InList := OK;
- Current := TempPtr;
- end;
-
- DESTRUCTOR LIST.DONE;
- BEGIN
- ClearList;
- END;
-
- BEGIN
- END.
-