home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / newc_dev / unix_too.lha / whereis.c < prev    next >
C/C++ Source or Header  |  1992-09-20  |  3KB  |  124 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <libraries/dos.h>
  5. #include <exec/memory.h>
  6. #include <proto/dos.h>
  7. #include <proto/exec.h>
  8.  
  9. BOOL found;
  10. char GlobalFileName[512];
  11. char SearchChar[108];
  12. char PotentialChar[108];
  13.  
  14. BOOL DoSizeCheck(BPTR);
  15.  
  16. int CXBRK() {return(0);}
  17. int chkabort() {return(0);}
  18.  
  19. void main(argc,argv)
  20. int argc;
  21. char *argv[];
  22. {
  23.    BPTR mylock;
  24.  
  25.    found=FALSE;
  26.  
  27.    printf("WhereIs - file searcher by Jean-François Stenuit\n");
  28.    if (argc!=3)
  29.    {
  30.       printf("Usage : sc rootdir filename\n");
  31.       exit(0);
  32.    };
  33.    if (argv[1][strlen(argv[1])-1]=='/')
  34.       argv[1][strlen(argv[1])-1]=0;
  35.    if ((mylock=Lock(argv[1],ACCESS_READ))==0)
  36.    {
  37.       printf("Unable to lock %s, DOS error code %d.\n",argv[1],IoErr());
  38.       exit(0);
  39.    };
  40.    strcpy(GlobalFileName,argv[1]);
  41.    strncpy(SearchChar,argv[2],108);
  42.    strlwr(SearchChar);
  43.    if (DoSizeCheck(mylock)==FALSE)
  44.       printf("Recursive routine failed\n");
  45.    else
  46.       if (!(found))
  47.          printf("%s not found.\n",argv[2]);
  48.    UnLock(mylock);
  49.    exit(0);
  50. }
  51.  
  52. BOOL DoSizeCheck(ALock)
  53. BPTR ALock;
  54. {
  55.    register struct FileInfoBlock *myFIB;
  56.    register BPTR NewLock;
  57.    register short int i;
  58.    register char tmp;
  59.  
  60.    if ((myFIB=(struct FileInfoBlock *)
  61.         AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC))==0)
  62.       return(FALSE);
  63.    if (Examine(ALock,myFIB)==FALSE)
  64.    {
  65.       FreeMem((APTR)myFIB,sizeof(struct FileInfoBlock));
  66.       return(FALSE);
  67.    };
  68.    if (myFIB->fib_DirEntryType<0)
  69.    /* A file : just add its size to total */
  70.    {
  71.       FreeMem((APTR)myFIB,sizeof(struct FileInfoBlock));
  72.       return(TRUE);
  73.    }
  74.    else
  75.    /* A subdir : check the whole contents */
  76.    {
  77.       for(;;)
  78.       {
  79.          if (ExNext(ALock,myFIB)==FALSE)
  80.          {
  81.             FreeMem((APTR)myFIB,sizeof(struct FileInfoBlock));
  82.             if (IoErr()==ERROR_NO_MORE_ENTRIES)
  83.                return(TRUE);
  84.             else
  85.                return(FALSE);
  86.          }
  87.          else
  88.          {
  89.             if (myFIB->fib_DirEntryType<0)
  90.             {
  91.             /* A file of the subdir : compare with searchdir */
  92.                strcpy(PotentialChar,myFIB->fib_FileName);
  93.                strlwr(PotentialChar);
  94.                if (strcmp(PotentialChar,SearchChar)==0)
  95.                {
  96.                   printf("Found in %s\n",GlobalFileName);
  97.                   found=TRUE;
  98.                };
  99.             }
  100.             else
  101.             {
  102.                if (GlobalFileName[strlen(GlobalFileName)-1]!=':')
  103.                   strcat(GlobalFileName,"/");
  104.                strcat(GlobalFileName,myFIB->fib_FileName);
  105.                NewLock=Lock(GlobalFileName,ACCESS_READ);
  106.                if (DoSizeCheck(NewLock)==FALSE)
  107.                {
  108.                   UnLock(NewLock);
  109.                   FreeMem((APTR)myFIB,sizeof(struct FileInfoBlock));
  110.                   return(FALSE);
  111.                };
  112.                for (i=strlen(GlobalFileName);
  113.                             ((tmp=GlobalFileName[i])!='/')&&(tmp!=':');
  114.                              i--)
  115.                   GlobalFileName[i]=0;
  116.                if (GlobalFileName[i]!=':')
  117.                   GlobalFileName[i]=0;
  118.                UnLock(NewLock);
  119.             };
  120.          };
  121.       };
  122.    };
  123. }
  124.