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

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

?? fatfs.c

?? 分享:Dos操作系統(tǒng)的源程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
	if(find_fname(fnp, szFileName, szFileExt))
	{
		dir_close(fnp);
		return DE_ACCESS;
	}
	else
	{
		BOOL is_free;

		/* Reset the directory by a close followed by   */
		/* an open                                      */
		fnp -> f_flags.f_dmod = FALSE;
		parent = fnp -> f_dirstart;
		dir_close(fnp);
		fnp = dir_open((BYTE FAR *)szDirName);

		/* Get a free f_node pointer so that we can use */
		/* it in building the new file.                 */
		/* Note that if we're in the root and we don't  */
		/* find an empty slot, we need to abort.        */
		if(!(is_free = find_free(fnp)) && (fnp -> f_flags.f_droot))
		{
			fnp -> f_flags.f_dmod = FALSE;
			dir_close(fnp);
			return DE_TOOMANY;
		}

		/* Otherwise just expand the directory          */
		else if(!is_free && !(fnp -> f_flags.f_droot))
		{
			COUNT ret;

			if(extend_dir(fnp) != SUCCESS)
				return ret;
		}

		/* put the fnode's name into the directory.             */
		fbcopy((BYTE FAR *)szFileName,
		 (BYTE FAR *)fnp -> f_dir.dir_name, FNAME_SIZE);
		fbcopy((BYTE FAR *)szFileExt,
		 (BYTE FAR *)fnp -> f_dir.dir_ext, FEXT_SIZE);

		/* Set the fnode to the desired mode                            */
		fnp -> f_mode = WRONLY;
		fnp -> f_back = LONG_LAST_CLUSTER;

		fnp -> f_dir.dir_size = 0l;
		fnp -> f_dir.dir_start = FREE;
		fnp -> f_dir.dir_attrib = D_DIR;
		fnp -> f_dir.dir_time = dos_gettime();
		fnp -> f_dir.dir_date = dos_getdate();

		fnp -> f_flags.f_dmod = TRUE;
		fnp -> f_flags.f_dnew = FALSE;
		fnp -> f_flags.f_ddir = TRUE;

		fnp -> f_highwater = 0l;
		fnp -> f_offset = 0l;
	}

	/* get an empty cluster, so that we make it into a      */
	/* directory.                                           */
	free_fat = find_fat_free(fnp);

	/* No empty clusters, disk is FULL! Translate into a    */
	/* useful error message.                                */
	if(free_fat == LONG_LAST_CLUSTER)
	{
		dir_close(fnp);
		return DE_HNDLDSKFULL;
	}

	/* Mark the cluster in the FAT as used                  */
	fnp -> f_dir.dir_start = fnp -> f_cluster = free_fat;
	link_fat(fnp -> f_dpb, (UCOUNT)free_fat, LONG_LAST_CLUSTER);

	/* Craft the new directory. Note that if we're in a new */
	/* directory just under the root, ".." pointer is 0.    */
	bp = getblock((LONG)clus2phys(free_fat,
		fnp -> f_dpb -> dpb_clssize,
		fnp -> f_dpb -> dpb_data),
		fnp -> f_dpb -> dpb_unit);
	if(bp == NULL)
	{
		dir_close(fnp);
		return DE_BLKINVLD;
	}

	/* Create the "." entry                                 */
	bcopy(".       ", (BYTE *)DirEntBuffer.dir_name, FNAME_SIZE);
	bcopy("   ", (BYTE *)DirEntBuffer.dir_ext, FEXT_SIZE);
	DirEntBuffer.dir_attrib = D_DIR;
	DirEntBuffer.dir_time = dos_gettime();
	DirEntBuffer.dir_date = dos_getdate();
	DirEntBuffer.dir_start = free_fat;
	DirEntBuffer.dir_size = 0l;

	/* And put it out                                       */
	putdirent((struct dirent FAR *)&DirEntBuffer, (BYTE FAR *)bp ->b_buffer);

	/* create the ".." entry                                */
	bcopy("..      ", (BYTE *)DirEntBuffer.dir_name, FNAME_SIZE);
	DirEntBuffer.dir_start = parent;

	/* and put it out                                       */
	putdirent((struct dirent FAR *)&DirEntBuffer, (BYTE FAR *)&bp -> b_buffer[DIRENT_SIZE]);

	/* fill the rest of the block with zeros                */
	for(p = (BYTE FAR *)&bp -> b_buffer[2 *DIRENT_SIZE];
	 p < &bp -> b_buffer[BUFFERSIZE]; )
		*p++ = NULL;

	/* Mark the block to be written out                     */
	bp -> b_flag |= BFR_DIRTY;

	/* clear out the rest of the blocks in the cluster      */
	for(idx = 1; idx < fnp -> f_dpb -> dpb_clssize; idx++)
	{
		REG COUNT i;

		bp = getblock(
			(LONG)clus2phys(fnp -> f_dir.dir_start,
			fnp -> f_dpb -> dpb_clssize,
			fnp -> f_dpb -> dpb_data) + idx,
			fnp -> f_dpb -> dpb_unit);
		if(bp == NULL)
		{
			dir_close(fnp);
			return DE_BLKINVLD;
		}
		for(i = 0, p = (BYTE FAR *)bp -> b_buffer; i < BUFFERSIZE; i++)
			*p++ = NULL;
		bp -> b_flag |= BFR_DIRTY;
	}

	/* flush the drive buffers so that all info is written  */
	flush_buffers((COUNT)(fnp -> f_dpb -> dpb_unit));

	/* Close the directory so that the entry is updated     */
	fnp -> f_flags.f_dmod = TRUE;
	dir_close(fnp);

	return SUCCESS;
}
#endif


