
/* search binary file for string of characters  */

#include "exec/types.h"
#include "lattice/stdio.h"
#include "exec/exec.h"
#include "libraries/dosextens.h"
#include  "exec/memory.h"
#include  "libraries/dos.h"

struct FileHandle *Open();
struct FileHandle *ff;
struct FileLock  *lock, *nlock,*ll, *Lock(), *CurrentDir();
struct FileInfoBlock *fib;

char ins[80];
char fname[40],vname[40],buf[20];
int count,fs;
int bsearch();

void main(argc,argv)
int argc;
char *argv[];
{
 int s,b;
 if (argc<2){
   printf("\nUsage: bins [file or Dir] [search string]\n");
   exit(0);
   }
 strcpy(vname,argv[1]);
 strcpy(ins,argv[2]);
 count=strlen(ins);
 buf[count]='\0';
 ll=Lock("",ACCESS_READ);  /* get current directory lock */
 fib=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR);
 lock=(struct FileLock *)AllocMem(sizeof(struct FileLock),MEMF_CLEAR);
 lock=Lock(vname,ACCESS_READ);
 if(lock==NULL)Exit(0);
 s=Examine(lock,fib);
 if(s==0)Exit(0);
 if(fib->fib_DirEntryType >0)   /*if its a directory */
 {
   nlock = CurrentDir(lock);   /* make it current */
   while(s!=0)
   {
    s=ExNext(lock,fib);
    strcpy(fname,fib->fib_FileName);
    fs=fib->fib_Size;
    if(bsearch()==1) break;
   }
 }
 else                           /* if a file */
 {
   strcpy(fname,fib->fib_FileName);
   fs=fib->fib_Size;
   b=bsearch();
 }
 UnLock(lock);
 nlock=CurrentDir(ll);   /* return to current dir */
 printf("\n");
}
/* ************ search function *************/
int bsearch()
{
int posi=0,ac;
 ff=Open(fname,MODE_OLDFILE);      /* open file for read */
 if(ff==NULL){
  printf("Cannot open file!\n");
  return(1);
  }
  printf("\n Searching file ");
  printf("%s   ",fname);
  printf("%d ",fs);
  printf("bytes\n");
 ac=count;
 while(ac==count)          /* repeat until end of file */
 {
    ac=Read(ff,buf,count);  /* read chars into buf */
    if(strcmp(buf,ins)==0)
    {
      printf(" Hooray!! I found a match !\n");
      printf(" Shall I continue ? ");
      if(getchar()=='n'){
        Close(ff);
        return(1) ;
      }
     }
     posi++;
     Seek(ff,posi,OFFSET_BEGINNING);
  }
  printf(" Sorry, no match found...\n");
  Close(ff);
  return(0);
 }


