home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd2.bin / dosutils / gtar109 / dosname.c < prev    next >
C/C++ Source or Header  |  1991-01-14  |  1KB  |  59 lines

  1. /* Unix/HPFS filename translation for FAT file systems */
  2.  
  3. /* Author: Kai Uwe Rommel */
  4.  
  5. #include <stddef.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8.  
  9.  
  10. void ChangeNameForFAT(char *name)
  11. {
  12.   char *src, *dst, *next, *ptr, *dot;
  13.  
  14.   if ( isalpha(name[0]) && (name[1] == ':') )
  15.     src = dst = name + 2;
  16.   else
  17.     src = dst = name;
  18.  
  19.   if ( (*src == '/') || (*src == '\\') )
  20.     src++, dst++;
  21.  
  22.   while ( *src )
  23.   {
  24.     for ( next = src; *next && (*next != '/') && (*next != '\\'); next++ );
  25.  
  26.     for ( ptr = src, dot = NULL; ptr < next; ptr++ )
  27.       if ( *ptr == '.' )
  28.         *(dot = ptr) = '_'; /* remember last dot */
  29.  
  30.     if ( dot && (dot > src) &&
  31.          ((next - dot <= 4) ||
  32.           ((next - src > 8) && (dot - src > 3))) )
  33.     {
  34.       *dot = '.';
  35.  
  36.       for ( ptr = src; (ptr < dot) && ((ptr - src) < 8); ptr++ )
  37.         *dst++ = *ptr;
  38.  
  39.       for ( ptr = dot; (ptr < next) && ((ptr - dot) < 4); ptr++ )
  40.         *dst++ = *ptr;
  41.     }
  42.     else
  43.       for ( ptr = src; (ptr < next) && ((ptr - src) < 8); ptr++ )
  44.         *dst++ = *ptr;
  45.  
  46.     *dst++ = *next; /* either '/' or 0 */
  47.  
  48.     if ( *next )
  49.     {
  50.       src = next + 1;
  51.  
  52.       if ( *src == 0 ) /* handle trailing '/' on dirs ! */
  53.         *dst = 0;
  54.     }
  55.     else
  56.       break;
  57.   }
  58. }
  59.