亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ff.c

?? STM32SDCardSourceCodeFATFS.rar
?? C
?? 第 1 頁 / 共 5 頁
字號:




/*-----------------------------------------------------------------------*/
/* Calculate sum of an SFN                                               */
/*-----------------------------------------------------------------------*/
#if _USE_LFN
static
BYTE sum_sfn (
	const BYTE *dir		/* Ptr to directory entry */
)
{
	BYTE sum = 0;
	int n = 11;

	do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n);
	return sum;
}
#endif




/*-----------------------------------------------------------------------*/
/* Directory handling - Find an object in the directory                  */
/*-----------------------------------------------------------------------*/

static
FRESULT dir_find (
	DIR *dj			/* Pointer to the directory object linked to the file name */
)
{
	FRESULT res;
	BYTE c, *dir;
#if _USE_LFN
	BYTE a, ord, sum;
#endif

	res = dir_seek(dj, 0);			/* Rewind directory object */
	if (res != FR_OK) return res;

#if _USE_LFN
	ord = sum = 0xFF;
#endif
	do {
		res = move_window(dj->fs, dj->sect);
		if (res != FR_OK) break;
		dir = dj->dir;					/* Ptr to the directory entry of current index */
		c = dir[DIR_Name];
		if (c == 0) { res = FR_NO_FILE; break; }	/* Reached to end of table */
#if _USE_LFN	/* LFN configuration */
		a = dir[DIR_Attr] & AM_MASK;
		if (c == 0xE5 || ((a & AM_VOL) && a != AM_LFN)) {	/* An entry without valid data */
			ord = 0xFF;
		} else {
			if (a == AM_LFN) {			/* An LFN entry is found */
				if (dj->lfn) {
					if (c & 0x40) {		/* Is it start of LFN sequence? */
						sum = dir[LDIR_Chksum];
						c &= 0xBF; ord = c;	/* LFN start order */
						dj->lfn_idx = dj->index;
					}
					/* Check validity of the LFN entry and compare it with given name */
					ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF;
				}
			} else {					/* An SFN entry is found */
				if (!ord && sum == sum_sfn(dir)) break;	/* LFN matched? */
				ord = 0xFF; dj->lfn_idx = 0xFFFF;	/* Reset LFN sequence */
				if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break;	/* SFN matched? */
			}
		}
#else		/* Non LFN configuration */
		if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */
			break;
#endif
		res = dir_next(dj, FALSE);		/* Next entry */
	} while (res == FR_OK);

	return res;
}




/*-----------------------------------------------------------------------*/
/* Read an object from the directory                                     */
/*-----------------------------------------------------------------------*/
#if _FS_MINIMIZE <= 1
static
FRESULT dir_read (
	DIR *dj			/* Pointer to the directory object that pointing the entry to be read */
)
{
	FRESULT res;
	BYTE c, *dir;
#if _USE_LFN
	BYTE a, ord = 0xFF, sum = 0xFF;
#endif

	res = FR_NO_FILE;
	while (dj->sect) {
		res = move_window(dj->fs, dj->sect);
		if (res != FR_OK) break;
		dir = dj->dir;					/* Ptr to the directory entry of current index */
		c = dir[DIR_Name];
		if (c == 0) { res = FR_NO_FILE; break; }	/* Reached to end of table */
#if _USE_LFN	/* LFN configuration */
		a = dir[DIR_Attr] & AM_MASK;
		if (c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) {	/* An entry without valid data */
			ord = 0xFF;
		} else {
			if (a == AM_LFN) {			/* An LFN entry is found */
				if (c & 0x40) {			/* Is it start of LFN sequence? */
					sum = dir[LDIR_Chksum];
					c &= 0xBF; ord = c;
					dj->lfn_idx = dj->index;
				}
				/* Check LFN validity and capture it */
				ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF;
			} else {					/* An SFN entry is found */
				if (ord || sum != sum_sfn(dir))	/* Is there a valid LFN? */
					dj->lfn_idx = 0xFFFF;		/* It has no LFN. */
				break;
			}
		}
#else		/* Non LFN configuration */
		if (c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL))	/* Is it a valid entry? */
			break;
#endif
		res = dir_next(dj, FALSE);				/* Next entry */
		if (res != FR_OK) break;
	}

	if (res != FR_OK) dj->sect = 0;

	return res;
}
#endif



