home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / pcmag / vol7n14.arc / QFN.C < prev    next >
Text File  |  1988-04-25  |  4KB  |  146 lines

  1. /*
  2.     QFN.C   Qualify Filename
  3.  
  4.     (C) 1988 Ziff Davis Communications
  5.     Ray Duncan, April 1988
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <dos.h>
  11.  
  12. union REGS regs;
  13.  
  14. static void setdrv(int);            /* function prototypes */
  15. static void setpath(char *);
  16. static int getdrv(void);
  17. static void getpath(char *);
  18.  
  19. static char qbuff[80];              /* for qualified filename */
  20.  
  21. char *qfn(char *p)
  22. {   
  23.     char tbuff[80];                 /* target directory */
  24.     char cpath[80];                 /* path at entry */
  25.     int cdrive;                     /* drive at entry */
  26.     char *q;                        /* scratch pointer */
  27.     unsigned i;                     /* scratch index */
  28.  
  29.     cdrive = getdrv();              /* get current drive */
  30.  
  31.     getpath(&cpath[1]);             /* get current directory */
  32.     cpath[0] = '\\';                /* and prepend backslash */
  33.  
  34.                                     /* any drive specified? */
  35.     if((strlen(p) >= 2) && (p[1] == ':'))
  36.     {   
  37.         i = (p[0] | 0x20) - 'a';    /* yes, convert ASCII drive 
  38.                                        to binary drive code */
  39.  
  40.         setdrv(i);                  /* switch to new drive */
  41.  
  42.         if(getdrv() != i)           /* if drive doesn't exist */
  43.             return(NULL);           /* return an error */
  44.  
  45.         getpath(&cpath[1]);         /* get current directory
  46.                                        of new drive */
  47.  
  48.         p += 2;                     /* bump ptr past drive */
  49.     }   
  50.  
  51.     strcpy(tbuff, p);               /* copy target pathname 
  52.                                        to local buffer */
  53.  
  54.     q = strrchr(tbuff, '\\');       /* look for last backslash */
  55.  
  56.     if (q != NULL)                  /* any path specified? */
  57.     {   
  58.         *q = 0;                     /* yes, make path ASCIIZ */
  59.  
  60.         if(q == tbuff)              /* select directory */
  61.              setpath("\\");         /* target is root */
  62.         else setpath(tbuff);        /* target is not root */
  63.  
  64.         if(regs.x.cflag)            /* exit if directory */
  65.         {                           /* does not exist */
  66.             setpath(cpath);         /* restore original path */
  67.             setdrv(cdrive);         /* restore original drive */
  68.             return(NULL);
  69.         }
  70.         
  71.         q += 1;                     /* point to filename */
  72.     }
  73.     else q = tbuff;                 /* if no path specified,
  74.                                        point to filename */
  75.  
  76.                                     /* now drive and/or path
  77.                                        are selected, build
  78.                                        qualified filename */
  79.  
  80.     qbuff[0] = getdrv() + 'a';      /* get target drive and
  81.                                        convert to ASCII */
  82.  
  83.     qbuff[1] = ':';                 /* add drive delimiter */
  84.     qbuff[2] = '\\';                /* and root backslash */
  85.  
  86.     getpath(&qbuff[3]);             /* get target directory */
  87.     
  88.     i = strlen(qbuff);              /* length of drive+path */
  89.  
  90.     if(i != 3) qbuff[i++] = '\\';   /* if not root add a
  91.                                        trailing backslash */
  92.  
  93.     strcpy(qbuff+i, q);             /* copy in filename */  
  94.  
  95.     setpath(cpath);                 /* restore original path */
  96.     setdrv(cdrive);                 /* restore original drive */
  97.  
  98.     return(strlwr(qbuff));          /* fold pathname to lower 
  99.                                        case, return pointer */
  100. }
  101.  
  102.  
  103. /*
  104.     Set current drive using MS-DOS Int 21H Function 0EH
  105. */
  106. static void setdrv(int drive)
  107. {
  108.     regs.h.ah = 0x0e;
  109.     regs.h.dl = drive;
  110.     int86(0x21, ®s, ®s);
  111. }
  112.  
  113.  
  114. /*
  115.     Set current path using MS-DOS Int 21H Function 3BH
  116. */
  117. static void setpath(char *p)
  118. {
  119.     regs.h.ah = 0x3b;
  120.     regs.x.dx = (unsigned) p;
  121.     int86(0x21, ®s, ®s);
  122. }
  123.  
  124.  
  125. /*
  126.     Get current drive using MS-DOS Int 21H Function 19H
  127. */
  128. static int getdrv(void)
  129. {
  130.     regs.h.ah = 0x19;
  131.     int86(0x21, ®s, ®s);
  132.     return(regs.h.al);
  133. }
  134.  
  135.  
  136. /*
  137.     Get current path using MS-DOS Int 21H Function 47H
  138. */
  139. static void getpath(char *p)
  140. {
  141.     regs.h.ah = 0x47;       
  142.     regs.h.dl = 0;
  143.     regs.x.si = (unsigned) p;
  144.     int86(0x21, ®s, ®s);
  145. }
  146.