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

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

?? fcbfns.c

?? 分享:Dos操作系統的源程序
?? C
?? 第 1 頁 / 共 3 頁
字號:

/****************************************************************/
/*                                                              */
/*                          fcbfns.c                            */
/*                                                              */
/*           Old CP/M Style Function Handlers for Kernel        */
/*                                                              */
/*                      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/fcbfns.c_v  $ */
#ifdef VERSION_STRINGS
static BYTE *RcsId = "$Header:   C:/dos-c/src/fs/fcbfns.c_v   1.6   04 Jan 1998 23:14:38   patv  $";
#endif

/* $Log:   C:/dos-c/src/fs/fcbfns.c_v  $
 * 
 *    Rev 1.6   04 Jan 1998 23:14:38   patv
 * Changed Log for strip utility
 * 
 *    Rev 1.5   03 Jan 1998  8:36:02   patv
 * Converted data area to SDA format
 * 
 *    Rev 1.4   16 Jan 1997 12:46:38   patv
 * pre-Release 0.92 feature additions
 * 
 *    Rev 1.3   29 May 1996 21:15:14   patv
 * bug fixes for v0.91a
 * 
 *    Rev 1.2   01 Sep 1995 17:48:44   patv
 * First GPL release.
 * 
 *    Rev 1.1   30 Jul 1995 20:50:26   patv
 * Eliminated version strings in ipl
 * 
 *    Rev 1.0   02 Jul 1995  8:06:06   patv
 * Initial revision.
 */
/* $EndLog$ */

#define FCB_SUCCESS     0
#define FCB_ERR_NODATA  1
#define FCB_ERR_EOF     3
#define FCB_ERR_WRITE   1
#define D_ALL   D_NORMAL | D_RDONLY | D_HIDDEN | D_SYSTEM | D_DIR | D_ARCHIVE

#ifdef PROTO
fcb FAR *ExtFcbToFcb(xfcb FAR *lpExtFcb);
fcb FAR *CommonFcbInit(xfcb FAR *lpExtFcb, BYTE *pszBuffer, COUNT *pCurDrive);
void FcbNameInit(fcb FAR *lpFcb, BYTE *pszBuffer, COUNT *pCurDrive);
sft FAR *FcbGetSft(COUNT SftIndex);
VOID FcbNextRecord(fcb FAR *lpFcb);
sft FAR *FcbGetFreeSft(WORD FAR *sft_idx);
BOOL FcbFnameMatch(BYTE FAR *s, BYTE FAR *d, COUNT n, COUNT mode);
BOOL FcbCharMatch(COUNT s, COUNT d, COUNT mode);
BOOL FcbCalcRec(xfcb FAR *lpXfcb);
VOID MoveDirInfo(dmatch FAR *lpDmatch, struct dirent FAR *lpDir);
#else
fcb FAR *ExtFcbToFcb();
fcb FAR *CommonFcbInit();
void FcbNameInit();
sft FAR *FcbGetSft();
VOID FcbNextRecord();
sft FAR *FcbGetFreeSft();
BOOL FcbFnameMatch();
BOOL FcbCharMatch();
BOOL FcbCalcRec();
VOID MoveDirInfo();
#endif
	
static dmatch Dmatch;

VOID DosOutputString(BYTE FAR *s)
{
	while(*s != '$')
		DosCharOutput(*s++);
}

static BYTE *con_name = "CON";

int DosCharInputEcho(VOID)
{
	BYTE cb;

	CharReqHdr.r_length = sizeof(request);
	CharReqHdr.r_command = C_INPUT;
	CharReqHdr.r_count = 1;
	CharReqHdr.r_trans = (VOID FAR *)&cb;
	CharReqHdr.r_status = 0;
	execrh((request FAR *)&CharReqHdr, syscon);
	if(CharReqHdr.r_status & S_ERROR)
		return char_error(&CharReqHdr, con_name);
	DosCharOutput(cb);
	return cb;
}


int DosCharInput(VOID)
{
	BYTE cb;

	CharReqHdr.r_length = sizeof(request);
	CharReqHdr.r_command = C_INPUT;
	CharReqHdr.r_count = 1;
	CharReqHdr.r_trans = (VOID FAR *)&cb;
	CharReqHdr.r_status = 0;
	execrh((request FAR *)&CharReqHdr, syscon);
	if(CharReqHdr.r_status & S_ERROR)
		return char_error(&CharReqHdr, con_name);
	return cb;
}


