/*
* FIND is a progam was writen to help maintain files on my hard disc.
* This program should run on any CP/M 2.2 or higher revision machine.
* It was developed using CP/M 3.0 and the AZTEC C compiler vers. 1.06B.
*
* To compile:
*            cc -dTINY find.c
*            as find.asm
*            ln find.o t.lib c.lib
*
* As this program was a quick ditch effort, I welcome any and all
* modifications that anyone makes to it.  For example, anbiguous(* , ?)
* filenames are not extracted from the DMA address after the bdos
* call to "search filename".  The program also does not allow the
* user to search specific user areas, it assumes a scan of user 0
* thru user 15.
*
* Have fun with it, but this program is not for resale in any form.
*
* Please send any ideas/changes/reactions to me in mail.  Do not post.
*
* Jeff Gibson                     UUCP: {cepu,ihnp4,noao,uiucdcs}!bradley!jmg
* Bradley University              ARPA: cepu!bradley!jmg@UCLA-LOCUS
* Peoria, IL 61625                PH: (309) 692-9069
*
*/
#include "stdio.h"

int  drive_range[17],
    DRIVES;

main(argc, argv)
int argc;
char *argv[];
{
 char  fn[36],
       drive_name;

 int   i,
       old_user,
       new_user,
       found,
       drive;


 if (--argc < 1)
  {
    printf("\nusage:  find -drives abcdefghijklmnop filename\n");
    bios(0);
  }

 DRIVES = found = FALSE;

 *++argv;
 if  (*argv[0] == '-')
  {
    check(*argv);
    com_line(*++argv);
  }
 else
   {
     *--argv;
     drive_range[0] = 0;
     drive_range[1] = -1;
   }
 fcbinit(*++argv, &fn);
 old_user = getusr();
 i = 0;
 putchar('\n');
 while (drive_range[i] != -1)
  {
     fn[0] = drive_range[i];
     for (new_user=0; new_user < 16; new_user++)
      {
         if  (bdos(11) == 1)                 /* check for key strike */
            if  (getchar() == 0x03)          /* abort on ^C */
               bios(0);
         setusr(new_user);
         if  (bdos(17, fn) != 0xff)
          {
            found = TRUE;
            if  (drive_range[i] == 0)
               drive_name = (char)(drive_range[i] + 65);
            else
               drive_name = (char)(drive_range[i] + 64);
            printf("%s: USER %d  DRIVE %c\n", *argv, new_user, drive_name);
          }
      }
     i++;
  }
if  (!found)
   printf("%s: was not found\n", *argv);
setusr(old_user);
bios(0);
}

check(argv)
char argv[];
{
   if  (tolower(argv[1]) == 'd')
      DRIVES = TRUE;
   else
     {
       printf ("\nERROR in argument\n");
       bios(0);
     }
}


com_line(line)
char line[];
{
  int i, j;

  if  (DRIVES)
   {
     i = 0;
     j = 0;
     while  (tolower(line[i]) >= 'a' && tolower(line[i]) <= 'p')
      {
          drive_range[j] = (int)(tolower(line[i++]) - 0x60);
          j++;
      }
     drive_range[j] = -1;
   }
  else
    {
       printf("ERROR --- illegal drive specification.\n");
       bios(0);
    }
}