BOOL 
last_link (struct f_node FAR *fnp)
{
	return (((UWORD)fnp -> f_cluster == (UWORD)LONG_LAST_CLUSTER)
	 || ((UWORD)fnp -> f_cluster == (UWORD)LAST_CLUSTER));
}

#ifndef IPL
static BOOL 
extend (struct f_node FAR *fnp)
{
	UWORD free_fat;

	/* get an empty cluster, so that we use it to extend the file.  */
	free_fat = find_fat_free(fnp);

	/* No empty clusters, disk is FULL! Translate into a useful     */
	/* error message.                                               */
	if(free_fat == LONG_LAST_CLUSTER)
		return FALSE;

	/* Now that we've found a free FAT entry, mark it as the last   */
	/* entry and save.                                              */
	link_fat(fnp -> f_dpb, (UCOUNT)fnp -> f_back, free_fat);
	fnp -> f_cluster = free_fat;
	link_fat(fnp -> f_dpb, (UCOUNT)free_fat, LONG_LAST_CLUSTER);

	/* Mark the directory so that the entry is updated              */
	fnp -> f_flags.f_dmod = TRUE;
	return TRUE;
}


static COUNT 
extend_dir (struct f_node FAR *fnp)
{
	REG COUNT idx;

	if(!extend(fnp))
	{
		dir_close(fnp);
		return DE_HNDLDSKFULL;
	}

	/* clear out the rest of the blocks in the cluster              */
	for(idx = 0; idx < fnp -> f_dpb -> dpb_clssize; idx++)
	{
		REG COUNT i;
		REG BYTE FAR *p;
		REG struct buffer FAR *bp;

		bp = getblock(
			(LONG)clus2phys(fnp -> f_cluster,
			fnp -> f_dpb -> dpb_clssize,
			fnp -> f_dpb -> dpb_data) + idx,
			fnp -> f_dpb -> dpb_unit);
		if(bp == NULL)
		{
			dir_close(fnp);
			return DE_BLKINVLD;
		}
		for(i = 0, p = (BYTE FAR *)bp -> b_buffer; i < BUFFERSIZE; i++)
			*p++ = NULL;
		bp -> b_flag |= BFR_DIRTY;
	}

	if(!find_free(fnp))
	{
		dir_close(fnp);
		return DE_HNDLDSKFULL;
	}

	/* flush the drive buffers so that all info is written          */
	flush_buffers((COUNT)(fnp -> f_dpb -> dpb_unit));

	return SUCCESS;

}


