⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dirstack.c

📁 PocketCMD是与pocketconsole配合实用的命令行解释器(Shell)
💻 C
字号:
/* *  DIRSTACK.C - pushd / pop (directory stack) internal commands. * * *  History: * *    14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Implemented PUSHD and POPD command. * *    20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Unicode and redirection safe! * *    20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Added DIRS command. */#include "config.h"#ifdef FEATURE_DIRECTORY_STACK#include "cmd.h"typedef struct tagDIRENTRY{	struct tagDIRENTRY *prev;	struct tagDIRENTRY *next;	LPTSTR pszPath;} DIRENTRY, *LPDIRENTRY;static INT nStackDepth;static LPDIRENTRY lpStackTop;static LPDIRENTRY lpStackBottom;static INTPushDirectory (LPTSTR pszPath){	LPDIRENTRY lpDir;	lpDir = (LPDIRENTRY)malloc (sizeof (DIRENTRY));	if (!lpDir)	{		error_out_of_memory ();		return -1;	}	lpDir->prev = NULL;	if (lpStackTop == NULL)	{		lpDir->next = NULL;		lpStackBottom = lpDir;	}	else	{		lpDir->next = lpStackTop;		lpStackTop->prev = lpDir;	}	lpStackTop = lpDir;	lpDir->pszPath = (LPTSTR)malloc ((_tcslen(pszPath)+1)*sizeof(TCHAR));	if (!lpDir->pszPath)	{		free (lpDir);		error_out_of_memory ();		return -1;	}	_tcscpy (lpDir->pszPath, pszPath);	nStackDepth++;	return 0;}static VOIDPopDirectory (VOID){	LPDIRENTRY lpDir;	if (nStackDepth == 0)		return;	lpDir = lpStackTop;	lpStackTop = lpDir->next;	if (lpStackTop != NULL)		lpStackTop->prev = NULL;	else		lpStackBottom = NULL;	free (lpDir->pszPath);	free (lpDir);	nStackDepth--;}static VOIDGetDirectoryStackTop (LPTSTR pszPath){	if (lpStackTop)		_tcsncpy (pszPath, lpStackTop->pszPath, MAX_PATH);	else		*pszPath = _T('\0');}/* * initialize directory stack */VOID InitDirectoryStack (VOID){	nStackDepth = 0;	lpStackTop = NULL;	lpStackBottom = NULL;}/* * destroy directory stack */VOID DestroyDirectoryStack (VOID){	while (nStackDepth)		PopDirectory ();}INT GetDirectoryStackDepth (VOID){	return nStackDepth;}/* * pushd command */INT CommandPushd (LPTSTR first, LPTSTR rest){	TCHAR curPath[MAX_PATH];	TCHAR newPath[MAX_PATH];	BOOL  bChangePath = FALSE;	if (!_tcsncmp (rest, _T("/?"), 2))	{		ConOutPuts (_T("Stores the current directory for use by the POPD command, then\n")			_T( "changes to the specified directory.\n\n")			_T("PUSHD [path | ..]\n\n")			_T("  path        Specifies the directory to make the current directory"));		return 0;	}	if (rest[0] != _T('\0'))	{		GetFullPathName (rest, MAX_PATH, newPath, NULL);		bChangePath = IsValidPathName (newPath);	}	GetCurrentDirectory (MAX_PATH, curPath);	if (PushDirectory (curPath))		return 0;	if (bChangePath)		SetCurrentDirectory (newPath);	return 0;}/* * popd command */INT CommandPopd (LPTSTR first, LPTSTR rest){	TCHAR szPath[MAX_PATH];	if (!_tcsncmp(rest, _T("/?"), 2))	{		ConOutPuts (_T("Changes to the directory stored by the PUSHD command.\n\n")		               _T("POPD"));		return 0;	}	if (GetDirectoryStackDepth () == 0)		return 0;	GetDirectoryStackTop (szPath);	PopDirectory ();	SetCurrentDirectory (szPath);	return 0;}/* * dirs command */INT CommandDirs (LPTSTR first, LPTSTR rest){	LPDIRENTRY lpDir;	if (!_tcsncmp(rest, _T("/?"), 2))	{		ConOutPuts (_T("Prints the contents of the directory stack.\n"		               _T("\n")		               _T("DIRS")));		return 0;	}	lpDir = lpStackBottom;	if (lpDir == NULL)	{		ConOutPuts (_T("Directory stack empty"));		return 0;	}	while (lpDir != NULL)	{		ConOutPuts (lpDir->pszPath);		lpDir = lpDir->prev;	}	return 0;}#endif /* FEATURE_DIRECTORY_STACK */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -