Author: jmorlan
Date: Sun Mar 8 20:37:11 2009
New Revision: 39910
URL:
http://svn.reactos.org/svn/reactos?rev=39910&view=rev
Log:
- Clean up code for DIR command
- Fix bug where "DIR directoryname /S" wouldn't list subdirectories (you
needed to do directoryname\*.*)
- Get rid of extra * that appeared in DIR /B /S output
Modified:
trunk/reactos/base/shell/cmd/dir.c
Modified: trunk/reactos/base/shell/cmd/dir.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/dir.c?rev=3…
==============================================================================
--- trunk/reactos/base/shell/cmd/dir.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/dir.c [iso-8859-1] Sun Mar 8 20:37:11 2009
@@ -565,6 +565,21 @@
return TRUE;
}
+/* Print either with or without paging, depending on /P switch */
+static INT
+DirPrintf(LPDIRSWITCHFLAGS lpFlags, LPTSTR szFormat, ...)
+{
+ INT iReturn = 0;
+ va_list arg_ptr;
+ va_start(arg_ptr, szFormat);
+ if (lpFlags->bPause)
+ iReturn = ConPrintfPaging(FALSE, szFormat, arg_ptr, STD_OUTPUT_HANDLE);
+ else
+ ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE);
+ va_end(arg_ptr);
+ return iReturn;
+}
+
/*
* PrintDirectoryHeader
@@ -605,77 +620,21 @@
if (szVolName[0] != _T('\0'))
{
LoadString(CMD_ModuleHandle, STRING_DIR_HELP2, szMsg, RC_STRING_MAX_SIZE);
- //needs to have first paramter as TRUE because
- //this is the first output and need to clear the static
- if(lpFlags->bPause)
- ConOutPrintfPaging(TRUE,szMsg, szRootName[0], szVolName);
- else
- ConOutPrintf(szMsg, szRootName[0], szVolName);
-
+ DirPrintf(lpFlags, szMsg, szRootName[0], szVolName);
}
else
{
LoadString(CMD_ModuleHandle, STRING_DIR_HELP3, szMsg, RC_STRING_MAX_SIZE);
- if(lpFlags->bPause)
- ConOutPrintfPaging(TRUE,szMsg, szRootName[0]);
- else
- ConOutPrintf(szMsg, szRootName[0]);
+ DirPrintf(lpFlags, szMsg, szRootName[0]);
}
/* print the volume serial number if the return was successful */
LoadString(CMD_ModuleHandle, STRING_DIR_HELP4, (LPTSTR) szMsg, RC_STRING_MAX_SIZE);
- if(lpFlags->bPause)
- ConOutPrintfPaging(FALSE,szMsg,
- HIWORD(dwSerialNr),
- LOWORD(dwSerialNr));
- else
- ConOutPrintf(szMsg,
- HIWORD(dwSerialNr),
- LOWORD(dwSerialNr));
-
+ DirPrintf(lpFlags, szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr));
return TRUE;
}
-
-/*
- * convert
- *
- * insert commas into a number
- *
- */
-#if 0
-static INT
-ConvertULong (ULONG num, LPTSTR des, INT len)
-{
- TCHAR temp[32];
- INT c = 0;
- INT n = 0;
-
- if (num == 0)
- {
- des[0] = _T('0');
- des[1] = _T('\0');
- n = 1;
- }
- else
- {
- temp[31] = 0;
- while (num > 0)
- {
- if (((c + 1) % (nNumberGroups + 1)) == 0)
- temp[30 - c++] = cThousandSeparator;
- temp[30 - c++] = (TCHAR)(num % 10) + _T('0');
- num /= 10;
- }
-
- for (n = 0; n <= c; n++)
- des[n] = temp[31 - c + n];
- }
-
- return n;
-}
-#endif
static VOID
DirPrintFileDateTime(TCHAR *lpDate,
@@ -685,8 +644,6 @@
{
FILETIME ft;
SYSTEMTIME dt;
- TCHAR szDate[30];
- TCHAR szTime[30];
WORD wYear;
/* Select the right time field */
@@ -717,20 +674,20 @@
{
case 0: /* mmddyy */
default:
- _stprintf (szDate, _T("%02d%c%02d%c%0*d"),
+ _stprintf(lpDate, _T("%02d%c%02d%c%0*d"),
dt.wMonth, cDateSeparator,
dt.wDay, cDateSeparator,
lpFlags->b4Digit?4:2, wYear);
break;
case 1: /* ddmmyy */
- _stprintf (szDate, _T("%02d%c%02d%c%0*d"),
+ _stprintf(lpDate, _T("%02d%c%02d%c%0*d"),
dt.wDay, cDateSeparator, dt.wMonth,
cDateSeparator,lpFlags->b4Digit?4:2, wYear);
break;
case 2: /* yymmdd */
- _stprintf (szDate, _T("%0*d%c%02d%c%02d"),
+ _stprintf(lpDate, _T("%0*d%c%02d%c%02d"),
lpFlags->b4Digit?4:2, wYear, cDateSeparator,
dt.wMonth, cDateSeparator, dt.wDay);
break;
@@ -740,20 +697,17 @@
{
case 0: /* 12 hour format */
default:
- _stprintf (szTime,_T("%02d%c%02u%c"),
+ _stprintf(lpTime,_T("%02d%c%02u%c"),
(dt.wHour == 0 ? 12 : (dt.wHour <= 12 ? dt.wHour : dt.wHour - 12)),
cTimeSeparator,
dt.wMinute, (dt.wHour <= 11 ? _T('a') : _T('p')));
break;
case 1: /* 24 hour format */
- _stprintf (szTime, _T("%02d%c%02u"),
+ _stprintf(lpTime, _T("%02d%c%02u"),
dt.wHour, cTimeSeparator, dt.wMinute);
break;
}
- /* Copy results */
- _tcscpy(lpDate, szDate);
- _tcscpy(lpTime, szTime);
}
@@ -771,7 +725,7 @@
lpFreeSpace->QuadPart = 0;
- hInstance = LoadLibrary(_T("KERNEL32"));
+ hInstance = GetModuleHandle(_T("KERNEL32"));
if (hInstance != NULL)
{
pGetFreeDiskSpaceEx = (PGETFREEDISKSPACEEX)GetProcAddress(hInstance,
@@ -785,7 +739,6 @@
if (pGetFreeDiskSpaceEx(lpRoot, lpFreeSpace, &TotalNumberOfBytes,
&TotalNumberOfFreeBytes) == TRUE)
return;
}
- FreeLibrary(hInstance);
}
GetDiskFreeSpace(lpRoot,
@@ -837,10 +790,7 @@
{
ConvertULargeInteger(u64Bytes, szBuffer, sizeof(szBuffer),
lpFlags->bTSeperator);
LoadString(CMD_ModuleHandle, STRING_DIR_HELP5, szMsg, RC_STRING_MAX_SIZE);
- if(lpFlags->bPause)
- ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer);
- else
- ConOutPrintf(szMsg,ulFiles, szBuffer);
+ DirPrintf(lpFlags, szMsg, ulFiles, szBuffer);
}
else
{
@@ -849,22 +799,16 @@
If we are not in bare format and if we have results! */
ConvertULargeInteger(u64Bytes, szBuffer, 20, lpFlags->bTSeperator);
LoadString(CMD_ModuleHandle, STRING_DIR_HELP8, szMsg, RC_STRING_MAX_SIZE);
- if(lpFlags->bPause)
- ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer);
- else
- ConOutPrintf(szMsg,ulFiles, szBuffer);
+ DirPrintf(lpFlags, szMsg, ulFiles, szBuffer);
}
/* Print total directories and freespace */
- if (!lpFlags->bRecursive || (TotalSummary && lpFlags->bRecursive))
+ if (!lpFlags->bRecursive || TotalSummary)
{
GetUserDiskFreeSpace(szPath, &uliFree);
ConvertULargeInteger(uliFree, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator);
LoadString(CMD_ModuleHandle, STRING_DIR_HELP6, (LPTSTR) szMsg, RC_STRING_MAX_SIZE);
- if(lpFlags->bPause)
- ConOutPrintfPaging(FALSE,szMsg,ulDirs, szBuffer);
- else
- ConOutPrintf(szMsg,ulDirs, szBuffer);
+ DirPrintf(lpFlags, szMsg, ulDirs, szBuffer);
}
return 0;
@@ -967,19 +911,7 @@
DirPrintFileDateTime(szDate, szTime, ptrFiles[i], lpFlags);
/* Print the line */
- if(lpFlags->bPause)
- {
- if (ConOutPrintfPaging(FALSE,_T("%10s %-6s %*s%s %s\n"),
- szDate,
- szTime,
- iSizeFormat,
- szSize,
- szShortName,
- ptrFiles[i]->cFileName) == 1)
- return ;
- }
- else
- ConOutPrintf(_T("%10s %-6s %*s%s %s\n"),
+ DirPrintf(lpFlags, _T("%10s %-6s %*s%s %s\n"),
szDate,
szTime,
iSizeFormat,
@@ -1065,17 +997,11 @@
else
_stprintf(szTempFname, _T("%s"), ptrFiles[temp]->cFileName);
- if(lpFlags->bPause)
- ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1 , szTempFname);
- else
- ConOutPrintf(_T("%-*s"), iLongestName + 1 , szTempFname);
+ DirPrintf(lpFlags, _T("%-*s"), iLongestName + 1, szTempFname);
}
/* Add a new line after the last item in the column */
- if(lpFlags->bPause)
- ConOutPrintfPaging(FALSE,_T("\n"));
- else
- ConOutPrintf(_T("\n"));
+ DirPrintf(lpFlags, _T("\n"));
}
}
@@ -1135,21 +1061,7 @@
DirPrintFileDateTime(szDate,szTime,ptrFiles[i],lpFlags);
/* Print the line */
- if(lpFlags->bPause)
- {
- if (ConOutPrintfPaging(FALSE,_T("%-8s %-3s %*s %s %s\n"),
- szName, /* The file's 8.3 name */
- szExt, /* The file's 8.3 extension */
- iSizeFormat, /* print format for size column */
- szSize, /* The size of file or "<DIR>" for dirs */
- szDate, /* The date of file/dir */
- szTime) == 1) /* The time of file/dir */
- {
- return ;
- }
- }
- else
- ConOutPrintf(_T("%-8s %-3s %*s %s %s\n"),
+ DirPrintf(lpFlags, _T("%-8s %-3s %*s %s %s\n"),
szName, /* The file's 8.3 name */
szExt, /* The file's 8.3 extension */
iSizeFormat, /* print format for size column */
@@ -1170,7 +1082,6 @@
LPTSTR lpCurPath, /* [IN] Full path of current directory */
LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */
{
- TCHAR szFullName[MAX_PATH];
DWORD i;
for (i = 0; i < dwCount && !bCtrlBreak; i++)
@@ -1184,30 +1095,12 @@
if (lpFlags->bRecursive)
{
/* at recursive mode we print full path of file */
- _tcscpy(szFullName, lpCurPath);
- _tcscat(szFullName, ptrFiles[i]->cFileName);
- if(lpFlags->bPause)
- {
- if (ConOutPrintfPaging(FALSE,_T("%s\n"), szFullName) == 1)
- {
- return ;
- }
- }
- else
- ConOutPrintf(_T("%s\n"), szFullName);
+ DirPrintf(lpFlags, _T("%s\\%s\n"), lpCurPath, ptrFiles[i]->cFileName);
}
else
{
/* if we are not in recursive mode we print the file names */
- if(lpFlags->bPause)
- {
- if (ConOutPrintfPaging(FALSE,_T("%s\n"),ptrFiles[i]->cFileName) == 1)
- {
- return ;
- }
- }
- else
- ConOutPrintf(_T("%s\n"),ptrFiles[i]->cFileName);
+ DirPrintf(lpFlags, _T("%s\n"), ptrFiles[i]->cFileName);
}
}
}
@@ -1226,35 +1119,11 @@
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szTemp[MAX_PATH]; /* A buffer to format the directory header */
- LPTSTR pszFilePart;
- SIZE_T len;
-
- /* We cut the trailing \ of the full path, unless the path is a drive */
- if (GetFullPathName(szCurPath, sizeof(szTemp) / sizeof(TCHAR), szTemp, &pszFilePart)
== 0)
- {
- pszFilePart = NULL;
- _tcscpy(szTemp, szCurPath);
- }
- else if (pszFilePart != NULL)
- *pszFilePart = _T('\0');
- else
- {
- len = _tcslen(szTemp);
- if (len > 0 && szTemp[len - 1] != _T('\\') &&
- GetFileAttributes(szTemp) == INVALID_FILE_ATTRIBUTES &&
- GetLastError() == ERROR_PATH_NOT_FOUND)
- {
- /* Special case for some fake dos devices, such as con:
- GetFullPathName doesn't return a pszFilePart pointer
- so we're going to fix this ourselves */
- while (len > 0 && szTemp[len - 1] != _T('\\'))
- szTemp[--len] = _T('\0');
- }
- }
-
- len = _tcslen(szTemp);
- if ((len != 3 || szTemp[len - 2] != _T(':')) && szTemp[len - 1] ==
_T('\\'))
- szTemp[len-1] = _T('\0');
+
+ /* Print trailing backslash for root directory of drive */
+ _tcscpy(szTemp, szCurPath);
+ if (_tcslen(szTemp) == 2 && szTemp[1] == _T(':'))
+ _tcscat(szTemp, _T("\\"));
/* Condition to print header:
We are not printing in bare format
@@ -1262,15 +1131,8 @@
if (!(lpFlags->bBareFormat ) && !((lpFlags->bRecursive) &&
(dwCount <= 0)))
{
LoadString(CMD_ModuleHandle, STRING_DIR_HELP7, szMsg, RC_STRING_MAX_SIZE);
- if(lpFlags->bPause)
- {
- if (ConOutPrintfPaging(FALSE,szMsg, szTemp) == 1)
- {
- return ;
- }
- }
- else
- ConOutPrintf(szMsg, szTemp);
+ if (DirPrintf(lpFlags, szMsg, szTemp))
+ return;
}
if (lpFlags->bBareFormat)
@@ -1400,10 +1262,7 @@
}
/* Translate the value of iComp to boolean */
- if (iComp > 0)
- return TRUE;
- else
- return FALSE;
+ return iComp > 0;
}
/*
@@ -1491,18 +1350,17 @@
if (GetFullPathName(szPath, sizeof(szFullPath) / sizeof(TCHAR), szFullPath,
&pszFilePart) == 0)
{
_tcscpy (szFullPath, szPath);
- if (szFullPath[_tcslen(szFullPath) - 1] != _T('\\'))
- _tcscat (szFullPath, _T("\\"));
pszFilePart = NULL;
}
/* If no wildcard or file was specified and this is a directory, then
display all files in it */
- wfdFileInfo.dwFileAttributes = GetFileAttributes(szFullPath);
- if (wfdFileInfo.dwFileAttributes != INVALID_FILE_ATTRIBUTES &&
- (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
- {
- _tcscat(szFullPath, _T("\\*"));
+ if (pszFilePart == NULL || IsExistingDirectory(szFullPath))
+ {
+ pszFilePart = &szFullPath[_tcslen(szFullPath)];
+ if (pszFilePart[-1] != _T('\\'))
+ *pszFilePart++ = _T('\\');
+ _tcscpy(pszFilePart, _T("*"));
}
/* Prepare the linked list, first node is allocated */
@@ -1520,9 +1378,9 @@
/* Collect the results for the current folder */
hSearch = FindFirstFile(szFullPath, &wfdFileInfo);
- do
- {
- if (hSearch != INVALID_HANDLE_VALUE)
+ if (hSearch != INVALID_HANDLE_VALUE)
+ {
+ do
{
/*If retrieved FileName has extension,and szPath doesnt have extension then JUMP the
retrieved FileName*/
if(_tcschr(wfdFileInfo.cFileName,_T('.'))&&(fPoint==TRUE))
@@ -1543,6 +1401,7 @@
ptrStartNode = ptrNextNode;
dwCount --;
}
+ FindClose(hSearch);
return 1;
}
@@ -1582,9 +1441,9 @@
}
}
}
- }
- } while(FindNextFile(hSearch, &wfdFileInfo));
- FindClose(hSearch);
+ } while (FindNextFile(hSearch, &wfdFileInfo));
+ FindClose(hSearch);
+ }
/* Terminate list */
ptrNextNode->ptrNext = NULL;
@@ -1622,7 +1481,9 @@
QsortFiles(ptrFileArray, 0, dwCount-1, lpFlags);
/* Print Data */
+ pszFilePart[-1] = _T('\0'); /* truncate to directory name only */
DirPrintFiles(ptrFileArray, dwCount, szFullPath, lpFlags);
+ pszFilePart[-1] = _T('\\');
if (lpFlags->bRecursive)
{
@@ -1660,20 +1521,13 @@
if (lpFlags->bRecursive)
{
/* The new search is involving any *.* file */
- if (pszFilePart != NULL)
- {
- memcpy(szSubPath, szFullPath, (pszFilePart - szFullPath) * sizeof(TCHAR));
- szSubPath[pszFilePart - szFullPath] = _T('\0');
- }
- else
- _tcscpy(szSubPath, szFullPath);
-
- _tcscat(szSubPath, _T("*.*"));
+ memcpy(szSubPath, szFullPath, (pszFilePart - szFullPath) * sizeof(TCHAR));
+ _tcscpy(&szSubPath[pszFilePart - szFullPath], _T("*.*"));
hRecSearch = FindFirstFile (szSubPath, &wfdFileInfo);
- do
- {
- if (hRecSearch != INVALID_HANDLE_VALUE)
+ if (hRecSearch != INVALID_HANDLE_VALUE)
+ {
+ do
{
/* We search for directories other than "." and ".." */
if ((_tcsicmp(wfdFileInfo.cFileName, _T(".")) != 0) &&
@@ -1681,27 +1535,20 @@
(wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
/* Concat the path and the directory to do recursive */
- if (pszFilePart != NULL)
- {
- memcpy(szSubPath, szFullPath, (pszFilePart - szFullPath) * sizeof(TCHAR));
- szSubPath[pszFilePart - szFullPath] = _T('\0');
- }
- else
- _tcscpy(szSubPath, szFullPath);
-
- _tcscat(szSubPath, wfdFileInfo.cFileName);
+ memcpy(szSubPath, szFullPath, (pszFilePart - szFullPath) * sizeof(TCHAR));
+ _tcscpy(&szSubPath[pszFilePart - szFullPath], wfdFileInfo.cFileName);
_tcscat(szSubPath, _T("\\"));
- if (pszFilePart != NULL)
- _tcscat(szSubPath, pszFilePart);
+ _tcscat(szSubPath, pszFilePart);
/* We do the same for the folder */
if (DirList(szSubPath, lpFlags) != 0)
{
+ FindClose(hRecSearch);
return 1;
}
}
- }
- }while(FindNextFile(hRecSearch,&wfdFileInfo));
+ } while(FindNextFile(hRecSearch, &wfdFileInfo));
+ }
FindClose(hRecSearch);
}
@@ -1776,6 +1623,10 @@
prev_volume[0] = _T('\0');
+ /* Reset paging state */
+ if (stFlags.bPause)
+ ConOutPrintfPaging(TRUE, _T(""));
+
for(loop = 0; loop < (UINT)entries; loop++)
{
if (CheckCtrlBreak(BREAK_INPUT))