static BOOL 
first_fat (struct f_node FAR *fnp)
{
	UWORD free_fat;

	/* get an empty cluster, so that we make it into a file.        */
	free_fat = find_fat_free(fnp);

	/* No empty clusters, disk is FULL! Translate into a useful     */
	/* error message.                                               */
	if(free_fat == LONG_LAST_CLUSTER)
		return FALSE;

	/* Now that we've found a free FAT entry, mark it as the last   */
	/* entry and save it.                                           */
	fnp -> f_dir.dir_start = free_fat;
	link_fat(fnp -> f_dpb, (UCOUNT)free_fat, LONG_LAST_CLUSTER);

	/* Mark the directory so that the entry is updated              */
	fnp -> f_flags.f_dmod = TRUE;
	return TRUE;
}
#endif


COUNT 
map_cluster (REG struct f_node FAR *fnp, COUNT mode)
{
	ULONG idx;
	WORD clssize, secsize;

	/* Set internal index and cluster size.                 */
	idx = fnp -> f_offset;
	
	/* The variable clssize will be used later.             */
	secsize = fnp -> f_dpb -> dpb_secsize;
	clssize = secsize * fnp -> f_dpb -> dpb_clssize;

#ifndef IPL
	/* If someone did a seek, but no writes have occured, we will   */
	/* need to initialize the fnode.                                */
	if((mode == XFR_WRITE) && (fnp -> f_dir.dir_start == FREE))
	{        
		if(!first_fat(fnp))
			return DE_HNDLDSKFULL;
	}
#endif

	/* Now begin the linear search. The relative cluster is         */
	/* maintained as part of the set of physical indices. It is     */
	/* also the highest order index and is mapped directly into     */
	/* physical cluster. Our search is performed by pacing an index */
	/* up to the relative cluster position where the index falls    */
	/* within the cluster.                                          */
	/*                                                              */
	/* NOTE: make sure your compiler does not optimize for loop     */
	/* tests to the loop exit. We need to fall out immediately for  */
	/* files whose length < cluster size.                           */
	for(fnp -> f_cluster = fnp -> f_flags.f_ddir ?
				fnp -> f_dirstart :
				fnp -> f_dir.dir_start;
	  idx >= clssize;
	   idx -= clssize)
	{
		/* If this is a read and the next is a LAST_CLUSTER,    */
		/* then we are going to read past EOF, return zero read */
		if((mode == XFR_READ) && last_link(fnp))
			return DE_SEEK;
#ifndef IPL
	/* expand the list if we're going to write and have run into    */
	/* the last cluster marker.                                     */
		else if((mode == XFR_WRITE) && last_link(fnp))
		{
			
			if(!extend(fnp))
			{
				dir_close(fnp);
				return DE_HNDLDSKFULL;
			}
		}
#endif
		fnp -> f_back = fnp -> f_cluster;
		fnp -> f_cluster = next_cluster(fnp -> f_dpb,fnp -> f_cluster);
	}
	return SUCCESS;
}

