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

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

?? dosnames.c

?? Free Dos 源代碼 操作系統 可以參照學習操作系統
?? C
字號:
/****************************************************************/
/*								*/
/*			   dosnames.c				*/
/*			     DOS-C				*/
/*								*/
/*    Generic parsing functions for file name specifications	*/
/*								*/
/*			Copyright (c) 1994			*/
/*			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"

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

/* $Log:   C:/dos-c/src/fs/dosnames.c_v  $
 * 
 *    Rev 1.8   22 Jan 1998  4:09:00   patv
 * Fixed pointer problems affecting SDA
 * 
 *    Rev 1.7   04 Jan 1998 23:14:38   patv
 * Changed Log for strip utility
 * 
 *    Rev 1.6   03 Jan 1998  8:36:04   patv
 * Converted data area to SDA format
 * 
 *    Rev 1.5   16 Jan 1997 12:46:36   patv
 * pre-Release 0.92 feature additions
 * 
 *    Rev 1.4   29 May 1996 21:15:12   patv
 * bug fixes for v0.91a
 * 
 *    Rev 1.3   19 Feb 1996  3:20:08   patv
 * Added NLS, int2f and config.sys processing
 * 
 *    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:05:56   patv
 * Initial revision.
 *
 */ 
/* $EndLog$ */

#include "globals.h"

#define PathSep(c) ((c)=='/'||(c)=='\\')
#define DriveChar(c) (((c)>='A'&&(c)<='Z')||((c)>='a'&&(c)<='z'))

static BOOL bFileChar(UCOUNT uChar);
VOID XlateLcase (BYTE *szFname, COUNT nChars);
VOID DosTrimPath (BYTE FAR *lpszPathNamep);


static BOOL bFileChar(UCOUNT uChar)
{
	BYTE *pszValChar = ".\"/\\[]:|<>+=;,", *pszPtr;

	/* Null is not a valid character				*/
	if(NULL == uChar)
		return FALSE;

	/* Loop through invalid character set				*/
	for (pszPtr = pszValChar; *pszPtr != NULL; pszPtr++)
		if(uChar == *pszPtr)
			return FALSE;

	/* Not in excluded set, it's ok.				*/
	return TRUE;
}


/* Should be converted to a portable version after v1.0 is released.	*/
VOID
XlateLcase (BYTE *szFname, COUNT nChars)
{
	while(nChars--)
	{
		if(*szFname >= 'a' && *szFname <= 'z')
			*szFname -= ('a' - 'A');
		++szFname;
	}
}


VOID
SpacePad(BYTE *szString, COUNT nChars)
{
	REG COUNT i;

	for(i = strlen(szString); i < nChars; i++)
		szString[i] = ' ';
}


