home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / arc / Packer / CrunchMania / Developer / Oberon / CrmStat.mod < prev    next >
Text File  |  1993-12-12  |  10KB  |  322 lines

  1. (*---------------------------------------------------------------------------
  2.  :Program.     CrmStat
  3.  :Contents.    CrM-Allround-Utility
  4.  :Author.      Alexander Ehlert
  5.  :Address.     Beethovenstr. 59/3  72458 Albstadt
  6.  :Copyright.   Giftware!
  7.  :Language.    Oberon-2
  8.  :Translator.  Amiga-Oberon V3.10
  9.  :History.     V1.0   25.10.93 first version
  10.                V1.01  1.12.93 added interactive crunchmode
  11.                V1.02  6.12.93 added interactive decrunchmode
  12.                V1.03  6.12.93 fixed errors!
  13.  --------------------------------------------------------------------------*)
  14. MODULE CrMStat;
  15. IMPORT D:Dos,
  16.        A:Arguments,
  17.        S:Strings,
  18.        E:Exec,
  19.        u:Utility,
  20.        SYSTEM,
  21.        CrM,      (* for lightning crunch speed !!!*)
  22.        NoGuruRq; (* murphy protection ;-> *)
  23.  
  24. VAR pattern,dir,string : ARRAY 256 OF CHAR;
  25.     fanz,fcanz,len,crlen,
  26.     danz               : LONGINT;
  27.     fidi               : D.FileLockPtr;
  28.     info               : D.FileInfoBlock;
  29.     rekursiv,attrib,intadcr,
  30.     Attrib,intacr      : BOOLEAN;
  31.  
  32. PROCEDURE GetStrings(dn : ARRAY OF CHAR;VAR dir,name : ARRAY OF CHAR);
  33. VAR x,lpos : INTEGER;
  34. BEGIN
  35.   lpos:=-1;
  36.   FOR x:=0 TO SHORT(S.Length(dn))-1 DO
  37.     CASE dn[x] OF
  38.       "/",":" : lpos:=x;
  39.     ELSE END;
  40.   END;
  41.   dir:="";
  42.   name:="";
  43.   IF lpos#-1 THEN
  44.     S.Cut(dn,0,lpos+1,dir);
  45.     S.Delete(dn,0,lpos+1);
  46.   END;
  47.   S.Cut(dn,0,S.Length(dn),name);
  48. END GetStrings;
  49.  
  50. PROCEDURE CheckCommands(cmds : ARRAY OF CHAR):BOOLEAN;
  51. VAR x : LONGINT;
  52. BEGIN
  53.   IF cmds[0]="-" THEN
  54.     FOR x:=1 TO S.Length(cmds)-1 DO
  55.       CASE cmds[x] OF
  56.          "r" : rekursiv:=TRUE;
  57.         |"a" : attrib:=TRUE;
  58.         |"A" : Attrib:=TRUE;
  59.         |"c" : intacr:=TRUE; Attrib:=TRUE;
  60.         |"d" : intadcr:=TRUE;attrib:=TRUE;
  61.       ELSE END;
  62.     END;
  63.     RETURN TRUE;
  64.   ELSIF cmds[0]="?" THEN
  65.     D.PrintF("\n\[33mUsage :\[0m CrMStat [-raAcd] [<path>|<file>]\n\n"
  66.              "\[33m -r\[0m : rekursiv file scan (scans all directories)\n"
  67.              "\[33m -a\[0m : show all crunched files\n"
  68.              "\[33m -A\[0m : show all not-crunched files\n"
  69.              "\[33m -c\[0m : interactive crunchmode\n"
  70.              "\[33m -d\[0m : interactive decrunchmode\n"
  71.              "\[33m      Crunchmodes:\[0m\n"
  72.              "        0 : LZH\n"
  73.              "        1 : NORM\n"
  74.              "        2 : LZHSAMPLE\n"
  75.              "        3 : NORMSAMPLE\n"
  76.              "\nDisable RTDD(only when running \[33;1mCrMStat V1.03\[0m)!\n"
  77.              "PS.: if you like this program, you could send me a gift:\n"
  78.              "     PD-Stuff,Disks,Monitors,A5000 or 68040'ers for my AMIGA,\n"
  79.              "     GigaByte-Harddisks(only SCSI-II) or other nice little\n"
  80.              "     things! :-) :-) :-)\n"
  81.              "to whom?? TO ME!!!!\n"
  82.              "\[32m->->-> Alexander Ehlert\n"
  83.              "       Beethovenstr.59/3\n"
  84.              "       72458 Albstadt Ebingen\n\[0m"
  85.              "\n");
  86.     HALT(0);
  87.   ELSE
  88.     RETURN FALSE;
  89.   END;
  90. END CheckCommands;
  91.  
  92. PROCEDURE ShowCBytes(hook : u.HookPtr;
  93.                     csa  : E.APTR;
  94.                     cta  : E.APTR):LONGINT;
  95. VAR
  96.   ct : CrM.CurrentStatsPtr;
  97.   cs : CrM.CrunchStructPtr;
  98. BEGIN
  99.   ct:=cta;
  100.   cs:=csa;
  101.   D.PrintF("Crunching: (%8.8ld/%8.8ld) => %8.8ld\r",
  102.            cs^.SrcLen-ct^.ToGo,
  103.            cs^.SrcLen,ct^.Len);
  104.   RETURN 1;
  105. END ShowCBytes;
  106.  
  107. PROCEDURE CrunchFile(name : ARRAY OF CHAR;size : LONGINT);
  108. VAR
  109.   file  : D.FileHandlePtr;
  110.   cs    : CrM.CrunchStructPtr;
  111.   dh    : CrM.DataHeader;
  112.   data  : UNTRACED POINTER TO SYSTEM.BYTE;
  113.   mode  : ARRAY 1 OF CHAR;
  114.   smode : LONGSET;
  115.   cnt,
  116.   nlen  : LONGINT;
  117.   hook  : u.Hook;
  118. BEGIN
  119.   D.PrintF("Crunchmode(0=LZH/ 1=Normal/ 2=LZHS/ 3=NormS/ 4=none)\n");
  120.   REPEAT
  121.     mode[0]:=D.ReadChar();
  122.   UNTIL (mode[0]>="0")&(mode[0]<="4");
  123.   CASE mode[0] OF
  124.      "0" : smode:=LONGSET{CrM.LZH};
  125.     |"1" : smode:=LONGSET{CrM.Normal};
  126.     |"2" : smode:=LONGSET{CrM.LZH,CrM.Sample};
  127.     |"3" : smode:=LONGSET{CrM.Normal,CrM.Sample};
  128.   ELSE RETURN
  129.   END;
  130.   smode:=smode+LONGSET{CrM.Overlay,CrM.LEDFlash};
  131.   file:=D.Open(name,D.oldFile);
  132.   IF file#NIL THEN
  133.     cs:=CrM.AllocCrunchStructTags(CrM.CMAlgo,smode);
  134.     IF cs#NIL THEN
  135.       data:=E.AllocVec(size,LONGSET{E.public,E.memClear});
  136.       IF data#NIL THEN
  137.         CrM.InitCrunchStruct(cs,data,data,size,size);
  138.         u.InitHook(SYSTEM.ADR(hook),ShowCBytes);
  139.         cs^.DisplayHook:=SYSTEM.ADR(hook);
  140.         cs^.DisplayStep:=512;
  141.         cs^.DataHdr:=SYSTEM.ADR(dh);        (* <- Don't Forget! *)
  142.         cnt:=D.Read(file,data^,size);       (* Read Data *)
  143.         D.OldClose(file); file:=NIL;
  144.         IF cnt=size THEN
  145.           nlen:=CrM.CrunchData(cs);
  146.           IF (nlen#0) AND (nlen+14<size) THEN
  147.             D.PrintF("\nNewLen: %8.ld\n",nlen+SIZE(dh));
  148.             file:=D.Open(name,D.newFile);
  149.             IF file#NIL THEN
  150.               cnt:=D.Write(file,dh,SIZE(dh)); (* Write Dataheader *)
  151.               cnt:=D.Write(file,data^,nlen);  (* Write Data *)
  152.               D.OldClose(file); file:=NIL;
  153.             END;
  154.           ELSE
  155.             D.PrintF("Crunch error!\n");
  156.           END;
  157.         END;
  158.         E.FreeVec(data);
  159.       END;
  160.       CrM.FreeCrunchStruct(cs);
  161.     END;
  162.     IF file#NIL THEN D.OldClose(file) END;
  163.   END;
  164. END CrunchFile;
  165.  
  166. PROCEDURE DecrunchFile(name : ARRAY OF CHAR;size : LONGINT);
  167. VAR
  168.   file  : D.FileHandlePtr;
  169.   dh    : CrM.DataHeader;
  170.   cnt   : LONGINT;
  171.   mode  : SET;
  172.   c     : CHAR;
  173.   data,
  174.   ndata : UNTRACED POINTER TO SYSTEM.BYTE;
  175.  
  176. BEGIN
  177.   D.PrintF("Decrunch?(Y/N)\n");
  178.   REPEAT
  179.     c:=D.ReadChar();
  180.   UNTIL (CAP(c)="Y") OR (CAP(c)="N");
  181.   IF CAP(c)="N" THEN RETURN END;
  182.   file:=D.Open(name,D.oldFile);
  183.   IF file#NIL THEN
  184.     cnt:=D.Read(file,dh,SIZE(dh));
  185.     mode:=CrM.CheckCrunched(dh);
  186.     IF {CrM.Normal,CrM.LZH}*mode#{} THEN (* file crunched ? *)
  187.       data:=E.AllocVec(dh.OriginalLen+dh.MinSecDist,LONGSET{E.public,E.memClear});
  188.       IF data#NIL THEN
  189.         cnt:=D.Read(file,data^,size-SIZE(dh));
  190.         IF cnt=size-SIZE(dh) THEN
  191.           ndata:=CrM.Decrunch(data,data,dh);
  192.           IF ndata#NIL THEN
  193.             D.OldClose(file);
  194.             file:=D.Open(name,D.newFile);
  195.             IF file#NIL THEN
  196.               cnt:=D.Write(file,ndata^,dh.OriginalLen);
  197.               D.OldClose(file);
  198.               file:=NIL
  199.             END;
  200.           END;
  201.         END;
  202.       END;
  203.       E.FreeVec(data);
  204.     END;
  205.     IF file#NIL THEN D.OldClose(file) END;
  206.   END;
  207. END DecrunchFile;
  208.  
  209. PROCEDURE FStat(name : ARRAY OF CHAR;size : LONGINT);
  210. VAR file  : D.FileHandlePtr;
  211.     dh    : CrM.DataHeader;
  212.     flags : SET;
  213. BEGIN
  214.   file:=D.Open(name,D.oldFile);
  215.   IF file=NIL THEN RETURN END;
  216.   IF SIZE(dh)=D.Read(file,dh,SIZE(dh)) THEN END;
  217.   D.OldClose(file);
  218.   flags:=CrM.CheckCrunched(dh);
  219.   IF {CrM.Normal,CrM.LZH}*flags#{} THEN      (* Schnittmenge *)
  220.     INC(fcanz);
  221.     INC(crlen,dh.CrunchedLen);
  222.     INC(len,dh.OriginalLen);
  223.     IF attrib THEN
  224.       D.PrintF("%32.32s %8.ld -> %8.ld",SYSTEM.ADR(name),dh.OriginalLen,dh.CrunchedLen);
  225.       IF CrM.LZH IN flags THEN
  226.         D.PrintF(" LZH");
  227.       ELSE
  228.         D.PrintF(" NORM");
  229.       END;
  230.       IF CrM.Sample IN flags THEN
  231.         D.PrintF("SAMPLE");
  232.       END;
  233.       D.PrintF("\n");
  234.     END;
  235.     IF intadcr THEN DecrunchFile(name,size) END;
  236.   ELSIF Attrib THEN
  237.      D.PrintF("%32.32s %8.ld not crunched!\n",SYSTEM.ADR(name),size);
  238.      IF intacr THEN CrunchFile(name,size) END;
  239.   END;
  240. END FStat;
  241.  
  242. PROCEDURE DStat(dir : D.FileLockPtr;VAR pat : ARRAY OF CHAR;VAR rek : BOOLEAN);
  243. VAR
  244.   apath : D.AnchorPathPtr;
  245.   odir,ndir  : D.FileLockPtr;
  246.   erg   : LONGINT;
  247. BEGIN
  248.   apath:=E.AllocVec(SIZE(apath^),LONGSET{E.public,E.memClear});
  249.   IF (dir=NIL) OR (apath=NIL) THEN RETURN END;
  250.   odir:=D.CurrentDir(dir);
  251.   apath.strLen:=SIZE(apath.buf);
  252.   erg:=D.MatchFirst(pat,apath^);
  253.   WHILE erg=0 DO
  254.     IF apath.info.dirEntryType>0 THEN
  255.       IF rek THEN
  256.         INC(danz);
  257.         ndir:=D.Lock(apath.buf,D.sharedLock);
  258.         IF attrib OR Attrib THEN
  259.           D.PrintF("%s :\n",SYSTEM.ADR(apath.buf));
  260.         END;
  261.         DStat(ndir,pat,rek);
  262.         IF attrib OR Attrib THEN
  263.           D.PrintF("- - - - - - - - - - - - - - - - -\n");
  264.         END;
  265.         D.UnLock(ndir);
  266.       END;
  267.     ELSE
  268.       INC(fanz);
  269.       FStat(apath.buf,apath.info.size);
  270.     END;
  271.     erg:=D.MatchNext(apath^);
  272.     IF ~attrib & ~Attrib THEN
  273.       D.PrintF("%ld files %ld dirs scanned\r",fanz,danz);
  274.     END;
  275.   END;
  276.   dir:=D.CurrentDir(odir);
  277.   D.MatchEnd(apath^);
  278.   E.FreeVec(apath);
  279. END DStat;
  280.  
  281. BEGIN
  282.   REPEAT pattern[0]:=D.ReadChar() UNTIL pattern[0]=CHR(10);(* clear buffer *)
  283.   D.PrintF("$VER:CrMStatV1.03\r\o");
  284.   D.PrintF("\[33;1mCrMStat V1.03 \[0m---\[22;32m (c) 1993 Alexander Ehlert \[0m\n");
  285.   IF A.NumArgs()>0 THEN
  286.     A.GetArg(1,string);
  287.     IF CheckCommands(string) AND (A.NumArgs()>1) THEN
  288.       A.GetArg(2,string);
  289.     ELSE
  290.       string:="#?";
  291.     END;
  292.     fidi:=D.Lock(string,D.sharedLock);
  293.     IF (fidi#NIL) AND D.Examine(fidi,info) THEN
  294.       IF info.dirEntryType>0 THEN
  295.         pattern:="#?";
  296.         DStat(fidi,pattern,rekursiv);
  297.       ELSIF info.dirEntryType<0 THEN
  298.         D.UnLock(fidi);
  299.         fidi:=NIL;
  300.         FStat(string,info.size);
  301.       END;
  302.     ELSE
  303.       GetStrings(string,dir,pattern);
  304.       fidi:=D.Lock(dir,D.sharedLock);
  305.       IF (fidi#NIL) AND D.Examine(fidi,info) THEN
  306.         IF info.dirEntryType>0 THEN
  307.           DStat(fidi,pattern,rekursiv)
  308.         END;
  309.       END;
  310.     END;
  311.     D.PrintF("%ld files %ld dirs scanned\n",fanz,danz);
  312.     D.PrintF("%ld crunched files found\n",fcanz);
  313.     D.PrintF("Original Length: %ld\n",len);
  314.     D.PrintF("Crunched Length: %ld\n",crlen);
  315.   ELSE
  316.     string:="?";
  317.     IF CheckCommands(string) THEN END;
  318.   END;
  319. CLOSE
  320.   IF fidi#NIL THEN D.UnLock(fidi) END;
  321. END CrMStat.
  322.