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

📄 internal.c

📁 PocketCMD是与pocketconsole配合实用的命令行解释器(Shell)
💻 C
字号:
/* *  INTERNAL.C - command.com internal commands. * * *  History: * *  17/08/94 (Tim Norman) *    started. * *  08/08/95 (Matt Rains) *    i have cleaned up the source code. changes now bring this source into *    guidelines for recommended programming practice. * *  cd() *    started. * *  dir() *    i have added support for file attributes to the DIR() function. the *    routine adds "d" (directory) and "r" (read only) output. files with the *    system attribute have the filename converted to lowercase. files with *    the hidden attribute are not displayed. * *    i have added support for directorys. now if the directory attribute is *    detected the file size if replaced with the string "<dir>". * *  ver() *    started. * *  md() *    started. * *  rd() *    started. * *  del() *    started. * *  does not support wildcard selection. * *  todo: add delete directory support. *        add recursive directory delete support. * *  ren() *    started. * *  does not support wildcard selection. * *    todo: add rename directory support. * *  a general structure has been used for the cd, rd and md commands. this *  will be better in the long run. it is too hard to maintain such diverse *  functions when you are involved in a group project like this. * *  12/14/95 (Tim Norman) *    fixed DIR so that it will stick \*.* if a directory is specified and *    that it will stick on .* if a file with no extension is specified or *    *.* if it ends in a \ * *  1/6/96 (Tim Norman) *    added an isatty call to DIR so it won't prompt for keypresses unless *    stdin and stdout are the console. * *    changed parameters to be mutually consistent to make calling the *    functions easier * *  rem() *    started. * *  doskey() *    started. * *    01/22/96 (Oliver Mueller) *        error messages are now handled by perror. * *    02/05/96 (Tim Norman) *        converted all functions to accept first/rest parameters * *    07/26/96 (Tim Norman) *        changed return values to int instead of void * *        path() started. * *    12/23/96 (Aaron Kaufman) *        rewrote dir() to mimic MS-DOS's dir * *    01/28/97 (Tim Norman) *        cleaned up Aaron's DIR code * *    06/13/97 (Tim Norman) *        moved DIR code to dir.c *        re-implemented Aaron's DIR code * *    06/14/97 (Steffan Kaiser) *        ctrl-break handling *        bug fixes * *    27-Jul-1998 (John P Price <linux-guru@gcfl.net>) *        added config.h include * *    03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Replaced DOS calls by Win32 calls. * *    08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Added help texts ("/?"). * *    18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Added support for quoted arguments (cd "program files"). * *    07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Clean up. * *    26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Replaced remaining CRT io functions by Win32 io functions. *        Unicode safe! * *    30-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Added "cd -" feature. Changes to the previous directory. * *    15-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>) *        Fixed bug in "cd -" feature. If the previous directory was a root *        directory, it was ignored. * *    23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>) *        Improved chdir/cd command. */#include "config.h"#include "cmd.h"#ifdef INCLUDE_CMD_CHDIRstatic LPTSTR lpLastPath;VOID InitLastPath (VOID){	lpLastPath = NULL;}VOID FreeLastPath (VOID){	if (lpLastPath)		free (lpLastPath);}/* * CD / CHDIR * */INT cmd_chdir (LPTSTR cmd, LPTSTR param){	LPTSTR dir;		/* pointer to the directory to change to */	LPTSTR lpOldPath;	LPTSTR endofstring; /* pointer to the null character in the directory to change to */	LPTSTR lastquote; /* pointer to the last quotation mark in the directory to change to */	/*Should we better declare a variable containing _tsclen(dir) ? It's used a few times,	  but on the other hand paths are generally not very long*/	if (!_tcsncmp (param, _T("/?"), 2))	{		ConOutPuts (_T("Changes the current directory or displays it's name\n\n")					   _T("CHDIR [drive:][path]\n")					   _T("CHDIR[..|-]\n")					   _T("CD [drive:][path]\n")					   _T("CD[..|-]\n\n")					   _T("  ..   parent directory\n")					   _T("  -    previous directory\n\n")					   _T("Type CD drive: to display the current directory on the specified drive.\n")					   _T("Type CD without a parameter to display the current drive and directory."));		return 0;	}	/* The whole param string is our parameter these days. The only thing we do is eliminating every quotation mark */	/* Is it safe to change the characters param is pointing to? I presume it is, as there doesn't seem to be any	post-processing of it after the function call (what would that accomplish?) */	dir=param;	endofstring=dir+_tcslen(dir);	while (lastquote = _tcsrchr(dir,'\"'))	{		endofstring--;		memmove(lastquote,lastquote+1,endofstring-lastquote);		*endofstring=_T('\0');	}	/* if doing a CD and no parameters given, print out current directory */	if (!dir || !dir[0])	{		TCHAR szPath[MAX_PATH];		GetCurrentDirectory (MAX_PATH, szPath);		ConOutPuts (szPath);		return 0;	}	if (dir && _tcslen (dir) == 1 && *dir == _T('-'))	{		if (lpLastPath)			dir = lpLastPath;		else			return 0;	}	else if (dir && _tcslen (dir)==2 && dir[1] == _T(':'))	{		TCHAR szRoot[3] = _T("A:");		TCHAR szPath[MAX_PATH];		szRoot[0] = _totupper (dir[0]);		GetFullPathName (szRoot, MAX_PATH, szPath, NULL);		/* PathRemoveBackslash */		if (_tcslen (szPath) > 3)		{			LPTSTR p = _tcsrchr (szPath, _T('\\'));			*p = _T('\0');		}		ConOutPuts (szPath);		return 0;	}	/* remove trailing \ if any, but ONLY if dir is not the root dir */	if (_tcslen (dir) > 3 && dir[_tcslen (dir) - 1] == _T('\\'))		dir[_tcslen(dir) - 1] = _T('\0');	/* store current directory */	lpOldPath = (LPTSTR)malloc (MAX_PATH * sizeof(TCHAR));	GetCurrentDirectory (MAX_PATH, lpOldPath);	if (!SetCurrentDirectory (dir))	{		ErrorMessage (GetLastError(), _T("CD"));		/* throw away current directory */		free (lpOldPath);		lpOldPath = NULL;		return 1;	}	else	{		GetCurrentDirectory(MAX_PATH, dir);		if (dir[0]!=lpOldPath[0])		{			SetCurrentDirectory(lpOldPath);			free(lpOldPath);		}		else		{			if (lpLastPath)				free (lpLastPath);			lpLastPath = lpOldPath;		}	}	return 0;}#endif#ifdef INCLUDE_CMD_MKDIR/* * MD / MKDIR * */INT cmd_mkdir (LPTSTR cmd, LPTSTR param){	LPTSTR dir;		/* pointer to the directory to change to */	LPTSTR place;	/* used to search for the \ when no space is used */	LPTSTR *p = NULL;	INT argc;	if (!_tcsncmp (param, _T("/?"), 2))	{		ConOutPuts (_T("Creates a directory.\n\n")					   _T("MKDIR [drive:]path\nMD [drive:]path"));		return 0;	}	/* check if there is no space between the command and the path */	if (param[0] == _T('\0'))	{		/* search for the \ or . so that both short & long names will work */		for (place = cmd; *place; place++)			if (*place == _T('.') || *place == _T('\\'))				break;		if (*place)			dir = place;		else			/* signal that there are no parameters */			dir = NULL;	}	else	{		p = split (param, &argc);		if (argc > 1)		{			/*JPP 20-Jul-1998 use standard error message */			error_too_many_parameters (param);			freep (p);			return 1;		}		else			dir = p[0];	}	if (!dir)	{		ConErrPrintf (_T("Required parameter missing\n"));		return 1;	}	/* remove trailing \ if any, but ONLY if dir is not the root dir */	if (_tcslen (dir) >= 2 && dir[_tcslen (dir) - 1] == _T('\\'))		dir[_tcslen(dir) - 1] = _T('\0');	if (!CreateDirectory (dir, NULL))	{		ErrorMessage (GetLastError(), _T("MD"));		freep (p);		return 1;	}	freep (p);	return 0;}#endif#ifdef INCLUDE_CMD_RMDIR/* * RD / RMDIR * */INT cmd_rmdir (LPTSTR cmd, LPTSTR param){	LPTSTR dir;		/* pointer to the directory to change to */	LPTSTR place;	/* used to search for the \ when no space is used */	LPTSTR *p = NULL;	INT argc;	if (!_tcsncmp (param, _T("/?"), 2))	{		ConOutPuts (_T("Removes a directory.\n\n")					   _T("RMDIR [drive:]path\nRD [drive:]path"));		return 0;	}	/* check if there is no space between the command and the path */	if (param[0] == _T('\0'))	{		/* search for the \ or . so that both short & long names will work */		for (place = cmd; *place; place++)			if (*place == _T('.') || *place == _T('\\'))				break;		if (*place)			dir = place;		else			/* signal that there are no parameters */			dir = NULL;	}	else	{		p = split (param, &argc);		if (argc > 1)		{			/*JPP 20-Jul-1998 use standard error message */			error_too_many_parameters (param);			freep (p);			return 1;		}		else			dir = p[0];	}	if (!dir)	{		ConErrPrintf (_T("Required parameter missing\n"));		return 1;	}	/* remove trailing \ if any, but ONLY if dir is not the root dir */	if (_tcslen (dir) >= 2 && dir[_tcslen (dir) - 1] == _T('\\'))		dir[_tcslen(dir) - 1] = _T('\0');	if (!RemoveDirectory (dir))	{		ErrorMessage (GetLastError(), _T("RD"));		freep (p);		return 1;	}	freep (p);	return 0;}#endif/* * set the exitflag to true * */INT CommandExit (LPTSTR cmd, LPTSTR param){	if (!_tcsncmp (param, _T("/?"), 2))	{		ConOutPuts (_T("Exits the command line interpreter.\n\nEXIT"));		return 0;	}	bExit = TRUE;	return 0;}#ifdef INCLUDE_CMD_REM/* * does nothing * */INT CommandRem (LPTSTR cmd, LPTSTR param){	if (!_tcsncmp (param, _T("/?"), 2))	{		ConOutPuts (_T("Starts a comment line in a batch file.\n\n")		               _T("REM [Comment]"));	}	return 0;}#endif /* INCLUDE_CMD_REM */INT CommandShowCommands (LPTSTR cmd, LPTSTR param){	PrintCommandList ();	return 0;}/* EOF */

⌨️ 快捷键说明

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