VOID DosDirectConsoleIO(iregs FAR *r)
{
	BYTE buf;

	if(r -> DL == 0xff)
	{
		r -> FLAGS &= ~FLG_ZERO;

		CharReqHdr.r_length = sizeof(request);
		CharReqHdr.r_command = C_ISTAT;
		CharReqHdr.r_status = 0;
		execrh((request FAR *)&CharReqHdr, syscon);
		if(CharReqHdr.r_status & S_ERROR)
		{
			char_error(&CharReqHdr, con_name);
			return;
		}

		if(CharReqHdr.r_status & S_BUSY)
		{
			CharReqHdr.r_length = sizeof(request);
			CharReqHdr.r_command = C_INPUT;
			CharReqHdr.r_count = 1;
			CharReqHdr.r_trans = (VOID FAR *)&buf;
			CharReqHdr.r_status = 0;
			execrh((request FAR *)&CharReqHdr, syscon);
			if(CharReqHdr.r_status & S_ERROR)
			{
				char_error(&CharReqHdr, con_name);
				return;
			}

			r -> AL = buf;
			r -> FLAGS |= FLG_ZERO;
		}

	}
	else
	{
		CharReqHdr.r_length = sizeof(request);
		CharReqHdr.r_command = C_OUTPUT;
		CharReqHdr.r_count = 1;
		CharReqHdr.r_trans = (VOID FAR *)(&buf);
		CharReqHdr.r_status = 0;
		execrh((request FAR *)&CharReqHdr, syscon);
		if(CharReqHdr.r_status & S_ERROR)
			char_error(&CharReqHdr, con_name);
	}
}

/* Console output with printer echo                                     */
VOID DosCharOutput(COUNT c)
{
	BYTE buf = c;

	/* Test for break first                                         */
	if(con_break())
		return;

	/* Now do an output directly to the console                     */
	CharReqHdr.r_length = sizeof(request);
	CharReqHdr.r_command = C_OUTPUT;
	CharReqHdr.r_count = 1;
	CharReqHdr.r_trans = (VOID FAR *)(&buf);
	CharReqHdr.r_status = 0;
	execrh((request FAR *)&CharReqHdr, syscon);
	if(CharReqHdr.r_status & S_ERROR)
		char_error(&CharReqHdr, con_name);
	++scr_pos;

	/* printer echo stuff                                   */
}


VOID DosDisplayOutput(COUNT c)
{
	/* Non-portable construct                                       */
	if(c < ' ' || c == 0x7f)
	{
		switch(c)
		{
		case '\r':
			scr_pos = 0;
			break;

		case 0x7f:
			++scr_pos;
			break;

		case '\b':
			if(scr_pos > 0)
				--scr_pos;
			break;

		case '\t':
			do
				DosCharOutput(' ');
			while(scr_pos & 7);
			return;

		default:
			break;
		}
		DosCharOutput(c);
	}
	else
	{
		DosCharOutput(c);
	}
}


VOID 
FatGetDrvData (COUNT drive, COUNT FAR *spc, COUNT FAR *bps, COUNT FAR *nc, BYTE FAR **mdp)
{
	struct dpb *dpbp;

	/* first check for valid drive                                  */
	if(drive < 0 || drive > NDEVS)
	{
		*spc = -1;
		return;
	}

	/* next - "log" in the drive                                    */
	drive = (drive == 0 ? default_drive : drive - 1);
	dpbp = &blk_devices[drive];
	++(dpbp -> dpb_count);
	dpbp -> dpb_flags = -1;
	if((media_check(dpbp) < 0) || (dpbp -> dpb_count <= 0))
	{
		*spc = -1;
		return;
	}

	/* get the data vailable from dpb                       */
	*nc = dpbp -> dpb_size;
	*spc = dpbp -> dpb_clsmask;
	*bps = dpbp -> dpb_secsize;

	/* Point to the media desctriptor fotr this drive               */
	*mdp = &(dpbp -> dpb_mdb);
	--(dpbp -> dpb_count);
}

