home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 340.lha / undo_v1.0 / undo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-28  |  2.5 KB  |  167 lines

  1. #include <exec/types.h>
  2. #include <exec/exec.h>
  3. #include <libraries/dos.h>
  4. #include <string.h>
  5.  
  6. char fname[255];
  7. char workfname[255];
  8. int method;
  9.  
  10. void MemCleanup() {}
  11. void chkabort(void) {}
  12.  
  13. #define METHODS 4
  14.  
  15. struct arclist 
  16.     {
  17.     char filext[6];
  18.     char cmd[20]; 
  19.     } arcs[] = 
  20.     { 
  21.     {".Zoo","Zoo xO// "},
  22.     {".Arc","Arc xw "},
  23.     {".Lzh","lharc -a -x -m x "},
  24.     {".Zip","Unzip "} 
  25.     };
  26.     
  27. /* NOTE: the xw (for Arc) and the xO (for Zoo) are VERY important */
  28. /*  they keep the progs from asking "Overwrite existing?"         */
  29.  
  30. void
  31. verify_fname(void)
  32. {
  33. int x;
  34. int len;
  35. BPTR FP;
  36.  
  37. len=strlen(fname);
  38.  
  39. FP = Lock(fname, ACCESS_READ);
  40. if (FP!=0)
  41.     {
  42.     UnLock(FP);
  43.     for (x=0; x<METHODS; x++)
  44.         {
  45.         if (stricmp(&fname[len-4], arcs[x].filext) == 0)
  46.             {
  47.             method=x;
  48.             return;
  49.             };
  50.         };
  51.  
  52.     printf("Unknown archive type.\n");
  53.     exit(0);
  54.     };
  55.  
  56. len=strlen(fname);
  57.  
  58. for (x=0; x<METHODS; x++)
  59.     {
  60.     strcpy(workfname, fname);
  61.     strcat(workfname, arcs[x].filext);
  62.     FP=Lock(workfname, ACCESS_READ);
  63.     if (FP != 0)
  64.         {
  65.         UnLock(FP);
  66.         method=x;
  67.         strcpy(fname, workfname);
  68.         return;
  69.         };
  70.     };
  71.  
  72. printf("Error: Cannot find archive name.\n");
  73. exit(0);
  74. }
  75.  
  76.  
  77. void
  78. verify_compression(void)
  79. {
  80. BPTR FP;
  81. char buffer[512];
  82. int realmethod=1;
  83. int len;
  84.  
  85. FP = Open(fname, MODE_OLDFILE);
  86. if (FP==0) 
  87.     return;
  88.  
  89. Read(FP, buffer, 512);
  90. Close(FP);
  91.  
  92. if (strncmp(buffer, "ZOO", 3)==0)
  93.     realmethod=0;
  94.  
  95. if (strncmp(buffer, "PK", 2)==0)
  96.     realmethod=3;
  97.  
  98. if (strncmp(&buffer[2], "-lh", 3)==0)
  99.     realmethod=2;
  100.  
  101. if (realmethod != method)
  102.     {
  103.     strcpy(buffer, "It looks like a ");
  104.     strcat(buffer, arcs[realmethod].filext);
  105.     strcat(buffer, ", but is named like a ");
  106.     strcat(buffer, arcs[method].filext);
  107.     strcat(buffer, "\n");
  108.     printf("Can I rename it (Y/n): ");
  109.     buffer[0]='Y';
  110.     buffer[1]=0;
  111.     gets(buffer);
  112.     if (toupper(buffer[0])!='N')
  113.         {
  114.         strcpy(workfname, fname);
  115.         len = strlen(workfname);
  116.         workfname[len-4]=0;
  117.         strcat(workfname, arcs[realmethod].filext);
  118.         if (Rename(fname, workfname)==FALSE)
  119.             {
  120.             printf("Error:  Rename failed.\n");
  121.             exit(0);
  122.             };
  123.         strcpy(fname, workfname);
  124.         method=realmethod;
  125.         } else
  126.         {
  127.         printf("Aborting.\n");
  128.         exit(0);
  129.         };    
  130.     };
  131. }
  132.  
  133.  
  134.  
  135.  
  136. main(int argc, char **argv)
  137. {
  138. char command[255];
  139. int len;
  140.  
  141. if (argc!=2)
  142.     {
  143.     printf("Usage: Undo ArchiveName\n");
  144.     return(10);
  145.     };
  146.  
  147. /* First we get the right filename */
  148. strcpy(fname, argv[1]);
  149.  
  150. verify_fname();
  151.  
  152. /* now we know filename is right */
  153.  
  154. verify_compression();
  155.  
  156. /* And we know the compression is right. */
  157.     
  158. len = strlen(fname);
  159. fname[len-4]=0;
  160. strcpy(command, arcs[method].cmd);
  161. strcat(command, fname);
  162.  
  163. printf("%s\n", command);
  164. Execute(command,0L,Output());
  165. return(0);
  166. }
  167.