예제 #1
0
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);
}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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 */
}