home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga Shareware Floppies / map3.dms / map3.adf / EPU / Util / Recomp.c < prev   
C/C++ Source or Header  |  1993-06-13  |  3KB  |  144 lines

  1. #include <stdio.h>
  2. #include <libraries/dosextens.h>
  3.  
  4. #define CPY_BUFF_LEN 30000
  5.  
  6. char CpyBuff[CPY_BUFF_LEN];
  7. WORD all=0;
  8.  
  9. void RecompFile();
  10. void RecompDir();
  11. char *GetFullName();
  12.  
  13. void main(int argc, char *argv[])
  14. {
  15.   BPTR lock;
  16.   struct FileInfoBlock fib;
  17.  
  18.   if( argc<2 || argc>3 ) {fprintf(stderr,"Bad args\n");exit(10);}
  19.   if( argc==3 )
  20.     if( stricmp(argv[2],"all")==0 )
  21.       all=1;
  22.     else
  23.       {fprintf(stderr,"Bad args\n");exit(10);}
  24.   if( lock=Lock(argv[1],SHARED_LOCK) )
  25.   {
  26.     if( Examine(lock,&fib) )
  27.     {
  28.       if(fib.fib_DirEntryType<0)
  29.       {
  30.         RecompFile(lock,&fib);
  31.       }
  32.       else
  33.       {
  34.         RecompDir(lock);
  35.         UnLock(lock);
  36.       }
  37.     }
  38.   }
  39. }
  40.  
  41. void RecompFile(BPTR lock, struct FileInfoBlock *fib)
  42. {
  43.   long in=0,out,c,d;
  44.   BPTR Parent; 
  45.   struct Process *p=(struct Process *)FindTask(0);
  46.   BPTR PrevLock=p->pr_CurrentDir; 
  47.   char Name[100];
  48.  
  49.   printf("(re)compressing %s",GetFullName(lock) );
  50.   if(Parent=ParentDir(lock))
  51.   {
  52.     p->pr_CurrentDir=lock;
  53.     if(in=Open("",MODE_OLDFILE))
  54.     {
  55.       p->pr_CurrentDir=Parent;
  56.       strcpy(Name,fib->fib_FileName);
  57.       strcat(Name,".EpuTmp");
  58.       if(out=Open(Name,MODE_NEWFILE));
  59.       {
  60.         do
  61.         {
  62.           c=Read(in,CpyBuff,CPY_BUFF_LEN);
  63.           d=Write(out,CpyBuff,c);
  64.         }while(c==d && c!=0);
  65.         Close(out);
  66.         Close(in);in=0;
  67.         UnLock(lock);lock=0;
  68.         if(c==d)
  69.         {
  70.           DeleteFile(fib->fib_FileName);
  71.           if( Rename(Name,fib->fib_FileName) )printf(" Done");
  72.         }
  73.       }
  74.       if(in)Close(in);
  75.     }
  76.     UnLock(Parent);
  77.   }
  78.   if(lock) UnLock(lock);
  79.   p->pr_CurrentDir=PrevLock;
  80.   printf("\n");  
  81. }
  82.  
  83. #define MAX_FILES_IN_DIR 40
  84.  
  85. void RecompDir(BPTR lock)
  86. {
  87.   struct FileInfoBlock fib,
  88.          fibs[MAX_FILES_IN_DIR];
  89.   long c=0;  
  90.  
  91.   Examine(lock,&fib);
  92.   while( ExNext(lock,&fib) )
  93.   {         
  94.      if(c>=MAX_FILES_IN_DIR) break;
  95.      fibs[c]=fib;
  96.      c++;
  97.   }
  98.   c--;
  99.   for(;c>=0;c--)
  100.   {
  101.     struct Process *p=(struct Process *)FindTask(0);
  102.     BPTR l2, PrevLock=p->pr_CurrentDir;
  103.            
  104.     p->pr_CurrentDir=lock;
  105.     l2=Lock(fibs[c].fib_FileName,SHARED_LOCK);
  106.     p->pr_CurrentDir=PrevLock;
  107.            
  108.     if(l2)
  109.     {
  110.       if(fibs[c].fib_DirEntryType<0) RecompFile(l2,&fibs[c]);
  111.       else { if(all) RecompDir(l2);    UnLock(l2);}      
  112.     }
  113.   }
  114. }
  115.  
  116. #define BS 500
  117.  
  118. static char Buff[BS];
  119.  
  120. char  *GetFullName(BPTR lock)
  121. {
  122.   char *p=Buff+BS-5 , *lp;
  123.   struct FileInfoBlock fib;
  124.   long c, h=0;
  125.   BPTR lock2;
  126.  
  127.   *p--=0;
  128.   do
  129.   {
  130.     *p--='/';lp=p+1;
  131.     if(!Examine(lock,&fib)){ if(h) UnLock(lock); return(p+1); }
  132.     for(c=strlen(fib.fib_FileName)-1;c>=0;c--) 
  133.       *p--=fib.fib_FileName[c];
  134.     lock2=ParentDir(lock);
  135.     if(h) UnLock(lock);
  136.     h=1;
  137.     lock=lock2;
  138.   }while(lock);
  139.   *lp=':';
  140.   return(p+1);
  141. }
  142.  
  143.  
  144.