#define PARSE_SEP_STOP          0x01
#define PARSE_DFLT_DRIVE        0x02
#define PARSE_BLNK_FNAME        0x04
#define PARSE_BLNK_FEXT         0x08

#define PARSE_RET_NOWILD        0
#define PARSE_RET_WILD          1
#define PARSE_RET_BADDRIVE      0xff

#ifndef IPL
WORD FcbParseFname(wTestMode, lpFileName, lpFcb)
REG WORD wTestMode;
BYTE FAR **lpFileName;
fcb FAR *lpFcb;
{
	COUNT   nIndex;
	WORD    wRetCode = PARSE_RET_NOWILD;

	/* pjv -- ExtFcbToFcb?                                          */
	/* Start out with some simple stuff first.  Check if we are     */
	/* going to use a default drive specificaton.                   */
	if(!(wTestMode & PARSE_DFLT_DRIVE))
		lpFcb -> fcb_drive = FDFLT_DRIVE;
	if(!(wTestMode & PARSE_BLNK_FNAME))
	{
		for(nIndex = 0; nIndex < FNAME_SIZE; ++nIndex)
			lpFcb -> fcb_fname[nIndex] = ' ';
	}
	if(!(wTestMode & PARSE_BLNK_FEXT))
	{
		for(nIndex = 0; nIndex < FEXT_SIZE; ++nIndex)
			lpFcb -> fcb_fext[nIndex] = ' ';
	}                              

	/* Undocumented behavior, set record number & record size to 0  */
	lpFcb -> fcb_cublock = lpFcb -> fcb_recsiz = 0;

	if(!(wTestMode & PARSE_SEP_STOP))
	{
		*lpFileName = ParseSkipWh(*lpFileName);
		if(TestCmnSeps(*lpFileName))
			++*lpFileName;
	}

	/* Undocumented "feature," we skip white space anyway           */
	*lpFileName = ParseSkipWh(*lpFileName);

	/* Now check for drive specification                            */
	if(*(*lpFileName + 1) == ':')
	{
		REG BYTE Drive = upChar(**lpFileName);

		/* non-portable construct to be changed                 */
		if(Drive < 'A' || Drive > 'Z')
			return PARSE_RET_BADDRIVE;
		Drive -= ('A' - 1);
		if(Drive > nblkdev)
			return PARSE_RET_BADDRIVE;
		else
			lpFcb -> fcb_drive = Drive;
		*lpFileName += 2;
	}

	/* Now to format the file name into the string                  */
	*lpFileName = GetNameField(*lpFileName, (BYTE FAR *)lpFcb -> fcb_fname, FNAME_SIZE, (BOOL *)&wRetCode);

	/* Do we have an extension? If do, format it else return        */
	if(**lpFileName == '.')
		*lpFileName = GetNameField(++*lpFileName, (BYTE FAR *)lpFcb -> fcb_fext, FEXT_SIZE, (BOOL *)&wRetCode);

	return wRetCode ? PARSE_RET_WILD : PARSE_RET_NOWILD;
}


BYTE FAR *
ParseSkipWh (BYTE FAR *lpFileName)
{
	while(*lpFileName == ' ' || *lpFileName == '\t')
		++lpFileName;
	return lpFileName;
}


BOOL 
TestCmnSeps (BYTE FAR *lpFileName)
{
	BYTE *pszTest, *pszCmnSeps = ":<|>+=,";

	for(pszTest = pszCmnSeps; *pszTest != '\0'; ++pszTest)
		if(*lpFileName == *pszTest)
			return TRUE;
	return FALSE;
}

BOOL 
TestFieldSeps (BYTE FAR *lpFileName)
{
	BYTE *pszTest, *pszCmnSeps = "/\"[]<>|.";

	/* Another non-portable construct                               */
	if(*lpFileName <= ' ')
		return TRUE;

	for(pszTest = pszCmnSeps; *pszTest != '\0'; ++pszTest)
		if(*lpFileName == *pszTest)
			return TRUE;
	return FALSE;
}

