static int WIN32_rename(const char *from, const char *to)
	{
	TCHAR  *tfrom=NULL,*tto;
	DWORD	err;
	int	ret=0;

	if (sizeof(TCHAR) == 1)
		{
		tfrom = (TCHAR *)from;
		tto   = (TCHAR *)to;
		}
	else	/* UNICODE path */
		{
		size_t i,flen=strlen(from)+1,tlen=strlen(to)+1;
		tfrom = (TCHAR *)malloc(sizeof(TCHAR)*(flen+tlen));
		if (tfrom==NULL) goto err;
		tto=tfrom+flen;
#if !defined(_WIN32_WCE) || _WIN32_WCE>=101
		if (!MultiByteToWideChar(CP_ACP,0,from,flen,(WCHAR *)tfrom,flen))
#endif
			for (i=0;i<flen;i++)	tfrom[i]=(TCHAR)from[i];
#if !defined(_WIN32_WCE) || _WIN32_WCE>=101
		if (!MultiByteToWideChar(CP_ACP,0,to,  tlen,(WCHAR *)tto,  tlen))
#endif
			for (i=0;i<tlen;i++)	tto[i]  =(TCHAR)to[i];
		}

	if (MoveFile(tfrom,tto))	goto ok;
	err=GetLastError();
	if (err==ERROR_ALREADY_EXISTS || err==ERROR_FILE_EXISTS)
		{
		if (DeleteFile(tto) && MoveFile(tfrom,tto))
			goto ok;
		err=GetLastError();
		}
	if (err==ERROR_FILE_NOT_FOUND || err==ERROR_PATH_NOT_FOUND)
		errno = ENOENT;
	else if (err==ERROR_ACCESS_DENIED)
		errno = EACCES;
	else
		errno = EINVAL;	/* we could map more codes... */
err:
	ret=-1;
ok:
	if (tfrom!=NULL && tfrom!=(TCHAR *)from)	free(tfrom);
	return ret;
	}
static int WIN32_rename(const char *from, const char *to)
	{
	TCHAR  *tfrom=NULL,*tto;
	DWORD	err;
	int	ret=0;

	if (sizeof(TCHAR) == 1)
		{
		tfrom = (TCHAR *)from;
		tto   = (TCHAR *)to;
		}
	else	 
		{
		size_t i,flen=strlen(from)+1,tlen=strlen(to)+1;
		tfrom = (TCHAR *)malloc(sizeof(TCHAR)*(flen+tlen));
		if (tfrom==NULL) goto err;
		tto=tfrom+flen;
#if !defined(_WIN32_WCE) || _WIN32_WCE>=101
		if (!MultiByteToWideChar(CP_ACP,0,from,flen,(WCHAR *)tfrom,flen))
#endif
			for (i=0;i<flen;i++)	tfrom[i]=(TCHAR)from[i];
#if !defined(_WIN32_WCE) || _WIN32_WCE>=101
		if (!MultiByteToWideChar(CP_ACP,0,to,  tlen,(WCHAR *)tto,  tlen))
#endif
			for (i=0;i<tlen;i++)	tto[i]  =(TCHAR)to[i];
		}

	if (MoveFile(tfrom,tto))	goto ok;
	err=GetLastError();
	if (err==ERROR_ALREADY_EXISTS || err==ERROR_FILE_EXISTS)
		{
		if (DeleteFile(tto) && MoveFile(tfrom,tto))
			goto ok;
		err=GetLastError();
		}
	if (err==ERROR_FILE_NOT_FOUND || err==ERROR_PATH_NOT_FOUND)
		errno = ENOENT;
	else if (err==ERROR_ACCESS_DENIED)
		errno = EACCES;
	else
		errno = EINVAL;	 
err:
	ret=-1;
ok:
	if (tfrom!=NULL && tfrom!=(TCHAR *)from)	free(tfrom);
	return ret;
	}