home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / disk / mkisofs-1.00.7.lha / mkisofs / unix / filename.c next >
C/C++ Source or Header  |  1994-05-29  |  1KB  |  67 lines

  1. /* filename.c: */
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "unixlib.h"
  6.  
  7. static int only_slashes (char *p_from, char *p_to)
  8. {
  9.   char *cp;
  10.   
  11.   for (cp=p_from; cp<=p_to; cp++)
  12.     if (*cp != '/')
  13.       return 0;
  14.   return 1;
  15. }
  16.  
  17. /* remove files "." and ".." from a Unix filename: */
  18.  
  19. void remove_dot_files (char *buf)
  20. {
  21.   char *cp;
  22.  
  23.   if (cp = strchr (buf, ':'))
  24.     cp++;
  25.   else
  26.     cp = buf;
  27.  
  28.   while (*cp) {
  29.     if (cp[0] == '.' && (cp[1] == 0 || cp[1] == '/')) {
  30.       if (cp[1] == 0)
  31.         cp[0] = 0;
  32.       else
  33.     memmove (cp, cp+2, strlen (cp+2) + 1);
  34.     } else if (cp[0] == '.' && cp[1] == '.' && (cp[2] == 0 || cp[2] == '/')) {
  35.       if (cp == buf || only_slashes (buf, cp-1)) {
  36.         cp[0] = '/';
  37.     if (cp[2] == 0)
  38.       cp[1] = 0;
  39.     else
  40.       memmove (cp+1, cp+3, strlen (cp+3) + 1);
  41.     cp++;
  42.       } else if (cp[-1] == ':') {
  43.         if (cp[2] == 0)
  44.       cp[0] = 0;
  45.     else
  46.         memmove (cp, cp+3, strlen (cp+3) + 1);
  47.       } else {
  48.         char *back = cp - 2;
  49.     while (back > buf && *back != '/' && *back != ':')
  50.       back--;
  51.     if (*back == '/' || *back == ':')
  52.       back++;
  53.     if (cp[2] == 0)
  54.       *back = 0;
  55.     else
  56.       memmove (back, cp+3, strlen (cp+3) + 1);
  57.     cp = back;
  58.       }
  59.     } else {
  60.       while (*cp != '/' && *cp != 0)
  61.         cp++;
  62.       if (*cp)
  63.         cp++;
  64.     }
  65.   }
  66. }
  67.