BYTE FAR *
GetNameField (BYTE FAR *lpFileName, BYTE FAR *lpDestField, COUNT nFieldSize, BOOL *pbWildCard)
{
	COUNT nIndex = 0;
	BYTE cFill = ' ';

	*pbWildCard = FALSE;
	while(*lpFileName != '\0' && !TestFieldSeps(lpFileName) && nIndex< nFieldSize)
	{
		if(*lpFileName == ' ')
			break;
		if(*lpFileName == '*')
		{
			*pbWildCard = TRUE;
			cFill = '?';
			++lpFileName;
			break;
		}
		if(*lpFileName == '?')
			*pbWildCard = TRUE;
		*lpDestField++ = upChar(*lpFileName++);
		++nIndex;
	}

	/* Blank out remainder of field on exit                         */
	for( ; nIndex < nFieldSize; ++nIndex)
		*lpDestField++ = cFill;
	return lpFileName;
}

static sft FAR *FcbGetSft(SftIndex)
COUNT SftIndex;
{
	/* Get the SFT block that contains the SFT      */
	for(lpCurSft = sfthead; lpCurSft != (sfttbl FAR *)-1;
	 lpCurSft = lpCurSft -> sftt_next)
	{
		if(SftIndex < lpCurSft -> sftt_count)
			break;
		else
			SftIndex -= lpCurSft -> sftt_count;
	}

	/* If not found, return an error                */
	if(lpCurSft == (sfttbl FAR *)-1)
		return (sft FAR *)-1;

	/* finally, point to the right entry            */
	return (sft FAR *)&(lpCurSft -> sftt_table[SftIndex]);
}


