mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 00:16:40 +00:00
[ROSAPPS] Remove 'stats' utility
This commit is contained in:
parent
d432436fed
commit
9e1199713e
3 changed files with 0 additions and 484 deletions
|
@ -5,5 +5,4 @@ add_subdirectory(objdir)
|
||||||
add_subdirectory(partinfo)
|
add_subdirectory(partinfo)
|
||||||
add_subdirectory(ps)
|
add_subdirectory(ps)
|
||||||
add_subdirectory(rosperf)
|
add_subdirectory(rosperf)
|
||||||
add_subdirectory(stats)
|
|
||||||
add_subdirectory(tickcount)
|
add_subdirectory(tickcount)
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
|
|
||||||
add_executable(stats stats.c)
|
|
||||||
set_module_type(stats win32cui UNICODE)
|
|
||||||
add_importlibs(stats ntdll msvcrt kernel32)
|
|
||||||
add_cd_file(TARGET stats DESTINATION reactos/system32 FOR all)
|
|
|
@ -1,478 +0,0 @@
|
||||||
/*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS project statistics
|
|
||||||
* FILE: stats.c
|
|
||||||
* PURPOSE: Main program file
|
|
||||||
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
||||||
* REVISIONS:
|
|
||||||
* CSH 01/01-2002 Created
|
|
||||||
*/
|
|
||||||
#include <windows.h>
|
|
||||||
#include <tchar.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct _EXTENSION_INFO
|
|
||||||
{
|
|
||||||
struct _EXTENSION_INFO * Next;
|
|
||||||
struct _FILE_INFO * StatInfoList;
|
|
||||||
TCHAR ExtName[16];
|
|
||||||
TCHAR ExpandedExtName[128];
|
|
||||||
DWORD nExtensions;
|
|
||||||
TCHAR Description[256];
|
|
||||||
DWORD FileCount;
|
|
||||||
DWORD LineCount;
|
|
||||||
DWORD EmptyLines;
|
|
||||||
} EXTENSION_INFO, *PEXTENSION_INFO;
|
|
||||||
|
|
||||||
typedef struct _FILE_INFO
|
|
||||||
{
|
|
||||||
struct _FILE_INFO * Next;
|
|
||||||
struct _FILE_INFO * StatInfoListNext;
|
|
||||||
PEXTENSION_INFO ExtInfo;
|
|
||||||
TCHAR FileName[MAX_PATH];
|
|
||||||
DWORD LineCount;
|
|
||||||
DWORD EmptyLines;
|
|
||||||
DWORD FunctionCount;
|
|
||||||
} FILE_INFO, *PFILE_INFO;
|
|
||||||
|
|
||||||
HANDLE FileHandle;
|
|
||||||
PEXTENSION_INFO ExtInfoList;
|
|
||||||
PFILE_INFO StatInfoList;
|
|
||||||
BOOLEAN SkipEmptyLines, BeSilent;
|
|
||||||
|
|
||||||
#define MAX_OPTIONS 2
|
|
||||||
TCHAR *Options[MAX_OPTIONS];
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
Initialize(VOID)
|
|
||||||
{
|
|
||||||
ExtInfoList = NULL;
|
|
||||||
StatInfoList = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
Cleanup(VOID)
|
|
||||||
{
|
|
||||||
PEXTENSION_INFO ExtInfo;
|
|
||||||
PEXTENSION_INFO NextExtInfo;
|
|
||||||
|
|
||||||
ExtInfo = ExtInfoList;
|
|
||||||
while (ExtInfo != NULL)
|
|
||||||
{
|
|
||||||
NextExtInfo = ExtInfo->Next;
|
|
||||||
HeapFree (GetProcessHeap(), 0, ExtInfo);
|
|
||||||
ExtInfo = NextExtInfo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PEXTENSION_INFO
|
|
||||||
AddExtension(LPTSTR ExtName,
|
|
||||||
LPTSTR Description)
|
|
||||||
{
|
|
||||||
PEXTENSION_INFO ExtInfo;
|
|
||||||
PEXTENSION_INFO Info;
|
|
||||||
TCHAR *t;
|
|
||||||
DWORD ln;
|
|
||||||
|
|
||||||
ExtInfo = (PEXTENSION_INFO) HeapAlloc (GetProcessHeap(), 0, sizeof (EXTENSION_INFO));
|
|
||||||
if (!ExtInfo)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for(t = ExtName; *t != _T('\0'); t += _tcslen(t) + 1);
|
|
||||||
ln = (DWORD_PTR)t - (DWORD_PTR)ExtName;
|
|
||||||
|
|
||||||
ZeroMemory (ExtInfo, sizeof (EXTENSION_INFO));
|
|
||||||
memcpy (ExtInfo->ExtName, ExtName, ln);
|
|
||||||
_tcscpy (ExtInfo->Description, Description);
|
|
||||||
|
|
||||||
for(t = ExtInfo->ExtName; *t != _T('\0'); t += _tcslen(t) + 1)
|
|
||||||
{
|
|
||||||
if(ExtInfo->nExtensions++ != 0)
|
|
||||||
_tcscat (ExtInfo->ExpandedExtName, _T(";"));
|
|
||||||
_tcscat (ExtInfo->ExpandedExtName, _T("*."));
|
|
||||||
_tcscat (ExtInfo->ExpandedExtName, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ExtInfoList)
|
|
||||||
{
|
|
||||||
Info = ExtInfoList;
|
|
||||||
while (Info->Next != NULL)
|
|
||||||
{
|
|
||||||
Info = Info->Next;
|
|
||||||
}
|
|
||||||
Info->Next = ExtInfo;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ExtInfoList = ExtInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExtInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PFILE_INFO
|
|
||||||
AddFile(LPTSTR FileName,
|
|
||||||
PEXTENSION_INFO ExtInfo)
|
|
||||||
{
|
|
||||||
PFILE_INFO StatInfo;
|
|
||||||
PFILE_INFO Info;
|
|
||||||
|
|
||||||
StatInfo = (PFILE_INFO) HeapAlloc (GetProcessHeap(), 0, sizeof (FILE_INFO));
|
|
||||||
if (!StatInfo)
|
|
||||||
return NULL;
|
|
||||||
ZeroMemory (StatInfo, sizeof (FILE_INFO));
|
|
||||||
_tcscpy (StatInfo->FileName, FileName);
|
|
||||||
StatInfo->ExtInfo = ExtInfo;
|
|
||||||
|
|
||||||
if (ExtInfo->StatInfoList)
|
|
||||||
{
|
|
||||||
Info = ExtInfo->StatInfoList;
|
|
||||||
while (Info->StatInfoListNext != NULL)
|
|
||||||
{
|
|
||||||
Info = Info->StatInfoListNext;
|
|
||||||
}
|
|
||||||
Info->StatInfoListNext = StatInfo;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ExtInfo->StatInfoList = StatInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StatInfoList)
|
|
||||||
{
|
|
||||||
Info = StatInfoList;
|
|
||||||
while (Info->Next != NULL)
|
|
||||||
{
|
|
||||||
Info = Info->Next;
|
|
||||||
}
|
|
||||||
Info->Next = StatInfo;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StatInfoList = StatInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
return StatInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
CleanupAfterFile(VOID)
|
|
||||||
{
|
|
||||||
if(FileHandle != INVALID_HANDLE_VALUE)
|
|
||||||
CloseHandle (FileHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
LoadFile(LPTSTR FileName)
|
|
||||||
{
|
|
||||||
LONG FileSize;
|
|
||||||
|
|
||||||
FileHandle = CreateFile (FileName, // Create this file
|
|
||||||
GENERIC_READ, // Open for reading
|
|
||||||
0, // No sharing
|
|
||||||
NULL, // No security
|
|
||||||
OPEN_EXISTING, // Open the file
|
|
||||||
FILE_ATTRIBUTE_NORMAL, // Normal file
|
|
||||||
NULL); // No attribute template
|
|
||||||
if (FileHandle == INVALID_HANDLE_VALUE)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
FileSize = GetFileSize (FileHandle, NULL);
|
|
||||||
if (FileSize <= 0)
|
|
||||||
{
|
|
||||||
CloseHandle (FileHandle);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
ReadLines(PFILE_INFO StatInfo)
|
|
||||||
{
|
|
||||||
DWORD ReadBytes, LineLen;
|
|
||||||
static char FileBuffer[1024];
|
|
||||||
char LastChar = '\0';
|
|
||||||
char *Current;
|
|
||||||
|
|
||||||
LineLen = 0;
|
|
||||||
while(ReadFile (FileHandle, FileBuffer, sizeof(FileBuffer), &ReadBytes, NULL) && ReadBytes >= sizeof(char))
|
|
||||||
{
|
|
||||||
for(Current = FileBuffer; ReadBytes > 0; ReadBytes -= sizeof(char), Current++)
|
|
||||||
{
|
|
||||||
if(*Current == '\n' && LastChar == '\r')
|
|
||||||
{
|
|
||||||
LastChar = '\0';
|
|
||||||
if(!SkipEmptyLines || (LineLen > 0))
|
|
||||||
StatInfo->LineCount++;
|
|
||||||
if(LineLen == 0)
|
|
||||||
StatInfo->EmptyLines++;
|
|
||||||
LineLen = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
LastChar = *Current;
|
|
||||||
if(SkipEmptyLines && (*Current == ' ' || *Current == '\t'))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(*Current != '\r')
|
|
||||||
LineLen++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StatInfo->LineCount += (LineLen > 0);
|
|
||||||
StatInfo->EmptyLines += ((LastChar != '\0') && (LineLen == 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
PrintStatistics(VOID)
|
|
||||||
{
|
|
||||||
PEXTENSION_INFO Info;
|
|
||||||
DWORD TotalFileCount;
|
|
||||||
DWORD TotalLineCount;
|
|
||||||
DWORD TotalAvgLF;
|
|
||||||
DWORD TotalEmptyLines;
|
|
||||||
|
|
||||||
TotalFileCount = 0;
|
|
||||||
TotalLineCount = 0;
|
|
||||||
TotalEmptyLines = 0;
|
|
||||||
Info = ExtInfoList;
|
|
||||||
|
|
||||||
for (Info = ExtInfoList; Info != NULL; Info = Info->Next)
|
|
||||||
{
|
|
||||||
TotalFileCount += Info->FileCount;
|
|
||||||
TotalLineCount += Info->LineCount;
|
|
||||||
TotalEmptyLines += Info->EmptyLines;
|
|
||||||
}
|
|
||||||
|
|
||||||
TotalAvgLF = (TotalFileCount ? TotalLineCount / TotalFileCount : 0);
|
|
||||||
|
|
||||||
for (Info = ExtInfoList; Info != NULL; Info = Info->Next)
|
|
||||||
{
|
|
||||||
DWORD AvgLF;
|
|
||||||
|
|
||||||
if (Info->FileCount != 0)
|
|
||||||
{
|
|
||||||
AvgLF = (Info->FileCount ? Info->LineCount / Info->FileCount : 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AvgLF = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_tprintf (_T("\n"));
|
|
||||||
_tprintf (_T("File extension%c : %s\n"), ((Info->nExtensions > 1) ? _T('s') : _T(' ')), Info->ExpandedExtName);
|
|
||||||
_tprintf (_T("File ext. description : %s\n"), Info->Description);
|
|
||||||
_tprintf (_T("Number of files : %lu\n"), Info->FileCount);
|
|
||||||
_tprintf (_T("Number of lines : %lu\n"), Info->LineCount);
|
|
||||||
if(SkipEmptyLines)
|
|
||||||
_tprintf (_T("Number of empty lines : %lu\n"), Info->EmptyLines);
|
|
||||||
_tprintf (_T("Proportion of lines : %.2f %%\n"), (float)(TotalLineCount ? (((float)Info->LineCount * 100) / (float)TotalLineCount) : 0));
|
|
||||||
_tprintf (_T("Average no. lines/file : %lu\n"), AvgLF);
|
|
||||||
}
|
|
||||||
|
|
||||||
_tprintf (_T("\n"));
|
|
||||||
_tprintf (_T("Total number of files : %lu\n"), TotalFileCount);
|
|
||||||
_tprintf (_T("Total number of lines : %lu\n"), TotalLineCount);
|
|
||||||
if(SkipEmptyLines)
|
|
||||||
_tprintf (_T("Total number of empty lines : %lu\n"), TotalEmptyLines);
|
|
||||||
_tprintf (_T("Average no. lines/file : %lu\n"), TotalAvgLF);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
ProcessFiles(LPTSTR Path)
|
|
||||||
{
|
|
||||||
WIN32_FIND_DATA FindFile;
|
|
||||||
PEXTENSION_INFO Info;
|
|
||||||
TCHAR SearchPath[256];
|
|
||||||
TCHAR FileName[256];
|
|
||||||
TCHAR *Ext;
|
|
||||||
HANDLE SearchHandle;
|
|
||||||
BOOL More;
|
|
||||||
|
|
||||||
Info = ExtInfoList;
|
|
||||||
while (Info != NULL)
|
|
||||||
{
|
|
||||||
Ext = Info->ExtName;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
ZeroMemory (&FindFile, sizeof (FindFile));
|
|
||||||
_tcscpy (SearchPath, Path);
|
|
||||||
_tcscat (SearchPath, _T("\\*."));
|
|
||||||
_tcscat (SearchPath, Ext);
|
|
||||||
_tcscpy (FindFile.cFileName, SearchPath);
|
|
||||||
SearchHandle = FindFirstFile (SearchPath, &FindFile);
|
|
||||||
if (SearchHandle != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
More = TRUE;
|
|
||||||
while (More)
|
|
||||||
{
|
|
||||||
if (!(FindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
|
||||||
{
|
|
||||||
_tcscpy (FileName, Path);
|
|
||||||
_tcscat (FileName, _T("\\"));
|
|
||||||
_tcscat (FileName, FindFile.cFileName);
|
|
||||||
|
|
||||||
if (LoadFile (FileName))
|
|
||||||
{
|
|
||||||
PFILE_INFO StatInfo;
|
|
||||||
|
|
||||||
StatInfo = AddFile (FindFile.cFileName, Info);
|
|
||||||
if (!StatInfo)
|
|
||||||
{
|
|
||||||
_tprintf (_T("Not enough free memory.\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadLines (StatInfo);
|
|
||||||
|
|
||||||
Info->FileCount++;
|
|
||||||
Info->LineCount += StatInfo->LineCount;
|
|
||||||
Info->EmptyLines += StatInfo->EmptyLines;
|
|
||||||
|
|
||||||
CleanupAfterFile();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
More = FindNextFile (SearchHandle, &FindFile);
|
|
||||||
}
|
|
||||||
FindClose (SearchHandle);
|
|
||||||
}
|
|
||||||
Ext += _tcslen(Ext) + 1;
|
|
||||||
} while(*Ext != _T('\0'));
|
|
||||||
Info = Info->Next;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
ProcessDirectories(LPTSTR Path)
|
|
||||||
{
|
|
||||||
WIN32_FIND_DATA FindFile;
|
|
||||||
TCHAR SearchPath[MAX_PATH];
|
|
||||||
HANDLE SearchHandle;
|
|
||||||
BOOL More;
|
|
||||||
|
|
||||||
if(!BeSilent)
|
|
||||||
{
|
|
||||||
_tprintf (_T("Processing %s ...\n"), Path);
|
|
||||||
}
|
|
||||||
|
|
||||||
_tcscpy (SearchPath, Path);
|
|
||||||
_tcscat (SearchPath, _T("\\*.*"));
|
|
||||||
|
|
||||||
SearchHandle = FindFirstFileEx (SearchPath,
|
|
||||||
FindExInfoStandard,
|
|
||||||
&FindFile,
|
|
||||||
FindExSearchLimitToDirectories,
|
|
||||||
NULL,
|
|
||||||
0);
|
|
||||||
if (SearchHandle != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
More = TRUE;
|
|
||||||
while (More)
|
|
||||||
{
|
|
||||||
if ((FindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
||||||
&& (_tcscmp (FindFile.cFileName, _T(".")) != 0)
|
|
||||||
&& (_tcscmp (FindFile.cFileName, _T("..")) != 0)
|
|
||||||
&& (_tcscmp (FindFile.cFileName, _T("CVS")) != 0)
|
|
||||||
&& (_tcscmp (FindFile.cFileName, _T(".svn")) != 0))
|
|
||||||
{
|
|
||||||
_tcscpy (SearchPath, Path);
|
|
||||||
_tcscat (SearchPath, _T("\\"));
|
|
||||||
_tcscat (SearchPath, FindFile.cFileName);
|
|
||||||
if (!ProcessDirectories (SearchPath))
|
|
||||||
return FALSE;
|
|
||||||
if (!ProcessFiles (SearchPath))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
More = FindNextFile (SearchHandle, &FindFile);
|
|
||||||
}
|
|
||||||
FindClose (SearchHandle);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
Execute(LPTSTR Path)
|
|
||||||
{
|
|
||||||
if (!ExtInfoList)
|
|
||||||
{
|
|
||||||
_tprintf (_T("No extensions specified.\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ProcessDirectories (Path))
|
|
||||||
{
|
|
||||||
_tprintf (_T("Failed to process directories.\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ProcessFiles (Path))
|
|
||||||
{
|
|
||||||
_tprintf (_T("Failed to process files.\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PrintStatistics();
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
IsOptionSet(TCHAR *Option)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i = 0; i < MAX_OPTIONS; i++)
|
|
||||||
{
|
|
||||||
if(!Options[i])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(!_tcscmp(Options[i], Option))
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int _tmain(int argc, _TCHAR * argv[])
|
|
||||||
{
|
|
||||||
int a;
|
|
||||||
|
|
||||||
_tprintf (_T("ReactOS Project Statistics\n"));
|
|
||||||
_tprintf (_T("==========================\n\n"));
|
|
||||||
|
|
||||||
if (argc < 2 || argc > 2 + MAX_OPTIONS)
|
|
||||||
{
|
|
||||||
_tprintf(_T("Usage: stats [-e] [-s] directory\n"));
|
|
||||||
_tprintf(_T(" -e: don't count empty lines\n"));
|
|
||||||
_tprintf(_T(" -s: be silent, don't print directories while processing\n"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Initialize();
|
|
||||||
AddExtension (_T("c\0\0"), _T("Ansi C Source files"));
|
|
||||||
AddExtension (_T("cpp\0cxx\0\0"), _T("C++ Source files"));
|
|
||||||
AddExtension (_T("h\0\0"), _T("Header files"));
|
|
||||||
|
|
||||||
for(a = 1; a < argc - 1; a++)
|
|
||||||
{
|
|
||||||
Options[a - 1] = argv[a];
|
|
||||||
}
|
|
||||||
|
|
||||||
SkipEmptyLines = IsOptionSet(_T("-e"));
|
|
||||||
BeSilent = IsOptionSet(_T("-s"));
|
|
||||||
|
|
||||||
Execute (argv[argc - 1]);
|
|
||||||
Cleanup();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue