static bool to_8_3(char magic_char, const char *in, char out[13], int default_case) { int csum; char *p; char extension[4]; char base[9]; int baselen = 0; int extlen = 0; char *s = SMB_STRDUP(in); extension[0] = 0; base[0] = 0; if (!s) { return False; } p = strrchr(s,'.'); if( p && (strlen(p+1) < (size_t)4) ) { bool all_normal = ( strisnormal(p+1, default_case) ); /* XXXXXXXXX */ if( all_normal && p[1] != 0 ) { *p = 0; csum = str_checksum( s ); *p = '.'; } else csum = str_checksum(s); } else csum = str_checksum(s); if (!strupper_m( s )) { SAFE_FREE(s); return false; } if( p ) { if( p == s ) strlcpy( extension, "___", 4); else { *p++ = 0; while( *p && extlen < 3 ) { if ( *p != '.') { extension[extlen++] = p[0]; } p++; } extension[extlen] = 0; } } p = s; while( *p && baselen < 5 ) { if (isbasechar(*p)) { base[baselen++] = p[0]; } p++; } base[baselen] = 0; csum = csum % (MANGLE_BASE*MANGLE_BASE); memcpy(out, base, baselen); out[baselen] = magic_char; out[baselen+1] = mangle( csum/MANGLE_BASE ); out[baselen+2] = mangle( csum ); if( *extension ) { out[baselen+3] = '.'; strlcpy(&out[baselen+4], extension, 4); } SAFE_FREE(s); return True; }
/***************************************************************************** * do the actual mangling to 8.3 format * the buffer must be able to hold 13 characters (including the null) ***************************************************************************** */ static void to_8_3(char *s, int default_case) { int csum; char *p; char extension[4]; char base[9]; int baselen = 0; int extlen = 0; extension[0] = 0; base[0] = 0; p = strrchr(s,'.'); if( p && (strlen(p+1) < (size_t)4) ) { BOOL all_normal = ( strisnormal(p+1, default_case) ); /* XXXXXXXXX */ if( all_normal && p[1] != 0 ) { *p = 0; csum = str_checksum( s ); *p = '.'; } else csum = str_checksum(s); } else csum = str_checksum(s); strupper_m( s ); if( p ) { if( p == s ) safe_strcpy( extension, "___", 3 ); else { *p++ = 0; while( *p && extlen < 3 ) { if ( *p != '.') { extension[extlen++] = p[0]; } p++; } extension[extlen] = 0; } } p = s; while( *p && baselen < 5 ) { if (isbasechar(*p)) { base[baselen++] = p[0]; } p++; } base[baselen] = 0; csum = csum % (MANGLE_BASE*MANGLE_BASE); (void)slprintf(s, 12, "%s%c%c%c", base, magic_char, mangle( csum/MANGLE_BASE ), mangle( csum ) ); if( *extension ) { (void)pstrcat( s, "." ); (void)pstrcat( s, extension ); } }