UCOUNT 
rdwrblock (COUNT fd, VOID FAR *buffer, UCOUNT count, COUNT mode, COUNT *err)
{
	REG struct f_node FAR *fnp;
	REG struct buffer FAR *bp;
	UCOUNT xfr_cnt = 0, ret_cnt = 0;
	LONG idx;
	WORD secsize;
	UCOUNT to_xfer = count;

#ifdef DEBUG
	if(bDumpRdWrParms)
	{
		printf("rdwrblock: mode = %s\n",
		 mode == XFR_WRITE ? "WRITE" : "READ");
		printf(" fd   buffer     count\n --   ------     -----\n");
		printf(" %02d   %04x:%04x   %d\n",
		 fd, (COUNT)FP_SEG(buffer), (COUNT)FP_OFF(buffer), count);
	}
#endif
	/* Translate the fd into an fnode pointer, since all internal   */
	/* operations are achieved through fnodes.                      */
	fnp = xlt_fd(fd);

	/* If the fd was invalid because it was out of range or the     */
	/* requested file was not open, tell the caller and exit        */
	/* note: an invalid fd is indicated by a 0 return               */
	if(fnp == (struct f_node FAR *)0 || fnp -> f_count <= 0)
	{
		*err = DE_INVLDHNDL;
		return 0;
	}
	
	/* Test that we are really about to do a data transfer. If the  */
	/* count is zero and the mode is XFR_READ, just exit. (Any	*/
	/* read with a count of zero is a nop).                         */
	/*                                                              */
	/* A write (mode is XFR_WRITE) is a special case.  It sets the	*/
	/* file length to the current length (truncates it).            */
	/*                                                              */
	/* NOTE: doing this up front saves a lot of headaches later.    */
	if(count == 0)
	{
		if(mode == XFR_WRITE)
		{
			fnp -> f_highwater = fnp -> f_offset;
		}

		*err = SUCCESS;
		return 0;
	}

	/* Another test is to check for a seek past EOF on an XFR_READ  */
	/* operation.                                                   */
	if(mode == XFR_READ
	 && !fnp -> f_flags.f_ddir
	 && (fnp -> f_offset >= fnp -> f_dir.dir_size))
	{
		*err = SUCCESS;
		return 0;
	}

	/* test that we have a valid mode for this fnode                */
	switch(mode)
	{
	case XFR_READ:
		if(fnp -> f_mode != RDONLY && fnp -> f_mode != RDWR)
		{
			*err = DE_INVLDACC;
			return 0;
		}
		break;

#ifndef IPL
	case XFR_WRITE:
		if(fnp -> f_mode != WRONLY && fnp -> f_mode != RDWR)
		{
			*err = DE_INVLDACC;
			return 0;
		}
		break;
#endif
	default:
		*err = DE_INVLDACC;
		return 0;
	}

	/* The variable secsize will be used later.                     */
	secsize = fnp -> f_dpb -> dpb_secsize;

	/* Adjust the far pointer from user space to supervisor space   */
	buffer = adjust_far((VOID FAR *)buffer);

	/* Do the data transfer. Use block transfer methods so that we  */
	/* can utilize memory management in future DOS-C versions.	*/
	while(ret_cnt < count)
	{
		/* Position the file to the fnode's pointer position. This is   */
		/* done by updating the fnode's cluster, block (sector) and     */
		/* byte offset so that read or write becomes a simple data move */
		/* into or out of the block data buffer.                        */
		if(fnp -> f_offset == 0l)
		{
#ifndef IPL
			/* For the write case, a newly created file     */
			/* will have a start cluster of FREE. If we're  */
			/* doing a write and this is the first time     */
			/* through, allocate a new cluster to the file. */
			if((mode == XFR_WRITE)
			 && (fnp -> f_dir.dir_start == FREE))
				if(!first_fat(fnp))
				{
					dir_close(fnp);
					*err = DE_HNDLDSKFULL;
					return ret_cnt;
				}
#endif
			/* complete the common operations of            */
			/* initializing to the starting cluster and     */
			/* setting all offsets to zero.                 */
			fnp -> f_cluster = fnp -> f_dir.dir_start;
			fnp -> f_back = LONG_LAST_CLUSTER;
			fnp -> f_sector = 0;
			fnp -> f_boff = 0;
		}

		/* The more difficult scenario is the (more common)     */
		/* file offset case. Here, we need to take the fnode's  */
		/* offset pointer (f_offset) and translate it into a    */
		/* relative cluster position, cluster block (sector)    */
		/* offset (f_sector) and byte offset (f_boff). Once we  */
		/* have this information, we need to translate the      */
		/* relative cluster position into an absolute cluster   */
		/* position (f_cluster). This is unfortunate because it */
		/* requires a linear search through the file's FAT      */
		/* entries. It made sense when DOS was originally       */
		/* designed as a simple floppy disk operating system    */
		/* where the FAT was contained in core, but now         */
		/* requires a search through the FAT blocks.            */
		/*                                                      */
		/* The algorithm in this function takes advantage of    */
		/* the blockio block buffering scheme to simplify the   */
		/* task.                                                */
		else
			switch(map_cluster(fnp, mode))
			{
			case DE_SEEK:
				*err = DE_SEEK;
				dir_close(fnp);
				return ret_cnt;

			default:
				dir_close(fnp);
				*err = DE_HNDLDSKFULL;
				return ret_cnt;

			case SUCCESS:
				break;
			}
#ifndef IPL
		/* XFR_WRITE case only - if we're at the end, the next  */
		/* FAT is an EOF marker, so just extend the file length */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产91综合久久蜜臀| 亚洲国产综合视频在线观看| 亚洲精品国产第一综合99久久| 日韩成人一区二区三区在线观看| 国产91精品在线观看| 欧美一区日韩一区| 综合久久久久综合| 国产91丝袜在线播放0| 欧美一区二区三区视频免费播放| 欧美激情综合五月色丁香| 日韩激情一二三区| 在线一区二区三区做爰视频网站| 国产日韩欧美一区二区三区综合| 石原莉奈在线亚洲二区| 91麻豆自制传媒国产之光| 日本一区二区三区四区| 免费国产亚洲视频| 91精品免费观看| 亚洲妇熟xx妇色黄| 在线国产亚洲欧美| 亚洲免费观看在线视频| av毛片久久久久**hd| 精品久久久久一区二区国产| 三级久久三级久久久| 欧美午夜一区二区| 亚洲图片欧美一区| 日本精品视频一区二区三区| 亚洲欧美福利一区二区| av网站一区二区三区| 国产精品免费视频网站| 国产精品夜夜嗨| 亚洲精品在线网站| 国产福利视频一区二区三区| 26uuu亚洲综合色欧美| 九色综合狠狠综合久久| 精品国产91乱码一区二区三区| 六月婷婷色综合| 欧美成人官网二区| 激情综合网最新| 久久久国际精品| 成人性色生活片免费看爆迷你毛片| 久久精品免费在线观看| 懂色av中文一区二区三区| 中文字幕成人av| 91免费看`日韩一区二区| 亚洲黄色免费电影| 4438成人网| 免费观看一级欧美片| 精品国产伦一区二区三区观看体验| 美女精品自拍一二三四| 久久久久亚洲综合| 成人黄色综合网站| 亚洲欧美日韩久久| 欧美另类z0zxhd电影| 麻豆国产91在线播放| 久久伊人中文字幕| 91美女福利视频| 爽好久久久欧美精品| 欧美xxxxx牲另类人与| 成人av在线一区二区| 亚洲观看高清完整版在线观看| 欧美一区二区久久久| 懂色av一区二区三区免费观看| 亚洲视频一区二区在线观看| 欧美久久久一区| 国产精品亚洲一区二区三区在线| 亚洲免费av高清| 欧美va日韩va| 日本精品视频一区二区| 韩国欧美国产一区| 亚洲在线观看免费视频| 精品乱码亚洲一区二区不卡| 91美女视频网站| 国产一区二区三区综合| 一区二区三区四区亚洲| 久久综合久久综合亚洲| 在线免费不卡电影| 成人综合婷婷国产精品久久| 亚洲福利视频三区| 国产精品久久久久婷婷二区次| 欧美日韩精品一区二区在线播放| 风间由美一区二区av101 | 国产精品麻豆99久久久久久| 在线观看不卡一区| 成人精品在线视频观看| 青青草97国产精品免费观看| 亚洲啪啪综合av一区二区三区| 欧美tk丨vk视频| 4438亚洲最大| 欧美午夜精品一区二区蜜桃| 成人深夜视频在线观看| 蜜臀久久99精品久久久久久9| 亚洲手机成人高清视频| 国产日韩精品一区二区浪潮av | 天天操天天色综合| 亚洲精品伦理在线| 国产欧美精品在线观看| 精品欧美乱码久久久久久| 欧美日韩国产bt| 色爱区综合激月婷婷| av一区二区不卡| 成人听书哪个软件好| 国产高清久久久久| 国内精品久久久久影院色| 免费精品视频在线| 美女精品一区二区| 奇米影视在线99精品| 亚洲成人激情自拍| 亚洲成人中文在线| 亚洲www啪成人一区二区麻豆| 日韩毛片高清在线播放| 国产精品久久久久一区二区三区共| 久久婷婷色综合| 久久精品亚洲精品国产欧美kt∨| 欧美成人精品1314www| 精品日韩在线观看| 欧美精品一区二区三区在线播放 | 欧美日韩精品一区二区三区四区| 色综合天天性综合| 一本在线高清不卡dvd| 色噜噜狠狠成人网p站| 色狠狠一区二区三区香蕉| 91成人免费网站| 欧美日韩在线不卡| 欧美一区二视频| 精品国产第一区二区三区观看体验 | 国产精品一区久久久久| 国产精品一线二线三线精华| 国产精品中文字幕欧美| 丁香婷婷综合激情五月色| 99免费精品在线| 日本韩国欧美三级| 欧美一级欧美一级在线播放| 精品日韩欧美在线| 欧美国产禁国产网站cc| 一区二区在线观看av| 午夜欧美大尺度福利影院在线看| 日本成人在线视频网站| 国产精品资源网| 色综合久久中文综合久久97| 欧美日韩国产精品成人| 精品国产乱码久久久久久久| 国产精品美女久久久久久久网站| 中文字幕亚洲在| 免费高清不卡av| 99久久精品免费看国产 | 2021久久国产精品不只是精品| 久久久久久9999| 一区二区不卡在线播放| 捆绑调教美女网站视频一区| 成人小视频在线观看| 欧美三级视频在线播放| 国产日韩欧美不卡在线| 亚洲动漫第一页| 风间由美一区二区av101 | 国产欧美va欧美不卡在线| 亚洲麻豆国产自偷在线| 久久精品久久99精品久久| caoporn国产精品| 日韩三级免费观看| 亚洲人成亚洲人成在线观看图片| 麻豆精品一二三| 在线不卡免费av| 日本一区二区综合亚洲| 蜜臀91精品一区二区三区| 97se亚洲国产综合自在线| 日韩三级在线免费观看| 亚洲激情校园春色| 国产91丝袜在线18| 精品国免费一区二区三区| 亚洲午夜私人影院| 91亚洲精品久久久蜜桃网站 | 一区二区三区产品免费精品久久75| 久久精品免费看| 91久久精品一区二区三| 欧美国产精品中文字幕| 狠狠色丁香久久婷婷综| 欧美福利视频导航| 亚洲精品老司机| 国产+成+人+亚洲欧洲自线| 日韩亚洲欧美高清| 亚洲成人tv网| 色婷婷av一区| 中文字幕佐山爱一区二区免费| 国产激情91久久精品导航 | 成人h版在线观看| 精品久久久久香蕉网| 日本欧美一区二区| 欧美丰满少妇xxxxx高潮对白| 亚洲欧美日韩国产成人精品影院| 成人一级黄色片| 欧美国产成人精品| 粉嫩av一区二区三区| 国产欧美中文在线| 国产成人精品免费| 亚洲国产精品传媒在线观看| 国产91清纯白嫩初高中在线观看 | 欧美sm极限捆绑bd| 蜜桃91丨九色丨蝌蚪91桃色| 欧美成人一区二区|