/*
Auto: cc -qf -bs <path><file>
Auto: ln <path><file>.o -la -lc -g -o <path><file>
*/

/*  sp (SearchPath) V 0.9 Andreas Obländer
    scannt alle im aktuellen CLI eingetragenen Pfade nach dem File, das
    als Parameter sp übergeben wird.

    BUGS: Kein echter Bug: Wenn das CurrentDir auch im Pfad eingetragen ist
          wird dieses Verzeichnis zweimal durchsucht.

*/

#include <stdio.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <arp/arpbase.h>
#include <functions.h>

#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))

struct CommandLineInterface *CLI;
struct ArpBase *ArpBase;
struct FileInfoBlock *FIB;

struct PathList
{
  BPTR NextPath;
  BPTR PathLock;
};

BYTE i;
BYTE j;
BOOL result=TRUE;
char dirname[256];




main(argc, argv)
int argc;
char **argv;
{
BPTR templock;
struct Process *myprocess;
struct PathList *PathPointer;

  if (argc == 1) 
    {
    printf("\x9B\x33\x33\x6dSearchPath V1.0\x9B\x33\x31\x6d  (c)  Andreas Obländer\n");
    printf("                Idee: Andreas Wittkemper\n\n");
    printf("\x9B\x33\x33\x6dUsage:\x9B\x33\x31\x6d sp <filename to search>\n\n");
    printf("       sp scannt alle Directories im Suchpfad des aktuellen CLI\n");
    printf("       nach dem File, das sp als Parameter übergeben wurde.\n");
    exit(20);
    }


if (ArpBase = (struct ArpBase *)OpenLibrary("arp.library",0L))
  {
  myprocess= (struct Process *) FindTask(NULL);
  CLI=(struct CommandLineInterface *) BADDR(myprocess->pr_CLI);

  FIB= (struct FileInfoBlock *)
  AllocMem ( sizeof(struct FileInfoBlock), MEMF_PUBLIC);
  
  ScanDir(templock=CurrentDir(NULL),argv[1]);
  CurrentDir(templock);

  PathPointer=(struct PathList *)BADDR(CLI->cli_CommandDir);
  
  while(PathPointer)
    {
    ScanDir(PathPointer->PathLock,argv[1]);
    PathPointer = (struct PathList *)BADDR(PathPointer->NextPath);
    }  

  if(templock=Lock("C:",ACCESS_READ))
    {
    ScanDir(templock,argv[1]);
    UnLock(templock);
    }

  }
else
  {        
  printf("Arp.library nicht vorhanden\n");
  exit(99);
  }
if (FIB) FreeMem(FIB,sizeof(struct FileInfoBlock));

}


ScanDir(lock,arg)
BPTR lock;
char *arg;
{
    if (Examine(lock, FIB))
      {

      PathName(lock,dirname,8);

      while(ExNext(lock, FIB))
        {
        if (FIB->fib_DirEntryType < 0) 
          {
          result = TRUE;
          for ( j=0 ; j < MAX(strlen(FIB->fib_FileName),strlen(arg)); j++ )
            {
          if (tolower(*(FIB->fib_FileName+j)) ==  tolower( *(arg+j)))
              {
              continue;
              }
          else
              {
              result=FALSE;
              break;
              }
            }
          if (result) printf ("%s \n",dirname);
          }
        }

      if (IoErr() != ERROR_NO_MORE_ENTRIES) 
          printf("Konnte Verzeichnis nicht vollständig durchlaufen!!\n");


      } 
}

_wb_parse() {}


