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

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

?? fatdir.c

?? Free Dos 源代碼 操作系統 可以參照學習操作系統
?? C
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************/
/*                                                              */
/*                          fatdir.c                            */
/*                            DOS-C                             */
/*                                                              */
/*                 FAT File System dir Functions                */
/*                                                              */
/*                      Copyright (c) 1995                      */
/*                      Pasquale J. Villani                     */
/*                      All Rights Reserved                     */
/*                                                              */
/* This file is part of DOS-C.                                  */
/*                                                              */
/* DOS-C is free software; you can redistribute it and/or       */
/* modify it under the terms of the GNU General Public License  */
/* as published by the Free Software Foundation; either version */
/* 2, or (at your option) any later version.                    */
/*                                                              */
/* DOS-C is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of   */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
/* the GNU General Public License for more details.             */
/*                                                              */
/* You should have received a copy of the GNU General Public    */
/* License along with DOS-C; see the file COPYING.  If not,     */
/* write to the Free Software Foundation, 675 Mass Ave,         */
/* Cambridge, MA 02139, USA.                                    */
/****************************************************************/

#include "../../hdr/portab.h"
#include "globals.h"

/* $Logfile:   C:/dos-c/src/fs/fatdir.c_v  $ */
#ifdef VERSION_STRINGS
static BYTE *fatdirRcsId = "$Header:   C:/dos-c/src/fs/fatdir.c_v   1.9   22 Jan 1998  4:09:00   patv  $";
#endif

/* $Log:   C:/dos-c/src/fs/fatdir.c_v  $
 * 
 *    Rev 1.9   22 Jan 1998  4:09:00   patv
 * Fixed pointer problems affecting SDA
 * 
 *    Rev 1.8   04 Jan 1998 23:14:36   patv
 * Changed Log for strip utility
 * 
 *    Rev 1.7   03 Jan 1998  8:36:02   patv
 * Converted data area to SDA format
 * 
 *    Rev 1.6   16 Jan 1997 12:46:30   patv
 * pre-Release 0.92 feature additions
 * 
 *    Rev 1.5   29 May 1996 21:15:18   patv
 * bug fixes for v0.91a
 * 
 *    Rev 1.4   19 Feb 1996  3:20:12   patv
 * Added NLS, int2f and config.sys processing
 * 
 *    Rev 1.2   01 Sep 1995 17:48:38   patv
 * First GPL release.
 * 
 *    Rev 1.1   30 Jul 1995 20:50:24   patv
 * Eliminated version strings in ipl
 * 
 *    Rev 1.0   02 Jul 1995  8:04:34   patv
 * Initial revision.
 */
/* $EndLog$ */

VOID pop_dmp(dmatch FAR *, struct f_node FAR *);