COUNT
ParseDosName(BYTE FAR *lpszFileName,
	     COUNT *pnDrive,
	     BYTE *pszDir,
	     BYTE *pszFile,
	     BYTE *pszExt)
{
	COUNT nDirCnt, nFileCnt, nExtCnt;
	BYTE FAR *lpszLclDir, FAR *lpszLclFile, FAR *lpszLclExt;


	/* Initialize the users data fields				*/
	if(pszDir)
		*pszDir = '\0';
	if(pszFile)
		*pszFile = '\0';
	if(pszExt)
		*pszExt = '\0';
	lpszLclFile = lpszLclExt = lpszLclDir = 0;
	nDirCnt = nFileCnt = nExtCnt = 0;

	/* Start by cheking for a drive specifier ...			*/
	if(DriveChar(*lpszFileName) && ':' == lpszFileName[1])
	{
		/* found a drive, fetch it and bump pointer past drive	*/
		/* NB: this code assumes ASCII				*/
		if(pnDrive)
		{
			*pnDrive = *lpszFileName - 'A';
			if(*pnDrive > 26)
				*pnDrive -= ('a' - 'A');
		}
		lpszFileName += 2;
	}
	else
	{
		if(pnDrive)
		{
			*pnDrive = -1;
		}
	}
	if(!pszDir && !pszFile && !pszExt)
		return SUCCESS;

	/* Now see how long a directory component we have.  We've	*/
	/* initialized the count before and moved the passed in pointer	*/
	/* past the optional drive component.  Now, we initialize the	*/
	/* directory count variable to a one if and only if we see a	*/
	/* leading root drive specifier because we can't be certain	*/
	/* that what follows is a directory until we see at least a	*/
	/* single path seperator.  So we count to the end and work	*/
	/* backwards to the last seperator subtracting one for each	*/
	/* character until we see one (seperator).			*/
	lpszLclDir = lpszFileName;
	while(bFileChar(*lpszFileName)
	   || PathSep(*lpszFileName)
	   || '.' == *lpszFileName)
	{
		++nDirCnt;
		++lpszFileName;
	}
	if(nDirCnt > 1)
	{
		while(lpszFileName >lpszLclDir)
		{
			BYTE cChar = *--lpszFileName;

			if(PathSep(cChar))
				break;
			--nDirCnt;
		}
		/* Once we've moved the pointer back, we want to bump	*/
		/* it past the seperator.				*/
		if(PathSep(*lpszFileName))
			++lpszFileName;
	}

	/* Parse out the file name portion.				*/
	lpszLclFile = lpszFileName;
	while(bFileChar(*lpszFileName) && '.' != *lpszFileName)
	{
		++nFileCnt;
		++lpszFileName;
	}

	/* Now we have pointers set to the directory portion and the	*/
	/* file portion.  Now determine the existance of an extension.	*/
	lpszLclExt = lpszFileName;
	if('.' == *lpszFileName)
	{
		lpszLclExt = ++lpszFileName;
		while(bFileChar(*lpszFileName))
		{
			++nExtCnt;
			++lpszFileName;
		}
	}

	/* Fix lengths to maximums allowed by MS-DOS.			*/
	if(nDirCnt > PARSE_MAX)
		nDirCnt = PARSE_MAX;
	if(nFileCnt > FNAME_SIZE)
		nFileCnt = FNAME_SIZE;
	if(nExtCnt > FEXT_SIZE)
		nExtCnt = FEXT_SIZE;

	/* Finally copy whatever the user wants extracted to the user's	*/
	/* buffers.							*/
	if(pszDir)
	{
		fbcopy(lpszLclDir, (BYTE FAR *)pszDir, nDirCnt);
		pszDir[nDirCnt] = '\0';
	}
	if(pszFile)
	{
		fbcopy(lpszLclFile, (BYTE FAR *)pszFile, nFileCnt);
		pszFile[nFileCnt] = '\0';
	}
	if(pszExt)
	{
		fbcopy(lpszLclExt, (BYTE FAR *)pszExt, nExtCnt);
		pszExt[nExtCnt] = '\0';
	}

	/* Clean up before leaving				*/
	if(pszDir)
		DosTrimPath(pszDir);

	return SUCCESS;
}