/*-----------------------------------------------------------------------*/
/* Register an object to the directory                                   */
/*-----------------------------------------------------------------------*/
#if !_FS_READONLY
static
FRESULT dir_register (	/* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */
	DIR *dj				/* Target directory with object name to be created */
)
{
	FRESULT res;
	BYTE c, *dir;
#if _USE_LFN	/* LFN configuration */
	WORD n, ne, is;
	BYTE sn[12], *fn, sum;
	WCHAR *lfn;


	fn = dj->fn; lfn = dj->lfn;
	mem_cpy(sn, fn, 12);

	if (_FS_RPATH && (sn[NS] & NS_DOT)) return FR_INVALID_NAME;	/* Cannot create dot entry */

	if (sn[NS] & NS_LOSS) {			/* When LFN is out of 8.3 format, generate a numbered name */
		fn[NS] = 0; dj->lfn = NULL;			/* Find only SFN */
		for (n = 1; n < 100; n++) {
			gen_numname(fn, sn, lfn, n);	/* Generate a numbered name */
			res = dir_find(dj);				/* Check if the name collides with existing SFN */
			if (res != FR_OK) break;
		}
		if (n == 100) return FR_DENIED;		/* Abort if too many collisions */
		if (res != FR_NO_FILE) return res;	/* Abort if the result is other than 'not collided' */
		fn[NS] = sn[NS]; dj->lfn = lfn;
	}

	if (sn[NS] & NS_LFN) {			/* When LFN is to be created, reserve reserve an SFN + LFN entries. */
		for (ne = 0; lfn[ne]; ne++) ;
		ne = (ne + 25) / 13;
	} else {						/* Otherwise reserve only an SFN entry. */
		ne = 1;
	}

	/* Reserve contiguous entries */
	res = dir_seek(dj, 0);
	if (res != FR_OK) return res;
	n = is = 0;
	do {
		res = move_window(dj->fs, dj->sect);
		if (res != FR_OK) break;
		c = *dj->dir;				/* Check the entry status */
		if (c == 0xE5 || c == 0) {	/* Is it a blank entry? */
			if (n == 0) is = dj->index;	/* First index of the contigulus entry */
			if (++n == ne) break;	/* A contiguous entry that requiered count is found */
		} else {
			n = 0;					/* Not a blank entry. Restart to search */
		}
		res = dir_next(dj, TRUE);	/* Next entry with table streach */
	} while (res == FR_OK);

	if (res == FR_OK && ne > 1) {	/* Initialize LFN entry if needed */
		res = dir_seek(dj, is);
		if (res == FR_OK) {
			sum = sum_sfn(dj->fn);	/* Sum of the SFN tied to the LFN */
			ne--;
			do {					/* Store LFN entries in bottom first */
				res = move_window(dj->fs, dj->sect);
				if (res != FR_OK) break;
				fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum);
				dj->fs->wflag = 1;
				res = dir_next(dj, FALSE);	/* Next entry */
			} while (res == FR_OK && --ne);
		}
	}

#else	/* Non LFN configuration */
	res = dir_seek(dj, 0);
	if (res == FR_OK) {
		do {	/* Find a blank entry for the SFN */
			res = move_window(dj->fs, dj->sect);
			if (res != FR_OK) break;
			c = *dj->dir;
			if (c == 0xE5 || c == 0) break;	/* Is it a blank entry? */
			res = dir_next(dj, TRUE);		/* Next entry with table streach */
		} while (res == FR_OK);
	}
#endif

	if (res == FR_OK) {		/* Initialize the SFN entry */
		res = move_window(dj->fs, dj->sect);
		if (res == FR_OK) {
			dir = dj->dir;
			mem_set(dir, 0, 32);		/* Clean the entry */
			mem_cpy(dir, dj->fn, 11);	/* Put SFN */
			dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT);	/* Put NT flag */
			dj->fs->wflag = 1;
		}
	}

	return res;
}
#endif /* !_FS_READONLY */




/*-----------------------------------------------------------------------*/
/* Remove an object from the directory                                   */
/*-----------------------------------------------------------------------*/
#if !_FS_READONLY && !_FS_MINIMIZE
static
FRESULT dir_remove (	/* FR_OK: Successful, FR_DISK_ERR: A disk error */
	DIR *dj				/* Directory object pointing the entry to be removed */
)
{
	FRESULT res;
#if _USE_LFN	/* LFN configuration */
	WORD i;

	i = dj->index;	/* SFN index */
	res = dir_seek(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx));	/* Goto the SFN or top of the LFN entries */
	if (res == FR_OK) {
		do {
			res = move_window(dj->fs, dj->sect);
			if (res != FR_OK) break;
			*dj->dir = 0xE5;			/* Mark the entry "deleted" */
			dj->fs->wflag = 1;
			if (dj->index >= i) break;	/* When reached SFN, all entries of the object has been deleted. */
			res = dir_next(dj, FALSE);	/* Next entry */
		} while (res == FR_OK);
		if (res == FR_NO_FILE) res = FR_INT_ERR;
	}

#else			/* Non LFN configuration */
	res = dir_seek(dj, dj->index);
	if (res == FR_OK) {
		res = move_window(dj->fs, dj->sect);
		if (res == FR_OK) {
			*dj->dir = 0xE5;			/* Mark the entry "deleted" */
			dj->fs->wflag = 1;
		}
	}
#endif

	return res;
}
#endif /* !_FS_READONLY */




/*-----------------------------------------------------------------------*/
/* Pick a segment and create the object name in directory form           */
/*-----------------------------------------------------------------------*/