struct f_node FAR *
dir_open (BYTE FAR *dirname)
{
	struct f_node FAR *fnp;
	COUNT drive;
	BYTE *p;
	WORD i;
	BYTE *s, *pszPath = &TempCDS.cdsCurrentPath[2];

	/* Allocate an fnode if possible - error return (0) if not.     */
	if((fnp = get_f_node()) == (struct f_node FAR *)0)
	{
		return (struct f_node FAR *)NULL;
	}
	
	/* Force the fnode into read-write mode                         */
	fnp -> f_mode = RDWR;

	/* and initialize temporary CDS					*/
	TempCDS.cdsFlags = 0;

	/* determine what drive we are using...                         */
	dirname = adjust_far(dirname);
	ParseDosName(dirname, &drive, (BYTE *)0, (BYTE *)0, (BYTE *)0);

	/* If the drive was specified, drive is non-negative and	*/
	/* corresponds to the one passed in, i.e., 0 = A, 1 = B, etc.	*/
	/* We use that and skip the "D:" part of the string.		*/
	/* Otherwise, just use the default drive			*/ 
	if(drive >= 0)
	{
		dirname += 2;		/* Assume FAT style drive	*/
		TempCDS.cdsDpb = &blk_devices[drive];
	}
	else
	{
		TempCDS.cdsDpb = &blk_devices[drive = default_drive];
	}
	fnp -> f_dpb = (struct dpb *)TempCDS.cdsDpb;
	TempCDS.cdsCurrentPath[0] = 'A' + drive;
	TempCDS.cdsCurrentPath[1] = ':';
	TempCDS.cdsJoinOffset = 2;
	
	if (drive >= nblkdev)
	{
		release_f_node(fnp);
		return NULL;
	}

	/* Generate full path name                                      */
	ParseDosPath(dirname,
	 (COUNT *)0, pszPath, (BYTE *)TempCDS.cdsDpb -> dpb_path);
	
	/* Perform all directory common handling after all special	*/
	/* handling has been performed.					*/
	++TempCDS.cdsDpb -> dpb_count;
	
	if(media_check((struct dpb *)TempCDS.cdsDpb) < 0)
	{
		--TempCDS.cdsDpb -> dpb_count;
		release_f_node(fnp);
		return (struct f_node FAR *)0;
	}
	fnp -> f_diroff = 0l;
	fnp -> f_flags.f_dmod = FALSE;  /* a brand new fnode		*/
	fnp -> f_flags.f_dnew = TRUE;
	fnp -> f_dsize = DIRENT_SIZE * TempCDS.cdsDpb -> dpb_dirents;
	

	/* Walk the directory tree to find the starting cluster		*/
	/*								*/
	/* Set the root flags since we always start from the root	*/

	fnp -> f_flags.f_droot = TRUE;
	for(p = pszPath; *p != '\0'; )
	{
		/* skip all path seperators				*/
		while(*p == '\\')
			++p;
		/* don't continue if we're at the end			*/
		if(*p == '\0')
			break;

		/* Convert the name into an absolute name for		*/
		/* comparison...					*/
		/* first the file name with trailing spaces...		*/
		for(i = 0; i < FNAME_SIZE; i++)
		{
			if(*p != '\0' && *p != '.' && *p != '/' && *p != '\\')
				TempBuffer[i] = *p++;
			else
				break;
		}

		for( ; i < FNAME_SIZE; i++)
			TempBuffer[i] = ' ';

		/* and the extension (don't forget to   */
		/* add trailing spaces)...              */
		if(*p == '.')
			++p;
		for(i = 0; i < FEXT_SIZE; i++)
		{
			if(*p != '\0' && *p != '.' && *p != '/' && *p != '\\')
				TempBuffer[i+FNAME_SIZE] = *p++;
			else
				break;
		}
		for( ; i < FEXT_SIZE; i++)
			TempBuffer[i+FNAME_SIZE] = ' ';

		/* Now search through the directory to  */
		/* find the entry...                    */
		i = FALSE;

		upMem((BYTE FAR *)TempBuffer, FNAME_SIZE+FEXT_SIZE);

		while(dir_read(fnp) == DIRENT_SIZE)
		{
			if(fnp -> f_dir.dir_name[0] != '\0' && fnp -> f_dir.dir_name[0] != DELETED)
			{
				if(fcmp((BYTE FAR *)TempBuffer, (BYTE FAR *)fnp -> f_dir.dir_name, FNAME_SIZE+FEXT_SIZE))
				{
					i = TRUE;
					break;
				}
			}
		}

		if(!i || !(fnp -> f_dir.dir_attrib & D_DIR))
		{
			--TempCDS.cdsDpb -> dpb_count;
			release_f_node(fnp);
			return (struct f_node FAR *)0;
		}
		else
		{
			/* make certain we've moved off */
			/* root                         */
			fnp -> f_flags.f_droot = FALSE;
			fnp -> f_flags.f_ddir = TRUE;
			/* set up for file read/write   */
			fnp -> f_offset = 0l;
			fnp -> f_highwater = 0l;
			fnp -> f_cluster = fnp -> f_dir.dir_start;
			fnp -> f_dirstart = fnp -> f_dir.dir_start;
			/* reset the directory flags    */
			fnp -> f_diroff = 0l;
			fnp -> f_flags.f_dmod = FALSE;
			fnp -> f_flags.f_dnew = TRUE;
			fnp -> f_dsize = DIRENT_SIZE * TempCDS.cdsDpb -> dpb_dirents;
		}
	}

	return fnp;
}