COUNT
ParseDosPath(BYTE FAR *lpszFileName,
	     COUNT *pnDrive,
	     BYTE *pszDir,
	     BYTE *pszCurPath)
{
	COUNT nDirCnt, nPathCnt;
	BYTE FAR *lpszLclDir, *pszBase = pszDir;


	/* Initialize the users data fields				*/
	*pszDir = '\0';
	lpszLclDir = 0;
	nDirCnt = nPathCnt = 0;

	/* Start by cheking for a drive specifier ...			*/
	if(DriveChar(*lpszFileName) && ':' == lpszFileName[1])
	{
		/* found a drive, fetch it and bump pointer past drive	*/
		/* NB: this code assumes ASCII				*/
		if(pnDrive)
		{
			*pnDrive = *lpszFileName - 'A';
			if(*pnDrive > 26)
				*pnDrive -= ('a' - 'A');
		}
		lpszFileName += 2;
	}
	else
	{
		if(pnDrive)
		{
			*pnDrive = -1;
		}
	}

	lpszLclDir = lpszFileName;
	if(!PathSep(*lpszLclDir))
	{
		strncpy(pszDir, pszCurPath, PARSE_MAX);
		nPathCnt = strlen(pszCurPath);
		if(!PathSep(pszDir[nPathCnt - 1]) && nPathCnt < PARSE_MAX)
			pszDir[nPathCnt++] = '\\';
		if(nPathCnt > PARSE_MAX)
			nPathCnt = PARSE_MAX;
		pszDir += nPathCnt;
	}

	/* Now see how long a directory component we have.  		*/
	while(bFileChar(*lpszFileName)
	   || PathSep(*lpszFileName)
	   || '.' == *lpszFileName)
	{
		++nDirCnt;
		++lpszFileName;
	}

	/* Fix lengths to maximums allowed by MS-DOS.			*/
	if((nDirCnt + nPathCnt)> PARSE_MAX)
		nDirCnt = PARSE_MAX - nPathCnt;

	/* Finally copy whatever the user wants extracted to the user's	*/
	/* buffers.							*/
	if(pszDir)
	{
		fbcopy(lpszLclDir, (BYTE FAR *)pszDir, nDirCnt);
		pszDir[nDirCnt] = '\0';
	}

	/* Clean up before leaving				*/
	DosTrimPath((BYTE FAR *)pszBase);

	/* Before returning to the user, eliminate any useless		*/
	/* trailing "\\." since the path prior to this is sufficient.	*/
	nPathCnt = strlen(pszBase);
	if(2 == nPathCnt)  		/* Special case, root		*/
	{
		if(!strcmp(pszBase, "\\."))
			pszBase[1] = '\0';
	}
	else if(2 < nPathCnt)
	{
		if(!strcmp(&pszBase[nPathCnt - 2], "\\."))
			pszBase[nPathCnt - 2] = '\0';
	}

	return SUCCESS;
}


BOOL
IsDevice (BYTE *pszFileName)
{
	REG struct dhdr FAR *dhp = (struct dhdr FAR *)&nul_dev;
	BYTE szName[FNAME_SIZE];

	/* break up the name first				*/
	ParseDosName((BYTE FAR *)pszFileName,
	 (COUNT *)0, TempBuffer, szName, (BYTE *)0);
	SpacePad(szName, FNAME_SIZE);

	/* Test 1 - does it start with a \dev or /dev		*/
	if((strcmp(szName, "/dev") == 0)
	 || (strcmp(szName, "\\dev") == 0))
		return TRUE;

	/* Test 2 - is it on the device chain?			*/
	for(; -1l != (LONG)dhp; dhp = dhp -> dh_next)
	{
		COUNT nIdx;

		/* Skip if not char device			*/
		if(!(dhp -> dh_attr & ATTR_CHAR))
			continue;

		/* now compare					*/
		for(nIdx = 0; nIdx < FNAME_SIZE; ++nIdx)
		{
			if(dhp -> dh_name[nIdx] != szName[nIdx])
				break;
		}
		if(nIdx >= FNAME_SIZE)
			return TRUE;
	}

	return FALSE;
}


