void label_name(struct doscp_t *cp, const char *filename, int *mangled, struct dos_name_t *ans) { memset(ans, ' ', 8 + 3); ans->sentinel = '\0'; wchar_t wbuffer[12]; int len = native_to_wchar(filename, wbuffer, 11, 0, 0); if (len > 11) { *mangled = 1; len = 11; } else *mangled = 0; int have_lower = 0; int have_upper = 0; int i = 0; for(i = 0; i < len; i++) { if (islower(wbuffer[i])) have_lower = 1; if (isupper(wbuffer[i])) have_upper = 1; wbuffer[i] = towupper(wbuffer[i]); if (wcschr(L"^+=/[]:,?*\\<>|\".", wbuffer[i])) { *mangled = 1; wbuffer[i] = '~'; } } if (have_lower && have_upper) *mangled = 1; wchar_to_dos(cp, wbuffer, ans->base, len, mangled); }
static void TranslateToDos(doscp_t *toDos, const char *in, char *out, int count, char *end, Case_t *Case, int *mangled) { wchar_t buffer[12]; wchar_t *s=buffer; wchar_t *t=buffer; /* first convert to wchar, so we get to use towupper etc. */ native_to_wchar(in, buffer, count, end, mangled); buffer[count]='\0'; *Case = NONE; for( ; *s ; s++) { /* skip spaces & dots */ if(*s == ' ' || *s == '.') { *mangled |= 3; continue; } if (iswcntrl(*s)) { /* "control" characters */ *mangled |= 3; *t = '_'; } else if (iswlower(*s)) { *t = towupper(*s); if(*Case == UPPER && !mtools_no_vfat) *mangled |= 1; else *Case = LOWER; } else if (iswupper(*s)) { *t = *s; if(*Case == LOWER && !mtools_no_vfat) *mangled |= 1; else *Case = UPPER; } else *t = *s; t++; } wchar_to_dos(toDos, buffer, out, t - buffer, mangled); }
void label_name(doscp_t *cp, const char *filename, int verbose, int *mangled, dos_name_t *ans) { int len; int i; int have_lower, have_upper; wchar_t wbuffer[12]; memset(ans, ' ', sizeof(ans)-1); ans->sentinel = '\0'; len = native_to_wchar(filename, wbuffer, 11, 0, 0); if(len > 11){ *mangled = 1; len = 11; } else *mangled = 0; have_lower = have_upper = 0; for(i=0; i<len; i++){ if(islower(wbuffer[i])) have_lower = 1; if(isupper(wbuffer[i])) have_upper = 1; wbuffer[i] = towupper(wbuffer[i]); if( #ifdef HAVE_WCHAR_H wcschr(L"^+=/[]:,?*\\<>|\".", wbuffer[i]) #else strchr("^+=/[]:,?*\\<>|\".", wbuffer[i]) #endif ){ *mangled = 1; wbuffer[i] = '~'; } } if (have_lower && have_upper) *mangled = 1; wchar_to_dos(cp, wbuffer, ans->base, len, mangled); }
static __inline__ int write_slots(Stream_t *Dir, dos_name_t *dosname, char *longname, struct scan_state *ssp, write_data_callback *cb, void *arg, int Case) { direntry_t entry; /* write the file */ if (fat_error(Dir)) return 0; entry.Dir = Dir; entry.entry = ssp->slot; native_to_wchar(longname, entry.name, MAX_VNAMELEN, 0, 0); entry.name[MAX_VNAMELEN]='\0'; entry.dir.Case = Case & (EXTCASE | BASECASE); if (cb(dosname, longname, arg, &entry) >= 0) { if ((ssp->size_needed > 1) && (ssp->free_end - ssp->free_start >= ssp->size_needed)) { ssp->slot = write_vfat(Dir, dosname, longname, ssp->free_start, &entry); } else { ssp->size_needed = 1; write_vfat(Dir, dosname, 0, ssp->free_start, &entry); } /* clear_vses(Dir, ssp->free_start + ssp->size_needed, ssp->free_end); */ } else return 0; return 1; /* Successfully wrote the file */ }