static
FRESULT create_name (
	DIR *dj,			/* Pointer to the directory object */
	const XCHAR **path	/* Pointer to pointer to the segment in the path string */
)
{
#ifdef _EXCVT
	static const BYTE cvt[] = _EXCVT;
#endif

#if _USE_LFN	/* LFN configuration */
	BYTE b, cf;
	WCHAR w, *lfn;
	int i, ni, si, di;
	const XCHAR *p;

	/* Create LFN in Unicode */
	si = di = 0;
	p = *path;
	lfn = dj->lfn;
	for (;;) {
		w = p[si++];					/* Get a character */
		if (w < ' ' || w == '/' || w == '\\') break;	/* Break on end of segment */
		if (di >= _MAX_LFN)				/* Reject too long name */
			return FR_INVALID_NAME;
#if !_LFN_UNICODE
		w &= 0xFF;
		if (IsDBCS1(w)) {				/* If it is a DBC 1st byte */
			b = p[si++];				/* Get 2nd byte */
			if (!IsDBCS2(b))			/* Reject invalid code for DBC */
				return FR_INVALID_NAME;
			w = (w << 8) + b;
		}
		w = ff_convert(w, 1);			/* Convert OEM to Unicode */
		if (!w) return FR_INVALID_NAME;	/* Reject invalid code */
#endif
		if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */
			return FR_INVALID_NAME;
		lfn[di++] = w;					/* Store the Unicode char */
	}
	*path = &p[si];						/* Rerurn pointer to the next segment */
	cf = (w < ' ') ? NS_LAST : 0;		/* Set last segment flag if end of path */
#if _FS_RPATH
	if ((di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */
		(di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) {
		lfn[di] = 0;
		for (i = 0; i < 11; i++)
			dj->fn[i] = (i < di) ? '.' : ' ';
		dj->fn[i] = cf | NS_DOT;		/* This is a dot entry */
		return FR_OK;
	}
#endif
	while (di) {						/* Strip trailing spaces and dots */
		w = lfn[di - 1];
		if (w != ' ' && w != '.') break;
		di--;
	}
	if (!di) return FR_INVALID_NAME;	/* Reject null string */

	lfn[di] = 0;						/* LFN is created */

	/* Create SFN in directory form */
	mem_set(dj->fn, ' ', 11);
	for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ;	/* Strip leading spaces and dots */
	if (si) cf |= NS_LOSS | NS_LFN;
	while (di && lfn[di - 1] != '.') di--;	/* Find extension (di<=si: no extension) */

	b = i = 0; ni = 8;
	for (;;) {
		w = lfn[si++];					/* Get an LFN char */
		if (!w) break;					/* Break on enf of the LFN */
		if (w == ' ' || (w == '.' && si != di)) {	/* Remove spaces and dots */
			cf |= NS_LOSS | NS_LFN; continue;
		}

		if (i >= ni || si == di) {		/* Extension or end of SFN */
			if (ni == 11) {				/* Long extension */
				cf |= NS_LOSS | NS_LFN; break;
			}
			if (si != di) cf |= NS_LOSS | NS_LFN;	/* Out of 8.3 format */
			if (si > di) break;			/* No extension */
			si = di; i = 8; ni = 11;	/* Enter extension section */
			b <<= 2; continue;
		}

		if (w >= 0x80) {				/* Non ASCII char */
#ifdef _EXCVT
			w = ff_convert(w, 0);		/* Unicode -> OEM code */
			if (w) w = cvt[w - 0x80];	/* Convert extended char to upper (SBCS) */
#else
			w = ff_convert(ff_wtoupper(w), 0);	/* Upper converted Unicode -> OEM code */
#endif
			cf |= NS_LFN;				/* Force create LFN entry */
		}

		if (_DF1S && w >= 0x100) {		/* Double byte char */
			if (i >= ni - 1) {
				cf |= NS_LOSS | NS_LFN; i = ni; continue;
			}
			dj->fn[i++] = (BYTE)(w >> 8);
		} else {						/* Single byte char */
			if (!w || chk_chr("+,;[=]", w)) {		/* Replace illegal chars for SFN */
				w = '_'; cf |= NS_LOSS | NS_LFN;	/* Lossy conversion */
			} else {
				if (IsUpper(w)) {		/* ASCII large capital */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品久久久久影院薰衣草| 综合激情成人伊人| 国产精品日日摸夜夜摸av| 国产精品私人影院| 亚洲女同女同女同女同女同69| 国产99久久久精品| 亚洲韩国一区二区三区| 五月天丁香久久| 国产中文字幕一区| 91影院在线观看| 欧美在线免费观看亚洲| 精品国产露脸精彩对白 | 日本vs亚洲vs韩国一区三区| 制服.丝袜.亚洲.另类.中文| 国产一区二区在线电影| 国产精品丝袜久久久久久app| 97精品国产97久久久久久久久久久久 | 在线不卡一区二区| 久久99精品网久久| 国产精品高潮久久久久无| 欧美综合天天夜夜久久| 日韩**一区毛片| 久久精子c满五个校花| 99视频有精品| 美脚の诱脚舐め脚责91| 国产精品久久久99| 欧美日韩在线直播| 国产一区二三区| 亚洲一区二区三区四区在线免费观看| 日韩一级完整毛片| 99久久免费精品高清特色大片| 亚洲综合免费观看高清在线观看| 欧美mv和日韩mv的网站| 色婷婷av一区| 国产精品影视网| 亚洲二区视频在线| 国产午夜久久久久| 欧美日韩成人在线一区| 成人看片黄a免费看在线| 亚洲中国最大av网站| 国产欧美日本一区视频| 欧美群妇大交群的观看方式| 成人精品视频一区二区三区 | 亚洲免费伊人电影| 欧美精品一区二区精品网| 日韩精品资源二区在线| 99久久国产综合精品色伊| 精品一区二区三区久久久| 亚洲电影一区二区| 自拍偷拍亚洲综合| 国产喷白浆一区二区三区| 制服丝袜av成人在线看| 色狠狠综合天天综合综合| 国产成人精品免费视频网站| 日韩激情视频在线观看| 亚洲综合久久av| 成人免费在线视频| 国产亚洲精品久| 精品国产麻豆免费人成网站| 69堂成人精品免费视频| 欧美三级在线播放| 91福利国产精品| 91女人视频在线观看| 成人动漫一区二区在线| 国产精品99久久久久久宅男| 日韩高清一区二区| 亚洲444eee在线观看| 亚洲一区二区三区小说| 亚洲综合视频在线| 一区二区在线观看不卡| 最好看的中文字幕久久| 亚洲国产精品成人综合| 国产蜜臀av在线一区二区三区| 久久日韩粉嫩一区二区三区 | 国产成人aaa| 国产传媒欧美日韩成人| 国产精品自产自拍| 精品制服美女丁香| 国内成人免费视频| 精品无人区卡一卡二卡三乱码免费卡 | 国产宾馆实践打屁股91| 福利一区二区在线| 欧美日韩国产首页| 91精品国产91综合久久蜜臀| 欧美高清你懂得| 91精品国产色综合久久| 欧美一区二区三区四区久久 | 久久久精品国产免大香伊| 国产午夜精品一区二区| 中文字幕亚洲精品在线观看| 亚洲婷婷综合久久一本伊一区| 自拍偷拍欧美精品| 亚洲国产日韩在线一区模特| 日韩精品视频网站| 久草中文综合在线| 大白屁股一区二区视频| 一本色道久久综合精品竹菊| 欧美性xxxxxxxx| 欧美一级高清大全免费观看| 久久久久久久网| 亚洲三级电影网站| 日本视频免费一区| 国产精品888| 91久久精品国产91性色tv| 777色狠狠一区二区三区| 精品国产精品网麻豆系列| 国产精品第一页第二页第三页| 亚洲精品中文字幕乱码三区 | 亚洲欧美一区二区三区久本道91 | 中文字幕在线不卡国产视频| 亚洲国产美女搞黄色| 激情综合网天天干| 91色在线porny| 日韩一区二区免费在线观看| 久久久久99精品一区| 亚洲影院免费观看| 久久99精品一区二区三区三区| av在线不卡网| 日韩欧美卡一卡二| 最新国产成人在线观看| 久久精品久久综合| 99国内精品久久| 日韩欧美国产成人一区二区| 亚洲免费大片在线观看| 久久精品理论片| 日本电影欧美片| 久久久精品免费网站| 亚洲成a人v欧美综合天堂| 国产成人精品网址| 欧美一区二区三区四区视频| 亚洲色欲色欲www在线观看| 麻豆精品一二三| 欧美三级资源在线| 亚洲私人影院在线观看| 国产在线乱码一区二区三区| 欧美优质美女网站| 中文字幕欧美激情一区| 久久精品理论片| 精品视频在线免费| 综合中文字幕亚洲| 国产盗摄女厕一区二区三区| 欧美一区二区精品| 亚洲一区二三区| 91免费精品国自产拍在线不卡| xfplay精品久久| 看电视剧不卡顿的网站| 777午夜精品免费视频| 亚洲欧美另类图片小说| 成人综合在线观看| 久久久不卡网国产精品二区| 美日韩一区二区三区| 欧美色网站导航| 亚洲男人天堂一区| 波多野结衣中文字幕一区二区三区 | 亚洲一区自拍偷拍| 91免费视频网| 亚洲欧洲国产日韩| 不卡视频一二三| 中文字幕在线免费不卡| 成人免费视频国产在线观看| 国产欧美一区二区三区网站| 国产一区在线不卡| 日韩理论片在线| 成人精品一区二区三区四区| 国产欧美一区二区在线观看| 国产精品一区二区三区网站| 精品国产免费久久 | 成人爽a毛片一区二区免费| 国产视频视频一区| 国产成人鲁色资源国产91色综| 久久亚洲捆绑美女| 黑人巨大精品欧美黑白配亚洲| 久久久久国产免费免费| 国产91丝袜在线播放0| 久久久国产精品麻豆| 丁香六月综合激情| 国产精品理伦片| 一本到不卡精品视频在线观看| 亚洲色图欧美激情| 欧美亚洲一区二区在线| 日韩黄色免费电影| 日韩欧美一二三四区| 国产精品99久久久久久久女警| 中文av字幕一区| 91亚洲精品一区二区乱码| 亚洲综合另类小说| 日韩午夜小视频| 国产成人av一区| 亚洲男人天堂av网| 555www色欧美视频| 国产一区二区在线影院| 国产精品久久久久久久久免费樱桃| www.av精品| 午夜国产精品一区| 精品少妇一区二区三区视频免付费 | www.欧美日韩国产在线| 亚洲第一激情av| 精品国产免费久久| av亚洲产国偷v产偷v自拍| 日韩和的一区二区|