home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / UTILITY / DIR / ODEL12.ZIP / ODEL.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-10-10  |  18.1 KB  |  578 lines

  1. {$A+,B+,D-,E-,F-,I+,L-,N-,O-,R+,S+,V+}
  2. {$M 8096,0,0}
  3.  
  4. PROGRAM Odel;
  5.  
  6. (***********************************************************************
  7.  NOTICE
  8.  ======
  9.      This program and every file distributed with it are copyright (C)
  10.  by the authors, who retain authorship both of the pre-compiled and
  11.  compiled codes.  Their use and distribution are unrestricted, as long
  12.  as nobody gets any richer in the process.  Although these programs
  13.  were developed to the best of the authors abilities, no guarantees
  14.  can be given as to their performance.  By using them, the user
  15.  accepts all risks and the authors decline all liability.
  16. ************************************************************************)
  17.  
  18. USES Crt,Dos;
  19.  
  20. CONST
  21.   MaxParam = 2;
  22.   MaxRow = 25;
  23.   MaxCol = 80;
  24.  
  25. VAR
  26.   g : FILE;
  27.   m,d,y,w : WORD;
  28.   Date : REAL;
  29.   ch : CHAR;
  30.   OldF : STRING[12];
  31.   Dir : DirStr;
  32.   Nam : NameStr;
  33.   Ext : ExtStr;
  34.   p : ARRAY[1..MaxParam] OF PathStr;
  35.   Size : LONGINT;
  36.   Code : INTEGER;
  37.   Plus : STRING;
  38.   f: SEARCHREC;
  39.   FAttr : WORD;
  40.   DirSiz : LONGINT;
  41.   r : BOOLEAN;
  42.   OdelSiz : LONGINT;
  43.   ClusSize : WORD;
  44.   DFree : LONGINT;
  45.  
  46. (************************************************************************
  47. This function returns the cluster size (bytes per cluster) in the default
  48. drive. See PC Techniques vol2 num 3 (Aug/Sept 1991) pp. 96.
  49. *************************************************************************)
  50. FUNCTION ClusterSize: WORD;
  51. VAR
  52.   r : REGISTERS;
  53. BEGIN
  54.   r.ah:= $1B;
  55.   MSDOS(r);
  56.   ClusterSize:= r.al * r.cx;
  57. END;
  58.  
  59. (*************************************************************************
  60. This function returns the size in bytes occupied by all the clusters taken
  61. by the default directory.
  62. **************************************************************************)
  63. FUNCTION ActualDirSize: LONGINT;
  64. VAR
  65.   f : SEARCHREC;
  66.   NumClusters : WORD;
  67. BEGIN
  68.   FindFirst('*.*',AnyFile - Directory - VolumeId - SysFile - Hidden,f);
  69.   WHILE DosError = 0 DO BEGIN
  70.     IF f.Size MOD ClusSize <> 0 THEN
  71.       NumClusters:= NumClusters + (f.Size DIV ClusSize) + 1
  72.     ELSE
  73.       NumClusters:= NumClusters + (f.Size DIV ClusSize);
  74.     FindNext(f);
  75.   END;
  76.   ActualDirSize:= NumClusters * ClusSize;
  77. END;
  78.  
  79. (*************************************************************************
  80. Given the size of a file (fsize) this function returns the actual space in
  81. bytes that the clusters of the file would occupy in the default drive.
  82. **************************************************************************)
  83. FUNCTION ActualFSize(FSize: LONGINT): LONGINT;
  84. BEGIN
  85.   IF FSize MOD ClusSize <> 0 THEN
  86.     ActualFSize:= ((FSize DIV ClusSize) + 1) * ClusSize
  87.   ELSE
  88.     ActualFSize:= FSize;
  89. END;
  90.  
  91. FUNCTION DiskFreeSize: LONGINT;
  92. BEGIN
  93.   DiskFreeSize:= (DiskFree(0) DIV ClusSize) * ClusSize;
  94. END;
  95.  
  96. (* see PC Mag Vol 10 N9, April 16 1991 *)
  97. FUNCTION OutputRedirected: BOOLEAN;
  98. VAR
  99.   r : REGISTERS;
  100.   Handle : WORD ABSOLUTE Output;
  101.  
  102. BEGIN
  103.   WITH r DO BEGIN
  104.     ax:= $4400;
  105.     bx:= Handle;
  106.     MSDOS(r);
  107.     IF dl AND $82 = $82 THEN OutputRedirected:= False
  108.                         ELSE OutputRedirected:= True;
  109.   END;
  110. END;
  111.  
  112. PROCEDURE TestRow;
  113. VAR
  114.   c : CHAR;
  115. BEGIN
  116.   IF OutputRedirected THEN Exit;
  117.   IF WhereY = MaxRow THEN BEGIN
  118.     GotoXY(1,MaxRow);
  119.     ClrEol;
  120.     Write('- more - ');
  121.     REPEAT UNTIL KeyPressed;
  122.     WHILE KeyPressed DO c:= ReadKey;
  123.     ClrScr;
  124.   END;
  125. END;
  126.  
  127. PROCEDURE Writ(s: STRING; Test:BOOLEAN);
  128. VAR
  129.   r : REGISTERS;
  130. BEGIN
  131.   IF Test AND NOT (p[1][1] IN ['#','$']) THEN TestRow;
  132.   WITH r DO BEGIN
  133.     ah:= $40;
  134.     bx:= $01;
  135.     cx:= Ord(s[0]);
  136.     Ds:= Seg(s);
  137.     dx:= Ofs(s) + $01;
  138.     MSDOS(r);
  139.   END;
  140. END;
  141.  
  142. PROCEDURE WritLn(s: STRING; Test: BOOLEAN);
  143. BEGIN
  144.   IF Ord(s[0]) > 253 THEN s:= Copy(s,1,253);
  145.   s:= s + #13 + #10;
  146.   Writ(s, Test);
  147. END;
  148.  
  149. FUNCTION St(w:LONGINT): STRING;
  150. VAR
  151.   s  : STRING;
  152. BEGIN
  153.   Str(w,s);
  154.   St:= s;
  155. END;
  156.  
  157. FUNCTION Power(x,y: REAL): REAL;
  158. BEGIN
  159.   Power:= Exp(y * Ln(x));
  160. END;
  161.  
  162. FUNCTION BitB(VAR b     : BYTE;     { the variable }
  163.                   p     : BYTE;     { the bit }
  164.                   o     : BYTE): BOOLEAN;
  165.                                     { the operation: }
  166.                                     { 0 : switch off }
  167.                                     { 1 : switch on }
  168.                                     { 2 : swap }
  169.                                     { 3 : just test, leave as is }
  170.                                     { the result: }
  171.                                     { true if on }
  172.                                     { false if off }
  173. VAR
  174.   v : BYTE;
  175.  
  176.  
  177. BEGIN
  178.   CASE p OF
  179.     0 : v:= 1;
  180.     1 : v:= 2;
  181.     ELSE v:= Trunc(Power(2,p));
  182.   END;
  183.   CASE o OF
  184.     0 {switch off}  : IF (b AND v = v) THEN b:= b - v;
  185.     1 {switch on}   : IF NOT(b AND v = v) THEN b:= b + v;
  186.     2 {swap on/off} : IF (b AND v = v) THEN b:= b - w
  187.                                        ELSE b:= b + v;
  188.   END;
  189.   IF (b AND v = v) THEN BitB:= True   {is on...}
  190.                    ELSE BitB:= False; {is off...}
  191. END;
  192.  
  193. FUNCTION BitW(VAR b     : WORD;     { the variable }
  194.                   p     : BYTE;     { the bit }
  195.                   o     : BYTE): BOOLEAN;
  196.                                     { the operation: }
  197.                                     { 0 : switch off }
  198.                                     { 1 : switch on }
  199.                                     { 2 : swap }
  200.                                     { 3 : just test, leave as is }
  201.                                     { the result: }
  202.                                     { true if on }
  203.                                     { false if off }
  204. VAR
  205.   v : WORD;
  206.  
  207.  
  208. BEGIN
  209.   CASE p OF
  210.     0 : v:= 1;
  211.     1 : v:= 2;
  212.     ELSE v:= Trunc(Power(2,p));
  213.   END;
  214.   CASE o OF
  215.     0 {switch off}  : IF (b AND v = v) THEN b:= b - v;
  216.     1 {switch on}   : IF NOT(b AND v = v) THEN b:= b + v;
  217.     2 {swap on/off} : IF (b AND v = v) THEN b:= b - w
  218.                                        ELSE b:= b + v;
  219.   END;
  220.   IF (b AND v = v) THEN BitW:= True   {is on...}
  221.                    ELSE BitW:= False; {is off...}
  222. END;
  223.  
  224. PROCEDURE Logo;
  225. BEGIN
  226.   WriteLn;
  227.   WriteLn('╔══════════════════════════════════════════════════════════════════════╗');
  228.   WriteLn('║ ODEL 1.2 Copyright (c) Aug.91 ■ J.Campione/C.J.Taylor/C.R.Parkinson. ║');
  229.   WriteLn('║ Searches default directory & displays/deletes oldest file(s) first.  ║');
  230.   WriteLn('╠══════════════════════════════════════════════════════════════════════╣');
  231.   WriteLn('║ - No parameter .. displays this help.                                ║');
  232.   WriteLn('║ - Param. ? ...... displays files in reverse date/time order.         ║');
  233.   WriteLn('║ - Param. @ ...... prompts before deleting each oldest file(s).       ║');
  234.   WriteLn('║ - Param. ! ...... deletes all file(s) with oldest time/date.         ║');
  235.   WriteLn('║ - Param. #xxxx .. deletes old file(s) until "xxxx" bytes are freed.  ║');
  236.   WriteLn('║ - Param. %xxxx .. preview for parameter "#", files are not deleted.  ║');
  237.   WriteLn('║ - Param. $<file>. deletes old file(s) until enough space for "file". ║');
  238.   WriteLn('║ - Param. &<file>. preview for parameter "$", files are not deleted.  ║');
  239.   WriteLn('╚══════════════════════════════════════════════════════════════════════╝');
  240. END;
  241.  
  242. PROCEDURE GetChar(VAR ch: CHAR; VAR FuncKey: BOOLEAN);
  243. BEGIN
  244.   REPEAT UNTIL KeyPressed;
  245.   FuncKey:= False;
  246.   ch:= ReadKey;
  247.   IF ch = #0 THEN BEGIN
  248.     FuncKey:= True;
  249.     ch:= ReadKey;
  250.   END;
  251. END;
  252.  
  253. (* gets actual size of default directory in bytes per used cluster *)
  254. (* and resets bit 5 in all file attributes *)
  255. FUNCTION DirSize: LONGINT;
  256. VAR
  257.   CSize : LONGINT;
  258.   f : SEARCHREC;
  259.   g : FILE;
  260. BEGIN
  261.   CSize:= 0;
  262.   { find all files to determine eraseable size of directory }
  263.   FindFirst('*.*', AnyFile - Directory - VolumeId - SysFile - Hidden, f);
  264.   WHILE (DosError = 0) DO
  265.   BEGIN
  266.     IF f.Name <> 'ODEL.EXE' THEN BEGIN
  267.       Assign(g,f.Name);
  268.       IF p[1][1] IN ['%','&'] THEN r:= BitB(f.Attr,5,0);
  269.       SetFAttr(g,f.Attr);
  270.       CSize:= CSize + ActualFSize(f.Size);
  271.     END;
  272.     FindNext(f);
  273.   END;
  274.   DirSize:= CSize;
  275. END;
  276.  
  277. PROCEDURE Halting(e: BYTE; f: STRING; n: WORD);
  278. BEGIN
  279.   (* just to reset bit 5 : *)
  280.   DirSiz:= DirSize;
  281.   WriteLn;
  282.   CASE e OF
  283.     0 : IF (p[1][1] IN ['?','%','&'])
  284.         THEN Writ('>>> ' + St(n) + ' file(s) could have been deleted ',True)
  285.         ELSE Writ('>>> ' + St(n) + ' file(s) deleted ',True);
  286.     1 : Writ('>>> No file deleted ',True);
  287.     2 : Writ('>>> Enough free space in disk, no file deleted ',True);
  288.     3 : Writ('>>> Error in space specification ',True);
  289.     4 : Writ('>>> Error in file "' + f + '" ',True);
  290.     5 : Writ('>>> Error in number of parameters ',True);
  291.     6 : Writ('>>> Error in first parameter ',True);
  292.     7 : Writ('>>> Error in second parameter ',True);
  293.     8 : Writ('>>> Error: requested space larger than disk size ',True);
  294.     9 : Writ('>>> Error: requested space larger than directory size ',True);
  295.    10 : Writ('>>> Unknown error: file "' + f + '" could not be deleted ',True);
  296.    11 : Writ('>>> Error: output cannot be redirected with parameters "?" or "@" ',True);
  297.    12 : Writ('>>> Error: the name of "' + f + '" must be "ODEL.EXE" ',True);
  298.   END;
  299.   WritLn('[' + St(e) + '].',True);
  300.   Halt(e);
  301. END;
  302.  
  303. (****************************************************************)
  304. (* This function takes into consideration the date and the time *)
  305. (* The date generates the integer portion,                      *)
  306. (* and corresponds to the classical julian function.            *)
  307. (* The time is used to generate the decimal fraction.           *)
  308. (* -Jose-                                                       *)
  309. (****************************************************************)
  310. FUNCTION Julian(Year, Month, Day, Hour, Min, Sec:INTEGER): REAL;
  311. VAR
  312.   Yr, Mth : INTEGER;
  313.   NoLeap, Leap, Days, Yrs : REAL;
  314.   Jul : REAL;
  315. BEGIN
  316.   Jul:= (Hour * 3600 + Min * 60 + Sec) / 86400;
  317.   IF Year<0 THEN Yr:= Year + 1
  318.             ELSE Yr:= Year;
  319.   Mth:= Month;
  320.   IF Month < 3 THEN BEGIN
  321.     inc(Mth,12);
  322.     dec(Yr);
  323.   END;
  324.   Yrs:= 365.25 * Yr;
  325.   IF ((Yrs < 0) AND (Frac(Yrs) <> 0)) THEN Yrs:= Int(Yrs) - 1
  326.                                       ELSE Yrs:= Int(Yrs);
  327.   Days:= Int(Yrs) + Int(30.6001*(Mth + 1)) + Day-723224.0;
  328.   IF Days < -145068.0 THEN Julian:= Jul + Days
  329.                       ELSE BEGIN
  330.                         Yrs:= Yr/100.0;
  331.                         IF ((Yrs < 0 ) AND (Frac(Yrs) <> 0)) THEN Yrs:= Int(Yrs) - 1;
  332.                         NoLeap:= Int(Yrs);
  333.                         Yrs:= NoLeap/4.0;
  334.                         IF ((Yrs < 0 ) AND (Frac(Yrs) <> 0)) THEN Yrs:= Int(Yrs) - 1;
  335.                         Leap:= 2 - NoLeap + Int(Yrs);
  336.                         Julian:= Jul + Days + Leap;
  337.                       END;
  338. END;
  339.  
  340. PROCEDURE DelOldest;
  341. LABEL 000, 001, 002;
  342. VAR
  343.   ODelF,OlF : FILE;
  344.   Count : INTEGER;
  345.   OldY, OldM, OldD : WORD;
  346.   OldH, OldMin, OldS : WORD;
  347.   MInt, LMInt : REAL;
  348.   First : BOOLEAN;
  349.   Dt : DateTime;
  350.   ftj : REAL;
  351.   ch : CHAR;
  352.   FuncKey : BOOLEAN;
  353.   CurrDir : STRING;
  354.   wx, wy : BYTE;
  355.   Space : LONGINT;
  356.   Files : INTEGER;
  357.   Sum : LONGINT;
  358.   FFile, LFile : STRING[12];
  359.   BegFlag : BOOLEAN;
  360.  
  361. BEGIN
  362.   LFile:= '';
  363.   FFile:= '';
  364.   Space:= 0;
  365.   Count:= 0;
  366.   Sum:= 0;
  367.   LMInt:= -1.7e38;
  368.   BegFlag:= True;
  369.   DirSiz:= DirSize;
  370.   GetDir(0,CurrDir);
  371.  
  372.   OdelSiz:= 0;
  373.   {$I-}
  374.   Assign(ODelF,CurrDir + '\ODEL.EXE');
  375.   Reset(ODelF,1);
  376.   {$I+}
  377.   IF IOResult = 0 THEN BEGIN
  378.     OdelSiz:= ActualFSize(FileSize(ODelF));
  379.     Close(ODelF);
  380.   END;
  381.  
  382.   WritLn('',True);
  383.   WritLn('>>> Default directory : ' + CurrDir + ' uses ' + St(DirSiz+OdelSiz) + ' bytes, ', True);
  384.   Writ('>>> ' + St(DirSiz) + ' are erasable',True);
  385.   IF OdelSiz = 0 THEN WritLn('.',True)
  386.                  ELSE WritLn(' and ' + St(OdelSiz) + ' are taken by ODEL.EXE.',True);
  387.   WritLn('>>> Disk '+ CurrDir[1] + ': has ' + St(DiskSize(0)) + ' bytes and '+ St(DFree) + ' are free. ', True);
  388.   WritLn('>>> The default disk has ' + St(ClusSize) + ' bytes per cluster.', True);
  389.   WritLn('>>> ODEL could free up to ' + St(DirSiz + DFree) + ' bytes. ',True);
  390.   WritLn('',True);
  391.   IF p[1][1] IN ['#','%'] THEN BEGIN
  392.     Val(Copy(p[1],2,Ord(p[1][0])-1),Size,Code);
  393.     IF (Code <> 0) OR (Size <= 0) THEN Halting(3,'',0);
  394.     Size:= ActualFSize(Size);
  395.   END;
  396.   IF p[1][1] IN ['$','&'] THEN BEGIN
  397.     Size:= 0;
  398.     FindFirst(Copy(p[1],2,Ord(p[1][0]) - 1), AnyFile, f);
  399.     WHILE (DosError = 0) DO BEGIN
  400.       IF f.Name <> 'ODEL.EXE' THEN Size:= Size + ActualFSize(f.Size);
  401. (*  writln(F.name + ' ' + st(F.size),true);  *)
  402.       FindNext(f);
  403.     END;
  404.     IF Size = 0 THEN Halting(4,Copy(p[1],2,Ord(p[1][0])-1),0);
  405.   END;
  406.   IF p[1][1] IN ['#','%','$','&'] THEN BEGIN
  407.     WritLn('>>> size to be regained = ' + St(Size) + '.',True);
  408.     Size:= Size - DFree;
  409.     IF Size <= 0 THEN Halting(2,'',0);
  410.     IF Size > DiskSize(0) THEN Halting(8,'',0);
  411.     IF Size > DirSiz THEN Halting(9,'',0);
  412.   END;
  413.  
  414.   000:
  415.   MInt:= 1.7e38;
  416.   FillChar(OldF,SizeOf(OldF),0);
  417.   FillChar(Dt,SizeOf(Dt),0);
  418.  
  419.   Files:= 0;
  420.   { find eraseable files according to plus mask in second }
  421.   { parameter. This is to files to determine oldest for deletion. }
  422.   FindFirst(Plus, AnyFile - Directory - VolumeId - SysFile - Hidden, f);
  423.   WHILE (DosError = 0) DO
  424.   BEGIN
  425.     IF f.Name <> 'ODEL.EXE' THEN BEGIN
  426.       inc(Files,1);
  427.       IF (p[1][1] IN ['%','&']) AND BitB(f.Attr,5,3) THEN GOTO 001;
  428.       UnpackTime(f.Time,Dt);
  429.       ftj:= Julian(Dt.Year,Dt.Month,Dt.Day,Dt.Hour,Dt.Min,Dt.Sec);
  430.       IF (ftj < MInt) AND (ftj > LMInt) THEN BEGIN
  431.         MInt:= ftj;
  432.         OldF:= f.Name;
  433.         OldY:= Dt.Year;
  434.         OldM:= Dt.Month;
  435.         OldD:= Dt.Day;
  436.         OldH:= Dt.Hour;
  437.         OldMin:= Dt.Min;
  438.         OldS:= Dt.Sec;
  439.       END;
  440.     END;
  441.     001:
  442.     FindNext(f);
  443.   END;
  444.   IF MInt = 1.7e38 THEN Halting(0,'',Count);
  445.  
  446.   First:= True;
  447.   FindFirst(Plus, AnyFile - Directory - VolumeId - SysFile - Hidden, f);
  448.   WHILE (DosError = 0) DO
  449.   BEGIN
  450.     IF f.Name <> 'ODEL.EXE' THEN BEGIN
  451.       IF (p[1][1] IN ['%','&']) AND BitB(f.Attr,5,3) THEN GOTO 002;
  452.       UnpackTime(f.Time,Dt);
  453.       IF (Dt.Year = OldY) AND
  454.         (Dt.Month = OldM) AND
  455.         (Dt.Day = OldD) AND
  456.         (Dt.Hour = OldH) AND
  457.         (Dt.Min = OldMin) AND
  458.         (Dt.Sec = OldS) THEN BEGIN
  459.         IF First THEN BEGIN
  460.           First:= False;
  461.           IF BegFlag THEN BEGIN
  462.             WritLn('', True);
  463.           END;
  464.         END;
  465.  
  466.         FSplit(f.Name,Dir,Nam,Ext);
  467.         Sum:= Sum + ActualFSize(f.Size);
  468.         Writ(' - ' + Nam + Ext + ' ' + St(ActualFSize(f.Size)) + ' ' + St(Sum) +
  469.              ' (' + St(OldY) + '-' + St(OldM) + '-' + St(OldD) + ')' +
  470.              ' [' + St(OldH) + ':' + St(OldMin) + ':' + St(OldS) + ']', True);
  471.         wx:= WhereX; wy:= WhereY;
  472.         IF wy = 25 THEN dec(wy,1);
  473.         IF (p[1][1] = '@') THEN BEGIN
  474.           WritLn('', True);
  475.           Writ('>>> Delete file "' + f.Name + '" [Y/N/Esc]? ', False);
  476.           REPEAT
  477.             GetChar(ch,FuncKey);
  478.           UNTIL (NOT FuncKey) AND (UpCase(ch) IN ['Y','N',#27]);
  479.           GotoXY(1,WhereY); ClrEol;
  480.           GotoXY(wx,wy);
  481.         END;
  482.         IF (UpCase(ch) = 'Y') OR
  483.            (p[1][1] IN ['?','!','#','$','%','&'])
  484.         THEN BEGIN
  485.           {$I-}
  486.           Assign(OlF,f.Name);
  487.           Reset(OlF);
  488.           IF NOT (p[1][1] IN ['?','%','&']) THEN Erase(OlF) ELSE
  489.             IF p[1][1] IN ['%','&'] THEN BEGIN
  490.               GetFAttr(OlF,FAttr);
  491.               r:= BitW(FAttr,5,1);
  492.               SetFAttr(OlF,FAttr);
  493.             END;
  494.           {$I+}
  495.           IF (IOResult = 0) THEN BEGIN
  496.                                  Space:= Space + ActualFSize(f.Size);
  497.                                  IF p[1][1] = '?' THEN Writ(' - NOT ',True) ELSE
  498.                                    IF p[1][1] IN ['%','&'] THEN Writ(' - would be ',True) ELSE
  499.                                      Writ(' - ',True);
  500.                                  WritLn('deleted (' + St(Space) + ').',True);
  501.                                  inc(Count,1);
  502.                                END
  503.                           ELSE Halting(10,f.Name,0);
  504.         END ELSE WritLn(' - NOT deleted.',True);
  505.         IF ch = #27 THEN Halting(0,'',Count);
  506.       END;
  507.       IF ((p[1][1] IN ['#','%','$','&']) AND (Space >= Size)) THEN BEGIN
  508.         WritLn('',True);
  509.         IF p[1][1] IN ['#','$'] THEN WritLn('>>> ' + St(Space) + ' bytes have been freed.',True)
  510.                                 ELSE WritLn('>>> ' + St(Space) + ' bytes could have been freed.',True);
  511.         IF Count = 0 THEN Halting(1,'',0)
  512.                      ELSE Halting(0,'',Count);
  513.       END;
  514.     END;
  515.     002:
  516.     FindNext(f);
  517.   END;
  518.   IF (p[1][1] IN ['?']) THEN BEGIN
  519.     Writ('>>> Press return to continue preview : ',True);
  520.     REPEAT
  521.       GetChar(ch,FuncKey);
  522.     UNTIL (NOT FuncKey);
  523.     IF (ch = #13) THEN BEGIN
  524.       IF (MInt > LMInt) AND (MInt < 1.7e38) THEN BEGIN
  525.         LMInt:= MInt;
  526.         GotoXY(1,WhereY); ClrEol;
  527.         BegFlag:= False;
  528.         GOTO 000;
  529.       END;
  530.     END ELSE BEGIN GotoXY(1,WhereY); ClrEol; END;
  531.   END;
  532.   IF (p[1][1] IN ['@']) THEN BEGIN
  533.     IF (MInt > LMInt) AND (MInt < 1.7e38) THEN BEGIN
  534.       LMInt:= MInt;
  535.       BegFlag:= False;
  536.       GOTO 000;
  537.     END;
  538.   END;
  539.   IF (Files > 0) AND (p[1][1] IN ['#','%','$','&','@']) THEN BEGIN
  540.     BegFlag:= False;
  541.     GOTO 000;
  542.   END;
  543.   IF Count = 0 THEN Halting(1,'',0) ELSE Halting(0,'',Count);
  544. END;
  545.  
  546.  
  547. BEGIN
  548.   Plus:= '*.*';
  549.   ClusSize:= ClusterSize;
  550.   DFree:= DiskFreeSize;
  551.  
  552.   FillChar(p,SizeOf(p),0);
  553.  
  554.   IF (ParamCount = 0) THEN BEGIN Logo; Halt(0); END;
  555.   IF (ParamCount > 2) THEN BEGIN Logo; Halting(5,'',0); END;
  556.  
  557.   p[1]:= ParamStr(1);
  558.   IF NOT (p[1][1] IN ['?','!','@','#','%','$','&']) THEN BEGIN Logo; Halting(6,'',0); END;
  559.  
  560.   IF ParamCount > 1 THEN BEGIN
  561.     p[2]:= ParamStr(2);
  562.     IF (NOT (p[2][1] IN ['+'])) THEN BEGIN
  563.       Logo;
  564.       Halting(7,'',0);
  565.     END ELSE
  566.       Plus:= Copy(p[2],2,Ord(p[2][0]) - 1);
  567.   END;
  568.  
  569.   IF OutputRedirected AND (p[1][1] IN ['?','@']) THEN Halting(11,'',0);
  570.  
  571.   FSplit(ParamStr(0),Dir,Nam,Ext);
  572.   IF Nam + Ext <> 'ODEL.EXE' THEN BEGIN Logo; Halting(12,Nam + Ext,0); END;
  573.  
  574.   DelOldest;
  575.   DirSiz:= DirSize;
  576. END.
  577.  
  578.