COUNT 
dir_read (REG struct f_node FAR *fnp)
{
	REG i, j;
	struct buffer FAR *bp;

	/* Directories need to point to their current offset, not for   */
	/* next op. Therefore, if it is anything other than the first   */
	/* directory entry, we will update the offset on entry rather   */
	/* than wait until exit. If it was new, clear the special new   */
	/* flag.                                                        */
	if(fnp -> f_flags.f_dnew)
		fnp -> f_flags.f_dnew = FALSE;
	else
		fnp -> f_diroff += DIRENT_SIZE;

	/* Determine if we hit the end of the directory. If we have,    */
	/* bump the offset back to the end and exit. If not, fill the   */
	/* dirent portion of the fnode, clear the f_dmod bit and leave, */
	/* but only for root directories                                */
	if(!(fnp -> f_flags.f_droot)
	  && fnp -> f_diroff >= fnp -> f_dsize)
	{
		fnp -> f_diroff -= DIRENT_SIZE;
		return 0;
	}
	else
	{
		if(fnp -> f_flags.f_droot)
		{
			if((fnp -> f_diroff / fnp -> f_dpb -> dpb_secsize
			  + fnp -> f_dpb -> dpb_dirstrt)
			  >= fnp -> f_dpb -> dpb_data)
			{
				fnp -> f_flags.f_dfull = TRUE;
				return 0;
			}
			
			bp = getblock((LONG)(fnp -> f_diroff / fnp -> f_dpb -> dpb_secsize
				+ fnp -> f_dpb -> dpb_dirstrt),
				fnp -> f_dpb -> dpb_unit);
			bp -> b_flag &= ~(BFR_DATA | BFR_FAT);
			bp -> b_flag |= BFR_DIR;

		}
		else
		{
			REG UWORD secsize = fnp -> f_dpb -> dpb_secsize;

			/* Do a "seek" to the directory position        */
			fnp -> f_offset = fnp -> f_diroff;
			
			/* Search through the FAT to find the block     */
			/* that this entry is in.                       */
			if(map_cluster(fnp, XFR_READ) != SUCCESS)
			{
				fnp -> f_flags.f_dfull = TRUE;
				return 0;
			}
			
			/* If the returned cluster is FREE, return zero */
			/* bytes read.                                  */
			if(fnp -> f_cluster == FREE)
				return 0;

			/* If the returned cluster is LAST_CLUSTER or   */
			/* LONG_LAST_CLUSTER, return zero bytes read    */
			/* and set the directory as full.               */

			if(last_link(fnp))
			{
				fnp -> f_diroff -= DIRENT_SIZE;
				fnp -> f_flags.f_dfull = TRUE;
				return 0;
			}

			/* Compute the block within the cluster and the */
			/* offset within the block.                     */
			fnp -> f_sector =
			 (fnp -> f_offset / secsize)
			  & fnp -> f_dpb -> dpb_clsmask;
			fnp -> f_boff = fnp -> f_offset % secsize;

			/* Get the block we need from cache             */
			bp = getblock(
				(LONG)clus2phys(fnp -> f_cluster,
					fnp -> f_dpb -> dpb_clssize,
					fnp -> f_dpb -> dpb_data)
					 + fnp -> f_sector,
				fnp -> f_dpb -> dpb_unit);
			bp -> b_flag &= ~(BFR_DATA | BFR_FAT);
			bp -> b_flag |= BFR_DIR;
		}

		/* Now that we have the block for our entry, get the    */
		/* directory entry.                                     */
		if(bp != NULL)
			getdirent((BYTE FAR *)&bp -> b_buffer[fnp -> f_diroff % fnp -> f_dpb -> dpb_secsize],
				(struct dirent FAR *)&fnp -> f_dir);
		else
		{
			fnp -> f_flags.f_dfull = TRUE;
			return 0;
		}
				
		/* Update the fnode's directory info                    */
		fnp -> f_flags.f_dfull = FALSE;
		fnp -> f_flags.f_dmod = FALSE;

		/* and for efficiency, stop when we hit the first       */
		/* unused entry.                                        */
		if(fnp -> f_dir.dir_name[0] == '\0')
			return 0;
		else
			return DIRENT_SIZE;
	}
}