static VOID FcbNextRecord(lpFcb)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美肥大bbwbbw高潮| 91精品国产一区二区三区蜜臀| 99热在这里有精品免费| 在线视频你懂得一区| 日韩欧美一区二区免费| 国产精品乱码一区二三区小蝌蚪| 悠悠色在线精品| 奇米影视一区二区三区小说| 福利电影一区二区| 欧美乱熟臀69xxxxxx| 国产日韩一级二级三级| 亚洲国产成人私人影院tom| 偷拍与自拍一区| 国产成人精品亚洲日本在线桃色 | 亚洲3atv精品一区二区三区| 国产一区二区三区不卡在线观看| 欧美在线观看你懂的| 久久精品人人做| 亚洲va国产va欧美va观看| 国内成人精品2018免费看| 欧美色国产精品| 亚洲欧洲在线观看av| 免费观看成人av| 波多野结衣的一区二区三区| 日韩一区二区在线看片| 亚洲自拍偷拍九九九| 国产精品亚洲一区二区三区在线| 欧美日韩日本视频| 久久久久久久久久久久电影 | 亚洲精品国产一区二区三区四区在线 | 91精品国产91综合久久蜜臀| 亚洲欧美日韩国产中文在线| 丰满亚洲少妇av| 精品日韩一区二区| 日韩av不卡在线观看| 欧美性猛交xxxxxx富婆| 自拍偷自拍亚洲精品播放| 成人午夜精品在线| 国产日韩精品一区| 国产一区在线不卡| 日韩欧美区一区二| 久久国产精品99久久人人澡| 欧美精品久久久久久久多人混战 | 在线电影国产精品| 一区二区三区在线看| jlzzjlzz欧美大全| 国产精品理伦片| 成人高清免费在线播放| 欧美肥妇free| 美女爽到高潮91| 日韩色视频在线观看| 久久狠狠亚洲综合| 欧美mv日韩mv亚洲| 经典三级视频一区| 久久久久久99精品| 高清国产午夜精品久久久久久| 国产视频一区二区在线| 国产成人在线看| 国产精品每日更新| 99久久精品国产一区| 亚洲精品国产无天堂网2021 | 国产乱子轮精品视频| 26uuu亚洲婷婷狠狠天堂| 美女视频一区二区| 91精品国产综合久久精品图片| 五月婷婷色综合| 精品三级在线观看| 不卡视频在线看| 久久久久久久久久久久久久久99| 国产成人小视频| 中文字幕一区二区三区精华液 | 亚洲大片免费看| 日韩一区二区麻豆国产| 国产91对白在线观看九色| 国产精品美女久久久久久2018 | 亚洲精品中文字幕在线观看| 在线观看亚洲a| 亚洲精品免费视频| 日韩午夜精品电影| 成人动漫视频在线| 一区二区欧美视频| 精品国产一区二区三区久久影院 | 国产精品国产馆在线真实露脸| 一本到三区不卡视频| 日本美女一区二区三区| 亚洲视频图片小说| 国产清纯白嫩初高生在线观看91 | 97成人超碰视| 韩国精品主播一区二区在线观看 | 亚洲第一成年网| 17c精品麻豆一区二区免费| 欧美成人福利视频| 欧美日韩国产区一| 色呦呦日韩精品| 国产美女视频91| 蜜臂av日日欢夜夜爽一区| 香蕉成人伊视频在线观看| 亚洲色欲色欲www| 欧美激情综合在线| 精品免费视频一区二区| 在线电影一区二区三区| 欧美亚洲高清一区| 91福利在线播放| 91福利资源站| 欧美视频一区二区三区| 色综合中文字幕国产 | 久久精品国产精品亚洲红杏| 亚洲高清不卡在线观看| 亚洲图片自拍偷拍| 亚洲成av人片一区二区梦乃| 亚洲va中文字幕| 亚洲大尺度视频在线观看| 亚洲福利一区二区| 天天免费综合色| 日韩经典一区二区| 久久精品国产第一区二区三区| 美日韩一区二区| 国产在线播放一区| 国产91清纯白嫩初高中在线观看| 丰满白嫩尤物一区二区| 成人avav影音| 色老头久久综合| 欧美日韩国产一级| 日韩丝袜美女视频| 久久久激情视频| 国产精品国产馆在线真实露脸| 亚洲欧美日韩国产另类专区| 亚洲一区二区三区精品在线| 日韩精品一级二级 | 蜜臀精品一区二区三区在线观看| 奇米在线7777在线精品| 国产一区二区三区四区在线观看| 国产乱码一区二区三区| 99久久久久免费精品国产| 欧美网站一区二区| 精品久久久久久亚洲综合网 | 99久久久免费精品国产一区二区| 亚洲综合视频在线观看| 亚洲免费色视频| 丝袜美腿亚洲一区二区图片| 久久黄色级2电影| 成人av资源站| 91精品国产综合久久国产大片| 欧美成人一区二区三区片免费| 国产人伦精品一区二区| 伊人性伊人情综合网| 亚洲va韩国va欧美va精品| 精品一区二区免费看| 成人一级片在线观看| 欧美日韩一区在线| 久久精品免费在线观看| 亚洲免费伊人电影| 久久国产精品免费| 91碰在线视频| 久久久久久久一区| 午夜影院久久久| 成人免费毛片app| 欧美日韩久久一区二区| 国产精品久久久久婷婷| 日本欧美久久久久免费播放网| 91在线码无精品| 久久综合久久久久88| 亚洲国产精品一区二区久久恐怖片| 看国产成人h片视频| 在线观看日韩av先锋影音电影院| 久久嫩草精品久久久精品| 亚洲成年人网站在线观看| eeuss影院一区二区三区| 日韩一区二区在线观看| 亚洲免费在线观看视频| 成人免费看片app下载| 欧美一二区视频| 水野朝阳av一区二区三区| 色综合欧美在线| 国产精品久久久久久久蜜臀| 精品一区二区三区影院在线午夜 | 亚洲午夜国产一区99re久久| 国产成人高清视频| 日韩欧美亚洲国产另类| 午夜精品福利一区二区三区蜜桃| 成a人片亚洲日本久久| 国产日韩成人精品| 麻豆91精品视频| 日韩三级视频在线看| 亚洲成人动漫在线免费观看| 99久久99久久久精品齐齐| 久久九九久精品国产免费直播| 美脚の诱脚舐め脚责91| 91精品国模一区二区三区| 亚洲成人精品一区二区| 欧美视频在线一区二区三区| 亚洲美女少妇撒尿| 99国产一区二区三精品乱码| 中文字幕一区二区在线播放| 成人一区在线观看| 国产精品福利在线播放| 99精品欧美一区二区三区小说| 中文字幕制服丝袜一区二区三区| 丁香天五香天堂综合| 欧美国产精品劲爆|