TOOLKIT\JUMP.C  ·  C  ·  2.4 KB  ·  1988-10-01  ·  from PersonalComputing_Oct-1988_Disk-1
#include <dos.h>
#define TRUE  1
#define FALSE 0
char badpath[]="Bad Path Name";
char usage[]="USAGE:-  JUMP [drive:] directory";
char nodir[]="Directory Not Found";
char path[70],dirname[13];              /* TO BE REMOVED FOR FINAL VERSION */
/*  char *path,*dirname; */
 
main(argc,argv)
char *argv[];
int argc;
{
char *ptr,*strupr();
/*  char pathbuffer[70],dirbuffer[13];  */
 
/*  path=pathbuffer; dirname=dirbuffer;  */
/*  _chkstack();  */
if (argc!=2) error(usage);
strcpy(path,argv[1]);
ptr=strupr(path);                                 /* convert to upper case */
if (ptr[1]==':') ptr+=2;
if (ptr[0]=='\\') { ptr[1]=0; change(); }
if (strlen(ptr)<13)                       /* ensure not longer than buffer */
  {
  strcpy(dirname,ptr);
  ptr[0]=0;                                   /* terminate string for path */
  find_dir();
  }
error(nodir);                                   /* if gets here, not found */
}
 
 
 
 
find_dir()
{
struct FIND dta;
char *pathend;
 
/*  _chkstack();  */
strcat(path,"\\");
pathend=path+strlen(path);
bdos(0x1a,&dta);                             /* set disk transfer address */
strcat(path,"*.*");                       /* set search path as all files */
if (findfrst(0x10))
  do if ((dta.attribute & 0x10)&&(dta.name[0]!='.')) /* if valid directory */
        {
        strcpy(pathend,&dta.name[0]);                 /* add name to path */
        if (strncmp(dta.name,dirname,strlen(dirname))==0) change();
        find_dir();                    /* recurse down directory branches */
        bdos(0x1a,&dta);     /* reset disk transfer address for next find */
        }
  while (findnxt());
}
 
 
error(str)
char *str;
{
printf("%s",str);                       /* TO BE REMOVED FOR FINAL VERSION */
/*  display(str);  */
exit(1);
}
 
 
 
findfrst(attr)
int attr;
{
REGS regs;
 
regs.ax=0x4e00;
regs.dx=(int) path;
regs.cx=attr;
if (intdos(&regs,&regs) & 1)
  {
  if (regs.ax==3) error(badpath);
  return FALSE;
  }
return TRUE;
}
 
 
 
findnxt()
{
REGS regs;
 
regs.ax=0x4f00;
if (intdos(&regs,&regs) & 1) return FALSE;
return TRUE;
}
 
 
change()
{
if (chdir(path)==-1) error(badpath);           /* change current directory */
if (path[1]==':')  bdos(0x0e,path[0]-'A');  /* change current drive if reqd */
printf("Changing to %s",path);           /* TO BE REMOVED FOR FINAL VERSION */
/*  dispnl("Changing to ");
    display(path);   */
exit(0);
}