home *** CD-ROM | disk | FTP | other *** search
/ Bila Vrana / BILA_VRANA.iso / 005A / 4UTILS85.ZIP / DESCRIPT.PAS < prev    next >
Pascal/Delphi Source File  |  1995-05-07  |  22KB  |  692 lines

  1. UNIT DescriptionHandling;
  2. {$L+,X+,V-}
  3. (* ----------------------------------------------------------------------
  4.    Part of 4DESC - A Simple 4DOS File Description Editor
  5.        and 4FF   - 4DOS File Finder
  6.  
  7.        David Frey,         & Tom Bowden
  8.        Urdorferstrasse 30    1575 Canberra Drive
  9.        8952 Schlieren ZH     Stone Mountain, GA 30088-3629
  10.        Switzerland           USA
  11.  
  12.        Code created using Turbo Pascal 7.0 (c) Borland International 1992
  13.  
  14.    DISCLAIMER: This unit is freeware: you are allowed to use, copy
  15.                and change it free of charge, but you may not sell or hire
  16.                this part of 4DESC. The copyright remains in our hands.
  17.  
  18.                If you make any (considerable) changes to the source code,
  19.                please let us know. (send a copy or a listing).
  20.                We would like to see what you have done.
  21.  
  22.                We, David Frey and Tom Bowden, the authors, provide absolutely
  23.                no warranty of any kind. The user of this software takes the
  24.                entire risk of damages, failures, data losses or other
  25.                incidents.
  26.  
  27.    This unit stores/retrieves the file data and descriptions by using
  28.    a TCollection (a Turbo Vision Object).
  29.  
  30.    ----------------------------------------------------------------------- *)
  31.  
  32. INTERFACE USES Objects, Dos, StringDateHandling;
  33.  
  34. CONST MaxDescLen = 200; (* 4DOS maximum description length *)
  35.       DirSize    = '  <DIR> ';
  36.  
  37. CONST SortByName    = 1;
  38.       SortByExt     = 2;
  39.       SortBySize    = 3;
  40.       SortByDate    = 4;
  41.       SortByNameRev = 5;
  42.       SortByExtRev  = 6;
  43.       SortBySizeRev = 7;
  44.       SortByDateRev = 8;
  45.  
  46. TYPE  NameExtStr = STRING[1+8+1+3];
  47.       SizeStr    = STRING[9];
  48.       DescStr    = STRING[MaxDescLen];
  49.       ProgInfo   = STRING;
  50.       SortKeyStr = STRING[14];
  51.  
  52. VAR   DescLong   : BOOLEAN;
  53.       DispLen    : BYTE;
  54.       Template   : STRING;
  55.  
  56. TYPE  PFileData  = ^TFileData;
  57.       TFileData  = OBJECT(TObject)
  58.                     IsADir   : BOOLEAN;
  59.                     Name     : NameStr;
  60.                     Ext      : ExtStr;
  61.                     Size     : LONGINT;
  62.                     DateRec  : DateTime;
  63.                     Attr     : BYTE;
  64.                     ProgInfo : PString; (* ^STRING;     *)
  65.                     Desc     : PString; (* ^DescStr;    *)
  66.  
  67.                     CONSTRUCTOR Init(Search: SearchRec);
  68.                     CONSTRUCTOR AssignValues(AnIsADir: BOOLEAN;
  69.                                              AName : NameStr; AnExt: ExtStr;
  70.                                              ASize : LONGINT; ADateRec:  DateTime;
  71.                                              AnAttr: BYTE;    AProgInfo: STRING;
  72.                                              ADesc : DescStr);
  73.                     DESTRUCTOR  Done; VIRTUAL;
  74.  
  75.                     PROCEDURE AssignDesc(ADesc: DescStr);
  76.                     PROCEDURE AssignProgInfo(AProgInfo: STRING);
  77.  
  78.                     FUNCTION  GetDesc: DescStr;
  79.                     FUNCTION  GetProgInfo: STRING;
  80.  
  81.                     FUNCTION FormatScrollableDescription(off,len: BYTE): STRING;
  82.                    END;
  83.  
  84. CONST ListOK           = 0;
  85.       ListTooManyFiles = 1;
  86.       ListOutOfMem     = 2;
  87.  
  88. TYPE  PFileList  = ^TFileList;
  89.       TFileList  = OBJECT(TSortedCollection)
  90.                     Status      : BYTE;
  91.                     MaxFileLimit: WORD;
  92.  
  93.                     CONSTRUCTOR Init(Path: PathStr; FileMask: NameExtStr;
  94.                                      ALimit: INTEGER);
  95.  
  96.                     FUNCTION Compare(key1,key2: POINTER): INTEGER; VIRTUAL;
  97.                    END;
  98.  
  99.  
  100. (* these constants are used for the new Justification entry in 4UTILS.INI *)
  101. CONST Left      = 0;
  102.       LeftLeft  = 1;
  103.       RightLeft = 2;
  104.  
  105. VAR   Justify  : BYTE;
  106.       FullSize : BOOLEAN;
  107.       UseHidden: BOOLEAN;
  108.  
  109. VAR   FileList : PFileList;
  110.       SortKey  : BYTE;
  111.  
  112. PROCEDURE Abort(msg: STRING);
  113.  
  114. FUNCTION NILCheck(APtr: POINTER): POINTER;
  115. (* APtr = NIL ? If yes, give a fatal error message and abort. *)
  116.  
  117. PROCEDURE ResortFileList;
  118. (* Resorts the current File List *)
  119.  
  120. PROCEDURE EvaluateINIFileSettings;
  121.  
  122. IMPLEMENTATION USES Memory,  Drivers,
  123.                     HandleINIFile;
  124.  
  125. (* Allocate a 2KB text buffer for faster reads of DESCRIPT.ION *)
  126. VAR Buffer: ARRAY[1..2048] OF CHAR;
  127.  
  128. VAR HelpStr1   : DescStr;
  129.     HelpStr2   : SizeStr;
  130.     HelpStr3   : NameExtStr;
  131.  
  132. PROCEDURE Abort(msg: STRING);
  133. (* Fatal error, abort the program and return an errorlevel of -1 *)
  134.  
  135. BEGIN
  136. (* NormVideo;
  137.  ClrScr; *)
  138.  Write(msg);
  139.  HALT(255);
  140. END;
  141.  
  142. {$F+}
  143. FUNCTION HeapFunc(Size: WORD): INTEGER;
  144. (* This is Turbo Pascal Heap Function, which is called whenever the heap
  145.    manager is unable to complete an allocation request.                  *)
  146.  
  147. BEGIN
  148.  HeapFunc := 1;   (* Return NIL if out of heap *)
  149. END;
  150. {$F-}
  151.  
  152. FUNCTION NILCheck(APtr: POINTER): POINTER;
  153. (* Aborts when a NIL pointer has been detected. This prevents
  154.    deferencing a NIL pointer, which could be catastrophic
  155.    (spontaneous rebooting etc.)                               *)
  156.  
  157. BEGIN
  158.  IF APtr = NIL THEN Abort('NIL Pointer detected!')
  159.                ELSE NILCheck := APtr;
  160. END;
  161.  
  162. (*---------------------------------------------------------------------*)
  163. (* The real work starts here. *)
  164.  
  165. CONSTRUCTOR TFileData.Init(Search: SearchRec);
  166. (* Regular Constructor method. Constructs a FileData "object" on
  167.    the heap and fills in the appropriate values.
  168.    Called from TFileList.Init                                           *)
  169.  
  170. VAR TimeRec  : DateTime;
  171.     Dir      : DirStr;
  172.     s        : STRING;
  173.  
  174. BEGIN
  175.  TObject.Init;
  176.  
  177.  FSplit(Search.Name,Dir,Name,Ext);
  178.  UnpackTime(Search.Time,DateRec);
  179.  
  180.  Attr     := Search.Attr;
  181.  
  182.  ProgInfo := NIL;
  183.  Desc     := NIL;
  184.  Size     := Search.Size;
  185.  
  186.  IsADir := (Search.Attr AND Directory = Directory);
  187.  IF IsADir THEN
  188.   IF (Name = '') THEN (* Name = '' holds for the . and .. entries *)
  189.    BEGIN
  190.     Name := UpStr(Ext); Ext := '';
  191.    END
  192.   ELSE
  193.    BEGIN
  194.     UpString(Name); UpString(Ext);
  195.    END;
  196. END;
  197.  
  198. CONSTRUCTOR TFileData.AssignValues(AnIsADir: BOOLEAN;
  199.                                    AName : NameStr; AnExt: ExtStr;
  200.                                    ASize : LONGINT; ADateRec: DateTime;
  201.                                    AnAttr: BYTE;    AProgInfo: STRING;
  202.                                    ADesc : DescStr);
  203. (* Alternate Constructor method. Constructs a FileData "object" on
  204.    the heap and fills in the appropriate values.
  205.    Called form ReSortFileList when re-sorting a file list.             *)
  206.  
  207. BEGIN
  208.  TObject.Init;
  209.  
  210.  IsADir := AnIsADir;
  211.  
  212.  Name := AName; Ext := AnExt; Size := ASize; DateRec := ADateRec;
  213.  Attr := AnAttr;
  214.  
  215.  ProgInfo := NIL; ProgInfo := NewStr(AProgInfo);
  216.  Desc     := NIL; Desc     := NewStr(ADesc);
  217. END;
  218.  
  219. DESTRUCTOR TFileData.Done;
  220. (* Removes a FileData object from the heap. *)
  221.  
  222. BEGIN
  223.  DisposeStr(ProgInfo); ProgInfo := NIL;
  224.  DisposeStr(Desc);     Desc     := NIL;
  225.  
  226.  TObject.Done;
  227. END;
  228.  
  229. PROCEDURE TFileData.AssignDesc(ADesc: DescStr);
  230. (* Dynamic version of "Desc := ADesc" *)
  231.  
  232. BEGIN
  233.  IF Desc <> NIL THEN BEGIN DisposeStr(Desc); Desc := NIL; END;
  234.  
  235.  Desc := NewStr(ADesc);
  236.  IF (ADesc <> '') AND (Desc = NIL) THEN
  237.   Abort('AssignDesc: NIL Pointer detected!')
  238. END;
  239.  
  240. PROCEDURE TFileData.AssignProgInfo(AProgInfo: STRING);
  241. (* Dynamic version of "ProgInfo := AProgInfo" *)
  242. BEGIN
  243.  IF ProgInfo <> NIL THEN BEGIN DisposeStr(ProgInfo); ProgInfo := NIL; END;
  244.  
  245.  ProgInfo := NewStr(AProgInfo);
  246.  IF (AProgInfo <> '') AND (ProgInfo = NIL) THEN
  247.   Abort('AssignProgInfo: NIL Pointer detected!')
  248. END;
  249.  
  250. FUNCTION TFileData.GetDesc: DescStr;
  251. (* Returns the description of a file *)
  252.  
  253. BEGIN
  254.  IF Desc <> NIL THEN GetDesc := Desc^
  255.                 ELSE GetDesc := '';
  256. END;
  257.  
  258. FUNCTION TFileData.GetProgInfo: STRING;
  259. (* Returns the program information *)
  260.  
  261. BEGIN
  262.  IF ProgInfo <> NIL THEN GetProgInfo := ProgInfo^
  263.                     ELSE GetProgInfo := '';
  264. END;
  265.  
  266. FUNCTION TFileData.FormatScrollableDescription(off,len: BYTE): STRING;
  267. (* Formats a d