VOID
DosTrimPath (BYTE FAR *lpszPathNamep)
{
	BYTE FAR *lpszLast, FAR *lpszNext, FAR *lpszRoot = (BYTE FAR *)0;
	COUNT nChars, flDotDot;

	/* First, convert all '/' to '\'.  Look for root as we scan	*/
	if(*lpszPathNamep == '\\')
		lpszRoot = lpszPathNamep;
	for(lpszNext = lpszPathNamep; *lpszNext; ++lpszNext)
	{
		if(*lpszNext == '/')
			*lpszNext = '\\';
		if(!lpszRoot &&
		 *lpszNext == ':' && *(lpszNext + 1) == '\\')
			lpszRoot = lpszNext + 1;
	}

	for(lpszLast = lpszNext = lpszPathNamep, nChars = 0;
	  *lpszNext != '\0' && nChars < NAMEMAX; )
	{
		/* Initialize flag for loop.				*/
		flDotDot = FALSE;

		/* If we are at a path seperator, check for extra path	*/
		/* seperator, '.' and '..' to reduce.			*/
		if(*lpszNext == '\\')
		{
			/* If it's '\', just move everything down one.	*/
			if(*(lpszNext + 1) == '\\')
				fstrncpy(lpszNext, lpszNext + 1, NAMEMAX);
			/* also check for '.' and '..' and move down	*/
			/* as appropriate.				*/
			else if(*(lpszNext + 1) == '.')
			{
				if(*(lpszNext + 2) == '.'
				 && !(*(lpszNext + 3)))
				{
					/* At the end, just truncate	*/
					/* and exit.			*/
					if(lpszLast == lpszRoot)
						*(lpszLast + 1) = '\0';
					else
						*lpszLast = '\0';
					return;
				}

				if(*(lpszNext + 2) == '.'
				 && *(lpszNext + 3) == '\\')
				{
					fstrncpy(lpszLast, lpszNext + 3, NAMEMAX);
					/* bump back to the last	*/
					/* seperator.			*/
					lpszNext = lpszLast;
					/* set lpszLast to the last one	*/
					if(lpszLast <= lpszPathNamep)
						continue;
					do
					{
						--lpszLast;
					}
					while(lpszLast != lpszPathNamep
					 && *lpszLast != '\\');
					flDotDot = TRUE;
				}
				/* Note: we skip strange stuff that	*/
				/* starts with '.'			*/
				else if(*(lpszNext + 2) == '\\')
				{
					fstrncpy(lpszNext, lpszNext + 2, NAMEMAX);
				}
				/* If we're at the end of a string,	*/
				/* just exit.				*/
				else if(*(lpszNext + 2) == NULL)
					return;
			}
			else
			{
				/* No '.' or '\' so mark it and bump	*/
				/* past					*/
				lpszLast = lpszNext++;
				continue;
			}

			/* Done.  Now set last to next to mark this	*/
			/* instance of path seperator.			*/
			if(!flDotDot)
				lpszLast = lpszNext;
		}
		else
			/* For all other cases, bump lpszNext for the	*/
			/* next check					*/
			++lpszNext;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线免费不卡视频| 韩国三级在线一区| 97精品久久久午夜一区二区三区 | 日韩美女视频一区二区| 波多野结衣中文字幕一区| 中文字幕精品一区| 色先锋资源久久综合| 亚洲一区二区三区激情| 在线播放日韩导航| 久久 天天综合| 国产亚洲一区二区三区在线观看 | 亚洲女爱视频在线| 欧美日韩成人综合| 国产呦萝稀缺另类资源| 日本一区二区成人| 欧美亚洲国产一区二区三区 | 国产乱一区二区| 国产精品久久久久aaaa| 91极品视觉盛宴| 日本视频中文字幕一区二区三区| 日韩一区二区三区四区| 国产一区在线精品| 亚洲品质自拍视频网站| 欧美美女直播网站| 丰满少妇久久久久久久| 一区2区3区在线看| 日韩美女视频在线| 91片黄在线观看| 欧美a级理论片| 国产精品国产精品国产专区不片| 欧美日韩亚洲国产综合| 国产成人免费9x9x人网站视频| 亚洲视频你懂的| 日韩免费视频一区| 色偷偷88欧美精品久久久| 美女一区二区三区在线观看| 国产精品欧美一区喷水| 91精品国产欧美一区二区成人| 成人免费黄色大片| 日本中文字幕一区二区视频| 日本一区免费视频| 欧美一区二区三区免费在线看| 豆国产96在线|亚洲| 日韩不卡一二三区| 极品瑜伽女神91| 亚洲一区视频在线观看视频| 久久网站最新地址| 777亚洲妇女| 91尤物视频在线观看| 国产最新精品精品你懂的| 一卡二卡欧美日韩| 亚洲青青青在线视频| 久久久久久久久免费| 欧美精品高清视频| 色偷偷久久一区二区三区| 国产不卡视频在线观看| 日本欧美久久久久免费播放网| 亚洲欧美视频在线观看视频| 久久亚洲精品国产精品紫薇| 91精品国产全国免费观看| 欧美专区亚洲专区| 91麻豆国产精品久久| 国产一区二区三区在线看麻豆| 日韩av一区二| 日韩精品91亚洲二区在线观看| 夜夜精品视频一区二区| 亚洲天堂av一区| 成人免费在线播放视频| 国产精品美日韩| 国产精品无码永久免费888| 久久午夜羞羞影院免费观看| 精品久久免费看| 欧美成人欧美edvon| 538prom精品视频线放| 制服丝袜中文字幕一区| 欧美人与z0zoxxxx视频| 欧美日韩成人综合在线一区二区| 欧美中文字幕不卡| 欧美美女视频在线观看| 欧美亚洲高清一区| 欧美日韩精品专区| 欧美久久高跟鞋激| 日韩一区二区电影网| 日韩一区二区在线看| 日韩欧美黄色影院| 久久久久综合网| 国产欧美va欧美不卡在线| 国产欧美一区二区在线观看| 国产精品欧美极品| 亚洲视频一区在线观看| 亚洲午夜影视影院在线观看| 婷婷综合另类小说色区| 美腿丝袜一区二区三区| 国产精品综合在线视频| www.日韩在线| 91官网在线免费观看| 777久久久精品| 欧美v日韩v国产v| 国产精品亲子伦对白| 夜夜嗨av一区二区三区四季av| 亚洲高清视频在线| 精品夜夜嗨av一区二区三区| 国产真实乱对白精彩久久| 成人av免费观看| 欧美性videosxxxxx| 欧美一区二区三区日韩| 中文字幕av资源一区| 高清不卡在线观看| 色综合久久久久综合99| 91精品国产91热久久久做人人| 26uuu亚洲综合色欧美| 亚洲欧洲国产日韩| 日韩激情一区二区| 不卡一区二区三区四区| 欧美日韩国产系列| 久久久亚洲综合| 亚洲一级电影视频| 国产乱码一区二区三区| 91福利视频网站| 久久精品亚洲精品国产欧美 | 久久在线观看免费| 亚洲色图一区二区| 久久精品国产色蜜蜜麻豆| 大胆亚洲人体视频| 884aa四虎影成人精品一区| 国产日产亚洲精品系列| 一区二区三区在线播| 国产在线麻豆精品观看| 91浏览器打开| 国产午夜久久久久| 婷婷开心久久网| www.欧美精品一二区| 日韩免费一区二区三区在线播放| 亚洲人成在线观看一区二区| 久久黄色级2电影| 欧洲精品在线观看| 欧美经典一区二区| 免费在线成人网| 在线观看视频欧美| 亚洲国产精品成人综合色在线婷婷| 婷婷夜色潮精品综合在线| 91社区在线播放| 亚洲国产精品传媒在线观看| 日韩和欧美一区二区| 日本国产一区二区| 国产精品成人一区二区艾草| 国产一区二区免费在线| 3d动漫精品啪啪一区二区竹菊| 中文字幕在线一区| 国产mv日韩mv欧美| 2023国产精华国产精品| 美女一区二区在线观看| 91精品国产手机| 亚洲成va人在线观看| 在线精品视频一区二区| 中文字幕综合网| 99麻豆久久久国产精品免费| 国产亚洲综合色| 国产在线视频精品一区| 精品盗摄一区二区三区| 日韩高清不卡在线| 欧美高清激情brazzers| 亚洲高清不卡在线| 欧美日韩综合在线| 亚洲二区在线观看| 在线欧美日韩国产| 夜夜夜精品看看| 欧美三级欧美一级| 香蕉久久一区二区不卡无毒影院| 色视频一区二区| 亚洲精选视频在线| 在线观看国产日韩| 午夜精品影院在线观看| 欧美亚洲国产一卡| 日韩精品一区第一页| 日韩一区二区精品| 在线播放中文字幕一区| 肉色丝袜一区二区| 欧美一区二区三区免费观看视频| 免费在线一区观看| 2024国产精品| 成人开心网精品视频| 亚洲婷婷在线视频| 欧美性大战久久| 青青草97国产精品免费观看| 精品福利av导航| 粉嫩一区二区三区性色av| 国产精品久久久久影院| 91官网在线观看| 免费成人在线观看| 国产欧美一区二区精品久导航 | 欧美色综合影院| 日韩国产欧美视频| 欧美精品一区二区久久婷婷| 国产成人免费视频网站高清观看视频| 国产精品乱码一区二区三区软件| 99精品国产99久久久久久白柏| 亚洲综合色丁香婷婷六月图片| 欧美日韩国产影片| 国产一区999|