home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / ebksrc.arj / PCDIR.CPP < prev    next >
C/C++ Source or Header  |  1991-07-30  |  2KB  |  106 lines

  1. /*
  2.  
  3.     pcdir.cpp
  4.     7-30-91
  5.     dir.h enhancements
  6.  
  7.     Copyright 1991
  8.     John W. Small
  9.     All rights reserved
  10.     Use freely but acknowledge authorship and copyright.
  11.  
  12.     PSW / Power SoftWare
  13.     P.O. Box 10072
  14.     McLean, Virginia 22102 8072 USA
  15.  
  16.     Voice: (703) 759-3838
  17.     CIS: 73757,2233
  18.  
  19. */
  20.  
  21.  
  22. #include <string.h>
  23. #include <ctype.h>
  24. #include <dir.h>
  25. #include <pcdir.hpp>
  26.  
  27. int fnflags;
  28.  
  29. static char path[MAXPATH];
  30. static char drive[MAXDRIVE];
  31. static char dir[MAXDIR];
  32. static char file[MAXFILE];
  33. static char ext[MAXEXT];
  34.  
  35.  
  36. char * fnexpand(const char *pathname)
  37. {
  38.  
  39.     char *d1, *d2;
  40.     int l;
  41.  
  42.     if (!pathname) return (char *)0;
  43.     (void) fnsplit(pathname,drive,dir,file,ext);
  44.     if (!strlen(drive))  {
  45.         drive[0] = 'A' + getdisk();
  46.         strcpy(&drive[1],":");
  47.     }
  48.     if (!strlen(dir))  {
  49.         dir[0] = '\\';
  50.         (void) getcurdir(toupper(drive[0])-'A'+1,&dir[1]);
  51.         if (dir[1] != '\0')
  52.             strcat(dir,"\\");
  53.     }
  54.     else  {
  55.         if (dir[0] != '\\')  {
  56.             l = strlen(dir);
  57.             dir[0] = '\\';
  58.             dir[1] = '\0';
  59.             (void) getcurdir(toupper(drive[0])-'A'+1,&dir[1]);
  60.             if (strlen(dir) > 1)
  61.                 strcat(dir,"\\");
  62.             if (l + strlen(dir) >= MAXDIR)
  63.                 return (char *) 0;
  64.             (void) fnsplit(pathname,0,&dir[strlen(dir)],0,0);
  65.         }
  66.         /*  "\\.\\" -> "\\"  */
  67.         while ((d1 = strstr(dir,"\\.\\")) != (char *)0)
  68.             strcpy(d1,d1+2);
  69.         /*  "\\X\\..\\" -> "\\"  */
  70.         while ((d2 = strstr(dir,"\\..\\")) != (char *)0)  {
  71.             for (d1 = d2 - 1; d1 >= dir && *d1 != '\\'; d1--);
  72.             if (d1 < dir) return (char *) 0;
  73.             strcpy(d1,d2+3);
  74.         }
  75.         /*  "\\X\\.." -> "\\"  */
  76.         if ((d2 = strstr(dir,"\\..")) != (char *)0)  {
  77.             for (d1 = d2 - 1; d1 >= dir && *d1 != '\\'; d1--);
  78.             if (d1 < dir) return (char *) 0;
  79.             strcpy(d1+1,d2+3);
  80.         }
  81.         /*  "\\." -> "\\"  */
  82.         if ((d1 = strstr(dir,"\\.")) != (char *)0)
  83.             strcpy(d1+1,d1+2);
  84.     }
  85.     fnmerge(path,drive,dir,file,ext);
  86.     for (l = strlen(path); l > 3 && path[l-1] == '\\'; l--)
  87.         path[l-1] = '\0';
  88.     fnflags = fnsplit(path,0,0,0,0);
  89.     return path;
  90. }
  91.  
  92. char *fndefault (const char *pathname,
  93.     char *driveDefault, char *dirDefault,
  94.     char *fileDefault, char *extDefault)
  95. {
  96.     (void) fnsplit(pathname,drive,dir,file,ext);
  97.     fnmerge(path,
  98.         strlen(drive)? drive : driveDefault,
  99.         strlen(dir)? dir : dirDefault,
  100.         strlen(file)? file : fileDefault,
  101.         strlen(ext)? ext : extDefault);
  102.     fnflags = fnsplit(path,0,0,0,0);
  103.     return path;
  104. }
  105.  
  106.