Author: jmorlan
Date: Sun Apr 5 05:50:24 2009
New Revision: 40365
URL:
http://svn.reactos.org/svn/reactos?rev=40365&view=rev
Log:
- Simplified code for CD, PUSHD, and POPD commands and also fixed some bugs.
Modified:
trunk/reactos/base/shell/cmd/cmd.c
trunk/reactos/base/shell/cmd/cmd.h
trunk/reactos/base/shell/cmd/dirstack.c
trunk/reactos/base/shell/cmd/internal.c
Modified: trunk/reactos/base/shell/cmd/cmd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.c?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] Sun Apr 5 05:50:24 2009
@@ -1653,10 +1653,6 @@
SetConsoleMode (hIn, ENABLE_PROCESSED_INPUT);
-#ifdef INCLUDE_CMD_CHDIR
- InitLastPath ();
-#endif
-
for (ptr = cmdLine; *ptr; ptr++)
{
if (*ptr == _T('/'))
@@ -1791,10 +1787,6 @@
DestroyDirectoryStack ();
#endif
-#ifdef INCLUDE_CMD_CHDIR
- FreeLastPath ();
-#endif
-
#ifdef FEATURE_HISTORY
CleanHistory();
#endif
Modified: trunk/reactos/base/shell/cmd/cmd.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.h?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.h [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.h [iso-8859-1] Sun Apr 5 05:50:24 2009
@@ -329,7 +329,7 @@
/* Prototypes for MISC.C */
INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size);
-BOOL SetRootPath(TCHAR *InPath);
+BOOL SetRootPath(TCHAR *oldpath,TCHAR *InPath);
TCHAR cgetchar (VOID);
BOOL CheckCtrlBreak (INT);
BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry);
Modified: trunk/reactos/base/shell/cmd/dirstack.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/dirstack.c?…
==============================================================================
--- trunk/reactos/base/shell/cmd/dirstack.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/dirstack.c [iso-8859-1] Sun Apr 5 05:50:24 2009
@@ -22,7 +22,7 @@
{
struct tagDIRENTRY *prev;
struct tagDIRENTRY *next;
- LPTSTR pszPath;
+ TCHAR szPath[1];
} DIRENTRY, *LPDIRENTRY;
@@ -34,11 +34,7 @@
static INT
PushDirectory (LPTSTR pszPath)
{
- LPDIRENTRY lpDir;
-
- nErrorLevel = 0;
-
- lpDir = (LPDIRENTRY)cmd_alloc (sizeof (DIRENTRY));
+ LPDIRENTRY lpDir = cmd_alloc(FIELD_OFFSET(DIRENTRY, szPath[_tcslen(pszPath) + 1]));
if (!lpDir)
{
error_out_of_memory ();
@@ -46,67 +42,34 @@
}
lpDir->prev = NULL;
+ lpDir->next = lpStackTop;
if (lpStackTop == NULL)
- {
- lpDir->next = NULL;
lpStackBottom = lpDir;
- }
else
- {
- lpDir->next = lpStackTop;
lpStackTop->prev = lpDir;
- }
lpStackTop = lpDir;
- lpDir->pszPath = (LPTSTR)cmd_alloc ((_tcslen(pszPath)+1)*sizeof(TCHAR));
- if (!lpDir->pszPath)
- {
- cmd_free (lpDir);
- error_out_of_memory ();
- return -1;
- }
-
- _tcscpy (lpDir->pszPath, pszPath);
+ _tcscpy(lpDir->szPath, pszPath);
nStackDepth++;
- return 0;
+ return nErrorLevel = 0;
}
static VOID
PopDirectory (VOID)
{
- LPDIRENTRY lpDir;
-
- nErrorLevel = 0;
-
- if (nStackDepth == 0)
- return;
-
- lpDir = lpStackTop;
+ LPDIRENTRY lpDir = lpStackTop;
lpStackTop = lpDir->next;
if (lpStackTop != NULL)
lpStackTop->prev = NULL;
else
lpStackBottom = NULL;
- cmd_free (lpDir->pszPath);
cmd_free (lpDir);
nStackDepth--;
-}
-
-
-static VOID
-GetDirectoryStackTop (LPTSTR pszPath)
-{
- nErrorLevel = 0;
-
- if (lpStackTop)
- _tcsncpy (pszPath, lpStackTop->pszPath, MAX_PATH);
- else
- *pszPath = _T('\0');
}
@@ -143,8 +106,6 @@
INT CommandPushd (LPTSTR rest)
{
TCHAR curPath[MAX_PATH];
- TCHAR newPath[MAX_PATH];
- BOOL bChangePath = FALSE;
if (!_tcsncmp (rest, _T("/?"), 2))
{
@@ -152,22 +113,15 @@
return 0;
}
- nErrorLevel = 0;
+ GetCurrentDirectory (MAX_PATH, curPath);
if (rest[0] != _T('\0'))
{
- GetFullPathName (rest, MAX_PATH, newPath, NULL);
- bChangePath = IsValidPathName (newPath);
+ if (!SetRootPath(NULL, rest))
+ return 1;
}
- GetCurrentDirectory (MAX_PATH, curPath);
- if (PushDirectory (curPath))
- return 0;
-
- if (bChangePath)
- _tchdir(newPath);
-
- return 0;
+ return PushDirectory(curPath);
}
@@ -176,25 +130,20 @@
*/
INT CommandPopd (LPTSTR rest)
{
- TCHAR szPath[MAX_PATH];
-
+ INT ret = 0;
if (!_tcsncmp(rest, _T("/?"), 2))
{
ConOutResPuts(STRING_DIRSTACK_HELP2);
return 0;
}
- nErrorLevel = 0;
+ if (nStackDepth == 0)
+ return 1;
- if (GetDirectoryStackDepth () == 0)
- return 0;
-
- GetDirectoryStackTop (szPath);
+ ret = _tchdir(lpStackTop->szPath) != 0;
PopDirectory ();
- _tchdir(szPath);
-
- return 0;
+ return ret;
}
@@ -223,8 +172,7 @@
while (lpDir != NULL)
{
- ConOutPuts (lpDir->pszPath);
-
+ ConOutPuts(lpDir->szPath);
lpDir = lpDir->prev;
}
Modified: trunk/reactos/base/shell/cmd/internal.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/internal.c?…
==============================================================================
--- trunk/reactos/base/shell/cmd/internal.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/internal.c [iso-8859-1] Sun Apr 5 05:50:24 2009
@@ -140,21 +140,6 @@
#include <precomp.h>
#ifdef INCLUDE_CMD_CHDIR
-
-static LPTSTR lpLastPath;
-
-
-VOID InitLastPath (VOID)
-{
- lpLastPath = NULL;
-}
-
-
-VOID FreeLastPath (VOID)
-{
- if (lpLastPath)
- cmd_free (lpLastPath);
-}
/* help functions for getting current path from drive
without changing drive. Return code 0 = ok, 1 = fail.
@@ -166,12 +151,8 @@
INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size)
{
- INT retcode = 1;
-
- if (_tcslen(InPath)>1)
+ if (InPath[0] && InPath[1] == _T(':'))
{
- if (InPath[1]==_T(':'))
- {
INT t=0;
if ((InPath[0] >= _T('0')) && (InPath[0] <=
_T('9')))
@@ -190,76 +171,41 @@
t = (InPath[0] - _T('A')) +1;
}
- if (_tgetdcwd(t,OutPath,size) != NULL)
- {
- return 0;
- }
- }
- }
-
- /* fail */
- if (_tcslen(InPath)>1)
- {
- if (InPath[1]==_T(':'))
- return 1;
+ return _tgetdcwd(t,OutPath,size) == NULL;
}
/* Get current directory */
- retcode = GetCurrentDirectory(size,OutPath);
- if (retcode==0)
- return 1;
-
- return 0;
-}
-
-
-BOOL SetRootPath(TCHAR *InPath)
-{
- TCHAR oldpath[MAX_PATH];
+ return !GetCurrentDirectory(size,OutPath);
+}
+
+
+BOOL SetRootPath(TCHAR *oldpath, TCHAR *InPath)
+{
TCHAR OutPath[MAX_PATH];
TCHAR OutPathTemp[MAX_PATH];
- TCHAR OutPathTemp2[MAX_PATH];
- BOOL fail;
-
-
- /* Get The current directory path and save it */
- fail = GetCurrentDirectory(MAX_PATH,oldpath);
- if (!fail)
- return 1;
-
- /* Get current drive directory path if C: was only pass down*/
-
- if (_tcsncicmp(&InPath[1],_T(":\\"),2)!=0)
- {
- if (!GetRootPath(InPath,OutPathTemp,MAX_PATH))
- _tcscpy(OutPathTemp,InPath);
- }
- else
- {
- _tcscpy(OutPathTemp,InPath);
- }
-
- _tcsupr(OutPathTemp);
+
/* The use of both of these together will correct the case of a path
where as one alone or GetFullPath will not. Exameple:
c:\windows\SYSTEM32 => C:\WINDOWS\system32 */
- GetFullPathName(OutPathTemp, MAX_PATH, OutPathTemp2, NULL);
- GetPathCase(OutPathTemp2, OutPath);
-
- fail = SetCurrentDirectory(OutPath);
- if (!fail)
- return 1;
-
-
-
- SetCurrentDirectory(OutPath);
- GetCurrentDirectory(MAX_PATH,OutPath);
- _tchdir(OutPath);
-
- if (_tcsncicmp(OutPath,oldpath,2)!=0)
- SetCurrentDirectory(oldpath);
-
- return 0;
+ if (GetFullPathName(InPath, MAX_PATH, OutPathTemp, NULL))
+ {
+ GetPathCase(OutPathTemp, OutPath);
+
+ /* Use _tchdir, since unlike SetCurrentDirectory it updates
+ * the current-directory-on-drive environment variables. */
+ if (_tchdir(OutPath) != 0)
+ {
+ ConErrFormatMessage(GetLastError());
+ nErrorLevel = 1;
+ return FALSE;
+ }
+
+ /* Keep original drive in ordinary CD/CHDIR (without /D switch). */
+ if (oldpath != NULL && _tcsncicmp(OutPath, oldpath, 2) != 0)
+ SetCurrentDirectory(oldpath);
+ }
+
+ return TRUE;
}
@@ -269,16 +215,8 @@
*/
INT cmd_chdir (LPTSTR param)
{
-
- WIN32_FIND_DATA f;
- HANDLE hFile;
+ TCHAR szCurrent[MAX_PATH];
BOOL bChangeDrive = FALSE;
- TCHAR szPath[MAX_PATH];
- TCHAR szFinalPath[MAX_PATH];
- TCHAR * tmpPath;
- TCHAR szCurrent[MAX_PATH];
- INT i;
-
/* Filter out special cases first */
@@ -289,131 +227,45 @@
return 0;
}
- /* Set Error Level to Success */
+ /* Remove " */
+ StripQuotes(param);
+
+ /* Set Error Level to Success */
nErrorLevel = 0;
+
+ /* Print Current Directory on a disk */
+ if (_tcslen(param) == 2 && param[1] == _T(':'))
+ {
+ if (GetRootPath(param, szCurrent, MAX_PATH))
+ {
+ error_invalid_drive();
+ return 1;
+ }
+ ConOutPuts(szCurrent);
+ return 0;
+ }
+
+ /* Get Current Directory */
+ GetCurrentDirectory(MAX_PATH, szCurrent);
+ if (param[0] == _T('\0'))
+ {
+ ConOutPuts(szCurrent);
+ return 0;
+ }
/* Input String Contains /D Switch */
if (!_tcsncicmp(param, _T("/D"), 2))
{
bChangeDrive = TRUE;
- tmpPath = _tcsstr(param,_T(" "));
- if(!tmpPath)
- {
- /* Didnt find an directories */
- ConErrResPrintf(STRING_ERROR_PATH_NOT_FOUND);
- nErrorLevel = 1;
- return 1;
- }
- tmpPath++;
- _tcscpy(szPath,tmpPath);
- }
- else
- {
- _tcscpy(szPath,param);
- }
-
- /* Print Current Directory on a disk */
- if (_tcslen(szPath) == 2 && szPath[1] == _T(':'))
- {
- if(GetRootPath(szPath,szCurrent,MAX_PATH))
- {
- nErrorLevel = 1;
- return 1;
- }
- ConOutPuts(szCurrent);
- return 0;
- }
-
- /* Get Current Directory */
- GetRootPath(_T("."),szCurrent,MAX_PATH);
-
- /* Remove " */
- i = 0;
- while(i < (INT)_tcslen(szPath))
- {
- if(szPath[i] == _T('\"'))
- memmove(&szPath[i],&szPath[i + 1], _tcslen(&szPath[i]) * sizeof(TCHAR));
- else
- i++;
- }
-
- tmpPath = szPath;
- while (_istspace (*tmpPath))
- tmpPath++;
- _tcscpy(szPath,tmpPath);
-
- if (szPath[0] == _T('\0'))
- {
- ConOutPuts(szCurrent);
- return 0;
- }
-
-
- /* change to full path if relative path was given */
- GetFullPathName(szPath,MAX_PATH,szFinalPath,NULL);
-
- if(szFinalPath[_tcslen(szFinalPath) - 1] == _T('\\') &&
_tcslen(szFinalPath) > 3)
- szFinalPath[_tcslen(szFinalPath) - 1] = _T('\0');
-
- /* Handle Root Directory Alone*/
- if (_tcslen(szFinalPath) == 3 && szFinalPath[1] == _T(':'))
- {
- if(!SetRootPath(szFinalPath))
- {
- /* Change prompt if it is one the same drive or /D */
- if(bChangeDrive || !_tcsncicmp(szFinalPath,szCurrent,1))
- SetCurrentDirectory(szFinalPath);
- return 0;
- }
- /* Didnt find an directories */
- ConErrResPrintf(STRING_ERROR_PATH_NOT_FOUND);
- nErrorLevel = 1;
+ param += 2;
+ while (_istspace(*param))
+ param++;
+ }
+
+ if (!SetRootPath(bChangeDrive ? NULL : szCurrent, param))
return 1;
- }
-
- /* Get a list of all the files */
- hFile = FindFirstFile (szFinalPath, &f);
-
- do
- {
- if(hFile == INVALID_HANDLE_VALUE)
- {
- ConErrFormatMessage (GetLastError(), szFinalPath);
- nErrorLevel = 1;
- return 1;
- }
-
- /* Strip the paths back to the folder they are in */
- for(i = (_tcslen(szFinalPath) - 1); i > -1; i--)
- if(szFinalPath[i] != _T('\\'))
- szFinalPath[i] = _T('\0');
- else
- break;
-
- _tcscat(szFinalPath,f.cFileName);
-
- if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
- {
- if(!SetRootPath(szFinalPath))
- {
- /* Change for /D */
- if(bChangeDrive)
- {
- _tcsupr(szFinalPath);
- GetPathCase(szFinalPath, szPath);
- SetCurrentDirectory(szPath);
- }
- return 0;
- }
-
- }
- }while(FindNextFile (hFile, &f));
-
- /* Didnt find an directories */
- ConErrResPrintf(STRING_ERROR_PATH_NOT_FOUND);
- nErrorLevel = 1;
- return 1;
+ return 0;
}
#endif