home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / mtools / part01 / fixname.c < prev    next >
C/C++ Source or Header  |  1987-08-27  |  2KB  |  72 lines

  1. /*
  2.  * Convert a Unix filename to a legal MSDOS name.  Returns a pointer to
  3.  * the 'fixed' name.  Will truncate file and extension names, will
  4.  * substitute the letter 'X' for any illegal character in the name.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9.  
  10. char *
  11. fixname(name)
  12. char *name;
  13. {
  14.     static char *dev[8] = {"CON", "AUX", "COM1", "LPT1", "PRN", "LPT2",
  15.     "LPT3", "NUL"};
  16.     char *s, *temp, *ext, *malloc(), *strcpy(), *strpbrk(), *strrchr();
  17.     int i, dot, modified;
  18.     static char *ans;
  19.  
  20.     temp = malloc(strlen(name)+1);
  21.     strcpy(temp, name);
  22.                     /* zap the leading path */
  23.     if (s = strrchr(temp, '/'))
  24.         temp = s+1;
  25.     if (s = strrchr(temp, '\\'))
  26.         temp = s+1;
  27.  
  28.     ext = NULL;
  29.     dot = 0;
  30.     for (s = temp; *s; ++s) {
  31.         if (*s == '.' && !dot) {
  32.             dot = 1;
  33.             *s = NULL;
  34.             ext = s + 1;
  35.         }
  36.         if (islower(*s))
  37.             *s = toupper(*s);
  38.     }
  39.     if (*temp == NULL) {
  40.         temp = "X";
  41.         printf("'%s' Null name component, using '%s.%s'\n", name, temp, ext);
  42.     }
  43.     for (i=0; i<8; i++) {
  44.         if (!strcmp(temp, dev[i])) {
  45.             *temp = 'X';
  46.             printf("'%s' Is a device name, using '%s.%s'\n", name, temp, ext);
  47.         }
  48.     }
  49.     if (strlen(temp) > 8) {
  50.         *(temp+8) = NULL;
  51.         printf("'%s' Name too long, using, '%s.%s'\n", name, temp, ext);
  52.     }
  53.     if (strlen(ext) > 3) {
  54.         *(ext+3) = NULL;
  55.         printf("'%s' Extension too long, using '%s.%s'\n", name, temp, ext);
  56.     }
  57.     modified = 0;
  58.     while (s = strpbrk(temp, "^+=/[]:',?*\\<>|\". ")) {
  59.         modified++;
  60.         *s = 'X';
  61.     }
  62.     while (s = strpbrk(ext, "^+=/[]:',?*\\<>|\". ")) {
  63.         modified++;
  64.         *s = 'X';
  65.     }
  66.     if (modified)
  67.         printf("'%s' Contains illegal character\(s\), using '%s.%s'\n", name, temp, ext);
  68.     ans = malloc(12);
  69.     sprintf(ans, "%-8.8s%-3.3s", temp, ext);
  70.     return(ans);
  71. }
  72.