#ifndef IPL
COUNT 
dir_write (REG struct f_node FAR *fnp)
{
	struct buffer FAR *bp;

	/* Update the entry if it was modified by a write or create...  */
	if(fnp -> f_flags.f_dmod)
	{

		/* Root is a consecutive set of blocks, so handling is  */
		/* simple.                                              */
		if(fnp -> f_flags.f_droot)
		{
			bp =
			 getblock(
			  (LONG)(fnp -> f_diroff / fnp -> f_dpb -> dpb_secsize
			   + fnp -> f_dpb -> dpb_dirstrt),
			    fnp -> f_dpb -> dpb_unit);
			bp -> b_flag &= ~(BFR_DATA | BFR_FAT);
			bp -> b_flag |= BFR_DIR;
		}

		/* All other directories are just files. The only       */
		/* special handling is resetting the offset so that we  */
		/* can continually update the same directory entry.     */
		else
		{
			REG UWORD secsize = fnp -> f_dpb -> dpb_secsize;

			/* Do a "seek" to the directory position        */
			/* and convert the fnode to a directory fnode.  */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一卡二卡三卡| 日韩国产在线一| 亚洲午夜激情网页| 久久精品国产秦先生| av动漫一区二区| 日韩视频在线一区二区| 亚洲免费观看在线视频| 国产一区二区看久久| 在线91免费看| 亚洲影院在线观看| 成人av资源在线观看| 精品久久久三级丝袜| 亚洲一区二区综合| 91麻豆精品在线观看| 国产精品婷婷午夜在线观看| 日产国产高清一区二区三区| 欧美亚州韩日在线看免费版国语版| 久久欧美一区二区| 美女免费视频一区| 欧美老女人第四色| 亚洲一区二区欧美日韩| 99久久99久久精品国产片果冻| 久久日一线二线三线suv| 日本特黄久久久高潮| 欧美日韩国产精选| 亚洲r级在线视频| 色丁香久综合在线久综合在线观看| 国产亚洲1区2区3区| 国模娜娜一区二区三区| 日韩三级高清在线| 六月丁香婷婷久久| 丁香网亚洲国际| 中文字幕国产精品一区二区| 狠狠色狠狠色综合| 欧美精品一区二区在线播放| 免费观看一级特黄欧美大片| 欧美一区二区久久久| 免费观看30秒视频久久| 日韩一区二区三区免费看| 蜜桃av一区二区三区| 日韩精品在线一区| 国内精品久久久久影院薰衣草| 日韩女优av电影在线观看| 免费看日韩精品| 久久看人人爽人人| 成人理论电影网| 亚洲色欲色欲www| 91在线观看美女| 亚洲成在人线免费| 欧美r级在线观看| 国产精品一级黄| 亚洲欧美怡红院| 欧美在线看片a免费观看| 日本伊人午夜精品| 国产亚洲欧美色| 99精品偷自拍| 天天综合网 天天综合色| 精品少妇一区二区三区在线视频| 国产一区二区影院| 亚洲视频你懂的| 884aa四虎影成人精品一区| 激情综合网天天干| 亚洲欧洲三级电影| 欧美日韩一区成人| 国产在线播放一区| 一区二区三区精品在线观看| 91精选在线观看| 成人97人人超碰人人99| 亚洲h在线观看| 国产三级欧美三级日产三级99| 91蜜桃传媒精品久久久一区二区| 婷婷夜色潮精品综合在线| 国产欧美视频一区二区三区| 在线亚洲一区二区| 国内精品国产成人| 亚洲国产综合视频在线观看| 精品电影一区二区三区| 在线国产亚洲欧美| 国内精品伊人久久久久av影院| 一个色综合网站| 久久久蜜桃精品| 欧美精品久久久久久久多人混战| 国产精品99久久久久久久vr| 午夜久久久久久| 最新欧美精品一区二区三区| 欧美福利视频一区| 91麻豆精品在线观看| 久久99久久99| 亚洲高清三级视频| 国产精品免费视频观看| 精品欧美久久久| 欧美日韩国产高清一区| 一本色道久久综合狠狠躁的推荐| 极品少妇一区二区三区精品视频| 午夜欧美在线一二页| 亚洲色图制服诱惑| 国产免费久久精品| 精品日韩在线观看| 91精品国产综合久久精品图片| 一本大道久久精品懂色aⅴ| 国产乱码精品一品二品| 青青国产91久久久久久| 亚洲自拍偷拍综合| 中文字幕亚洲在| 久久午夜电影网| 日韩精品最新网址| 欧美精品99久久久**| 欧美三区在线视频| 欧美性三三影院| 在线观看区一区二| 在线观看视频一区二区| 色综合久久综合网| 一本色道久久加勒比精品| 99久久伊人精品| 处破女av一区二区| www.亚洲色图| 成人短视频下载| 99精品偷自拍| 一本一道久久a久久精品| 91色在线porny| 成人av综合一区| 91免费版在线| 欧美性生活久久| 91麻豆精品国产| 精品少妇一区二区三区在线播放| 精品毛片乱码1区2区3区| 欧美成人一区二区| 久久精品一区四区| 国产精品女上位| 一区二区三区不卡在线观看| 一区二区久久久| 日韩经典一区二区| 激情偷乱视频一区二区三区| 国产高清精品网站| 91在线观看高清| 91精品国产入口| 26uuu精品一区二区在线观看| 久久精品综合网| 亚洲欧美一区二区不卡| 亚洲综合偷拍欧美一区色| 午夜精品久久久久影视| 久久国产生活片100| 成人免费看视频| 欧美丝袜自拍制服另类| 精品欧美一区二区久久| 国产精品成人一区二区艾草| 午夜精品福利久久久| 精品制服美女丁香| 一本高清dvd不卡在线观看| 欧美日韩夫妻久久| 国产欧美视频在线观看| 亚洲成人tv网| 成人夜色视频网站在线观看| 欧美性色黄大片手机版| 久久久亚洲综合| 亚洲国产欧美一区二区三区丁香婷| 日韩专区欧美专区| 99riav一区二区三区| 51久久夜色精品国产麻豆| 国产欧美日韩在线观看| 婷婷中文字幕综合| av一区二区不卡| 日韩欧美综合在线| 亚洲日本青草视频在线怡红院 | 精品电影一区二区| 1000部国产精品成人观看| 日本中文字幕不卡| 91女厕偷拍女厕偷拍高清| 日韩视频一区在线观看| 亚洲老司机在线| 国产一区二区三区免费| 欧美日韩黄视频| 亚洲欧美中日韩| 国产成人日日夜夜| 欧美一区二区三区成人| 一区二区三区不卡视频在线观看| 国产福利一区二区三区在线视频| 欧美高清视频www夜色资源网| 国产精品久久久久毛片软件| 麻豆91免费观看| 欧美日韩成人综合在线一区二区| 国产精品乱人伦中文| 久久国产三级精品| 91精品国产91久久久久久最新毛片| 中文字幕一区二区三区不卡| 国产一区福利在线| 日韩欧美一级在线播放| 性欧美疯狂xxxxbbbb| av电影一区二区| 国产丝袜在线精品| 国内精品伊人久久久久av影院 | 懂色一区二区三区免费观看| 精品国产sm最大网站免费看| 日韩黄色免费网站| 欧美日韩成人高清| 日本不卡一二三| 欧美疯狂做受xxxx富婆| 日韩av一区二区在线影视| 欧美福利一区二区| 毛片不卡一区二区|