windows-nt/Source/XPSP1/NT/sdktools/sysparse/cmdline.cpp
2020-09-26 16:20:57 +08:00

326 lines
8.6 KiB
C++

#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "cmdline.h"
kCommandLine::kCommandLine()
{
pArgListBegin = (ARGUMENTS *)malloc(sizeof(ARGUMENTS));
if(pArgListBegin) {
pArgListBegin->pNext = NULL;
pArgListBegin->szArg = NULL;
pArgListBegin->sArgumentNumber = 0;
pArgListBegin->pPrevious = NULL;
pArgListCurrent = pArgListBegin;
sNumberOfDrives = 0;
szCommandLine = (char *)malloc((lstrlen(GetCommandLine()) + sizeof(TCHAR)));
if(szCommandLine) {
lstrcpy(szCommandLine, (char *)GetCommandLine());
if (sNumberOfArgs = GetNumberOfArguments()) {
WORD wArgNums = 0;
wArgNums = FillArgumentList();
}
}
}
}
kCommandLine::~kCommandLine()
{
if(szCommandLine)
free (szCommandLine);
Rewind();
if(pArgListCurrent->szArg)
free (pArgListCurrent->szArg);
while (GetNext())
{
if(pArgListCurrent->pPrevious)
free (pArgListCurrent->pPrevious);
if(pArgListCurrent->szArg)
free (pArgListCurrent->szArg);
}
if(pArgListCurrent)
free (pArgListCurrent);
}
void kCommandLine::DebugOutf(char *szFormat, ...)
{
char szBuffer[MAX_PATH * 4];
va_list va;
va_start (va,szFormat);
vsprintf (szBuffer, szFormat, va);
va_end (va);
#ifdef DEBUG
OutputDebugString (szBuffer);
#endif
}
WORD kCommandLine::GetNumberOfArguments()
{
WORD wSpaceCounter = 0;
for (WORD wCounter = 4; szCommandLine[wCounter] !=NULL; wCounter++)
if ( ((szCommandLine[wCounter]=='/') || (szCommandLine[wCounter]=='-')) && szCommandLine[wCounter+1]!=NULL)
wSpaceCounter++;
return wSpaceCounter;
}
WORD kCommandLine::FillArgumentList()
{
WORD wCounter;
WORD TKCounter;
WORD wArgNumCounter = 0;
char szHolder[MAX_PATH * 2];
szHolder[0] = NULL;
wCounter = 4;
for (Rewind(); szCommandLine[wCounter] != NULL; wCounter++)
{
if(szCommandLine[wCounter] == '/')
{
{
WORD TempwCounter;
WORD TempHolderCounter;
TCHAR TempHolder[MAX_PATH];
TempHolderCounter = 0;
TempwCounter=wCounter;
while ( (szCommandLine[TempwCounter] != ' ') && (szCommandLine[TempwCounter] != NULL) )
{
TempHolder[TempHolderCounter] = szCommandLine[TempwCounter];
TempHolderCounter++;
TempwCounter++;
}
TempHolder[TempHolderCounter] = '\0';
if (' ' == TempHolder[strlen(TempHolder) - 1])
{
TempHolder[strlen(TempHolder)-1] = '\0';
}
Add(TempHolder);
wCounter = TempwCounter;
}
while ( (szCommandLine[wCounter] != NULL) && (szCommandLine[wCounter] != ' ') )
{
wCounter++;
}
wCounter++;
wArgNumCounter++;
WORD wTK=0;
for (TKCounter = 0; TKCounter < 256; TKCounter++)
{
szHolder[TKCounter] = '\0';
}
while ( (szCommandLine[wCounter] != '/') && (szCommandLine[wCounter] != NULL) )
{
szHolder[wTK] = szCommandLine[wCounter];
wCounter++;
wTK++;
}
if (szHolder[wTK] == ' ')
{
szHolder[wTK-1] = NULL;
}
if (' ' == szHolder[strlen(szHolder) - 1])
{
szHolder[strlen(szHolder)-1] = '\0';
}
Add(szHolder);
wCounter--;
}
}//end of for loop
#ifdef _DEBUG
DebugOutf("FillArgumentList=%d\r\n",wArgNumCounter);
#endif
return wArgNumCounter;
}
void kCommandLine::Rewind()
{
pArgListCurrent=pArgListBegin;
}
void kCommandLine::Add(char *szArgpass)
{
//MessageBox(GetFocus(), szArgpass, "Add", MB_OK);
FindLast();
if (pArgListCurrent != pArgListBegin)
{
pArgListCurrent->pNext = (ARGUMENTS *)malloc(sizeof ARGUMENTS);
if(!pArgListCurrent->pNext)
return;
pArgListCurrent->pNext->pPrevious = pArgListCurrent;
pArgListCurrent = pArgListCurrent->pNext;
pArgListCurrent->szArg = (char *)malloc(strlen(szArgpass) + 1);
if(!pArgListCurrent->szArg)
return;
strcpy(pArgListCurrent->szArg, szArgpass);
pArgListCurrent->pNext = NULL;
pArgListCurrent->sArgumentNumber = pArgListCurrent->pPrevious->sArgumentNumber + 1;
}
else if (pArgListCurrent==pArgListBegin && !pArgListCurrent->szArg)
{
pArgListCurrent->szArg = (char *)malloc(strlen(szArgpass)+1);
if(!pArgListCurrent->szArg)
return;
strcpy(pArgListCurrent->szArg, szArgpass);
pArgListCurrent->pNext = NULL;
pArgListCurrent->sArgumentNumber = 1;
pArgListCurrent->pPrevious = NULL;
}
else if (pArgListCurrent == pArgListBegin && pArgListCurrent->szArg)
{
pArgListCurrent->pNext = (ARGUMENTS *)malloc(sizeof ARGUMENTS);
if(!pArgListCurrent->pNext)
return;
pArgListCurrent->pNext->pPrevious = pArgListCurrent;
pArgListCurrent = pArgListCurrent->pNext;
pArgListCurrent->szArg = (char *)malloc(strlen(szArgpass)+1);
if(!pArgListCurrent->szArg)
return;
strcpy(pArgListCurrent->szArg, szArgpass);
pArgListCurrent->pNext = NULL;
pArgListCurrent->sArgumentNumber = 2;
}
#ifdef _DEBUG
DebugOutf("Arg[%d]=|%s|",pArgListCurrent->sArgumentNumber, pArgListCurrent->szArg);
DebugOutf(" ArgPass=|%s|\r\n",szArgpass);
#endif
}
void kCommandLine::FindLast()
{
for(Rewind(); pArgListCurrent->pNext; pArgListCurrent=pArgListCurrent->pNext);
}
WORD kCommandLine::GetArgumentNumber(TCHAR *Argument, BOOL CaseInsensitive)
{
TCHAR Temp[MAX_PATH * 4];
if (!Argument)
return 0;
Rewind();
if (CaseInsensitive)
{
_strlwr (Argument);
}
while (pArgListCurrent)
{
if (pArgListCurrent->szArg)
{
lstrcpy(Temp, pArgListCurrent->szArg);
_strlwr(Temp);
if (!lstrcmp(Temp, Argument))
{
return pArgListCurrent->sArgumentNumber;
}
}
pArgListCurrent=pArgListCurrent->pNext;
}
return 0;
}
char *kCommandLine::GetNextArgument()
{
if (pArgListCurrent->pNext)
{
pArgListCurrent = pArgListCurrent->pNext;
return pArgListCurrent->szArg;
}
else
return NULL;
}
char *kCommandLine::GetSwitchValue(char *szArgpass, BOOL bCaseInsensitive)
{
Rewind();
if (bCaseInsensitive)
_strlwr(szArgpass);
if (pArgListCurrent->szArg)
{
if (!strcmp(szArgpass, pArgListCurrent->szArg) && pArgListCurrent->pNext)
{
return pArgListCurrent->pNext->szArg;
}
while (GetNext())
{
if (!strcmp(szArgpass, pArgListCurrent->szArg) && pArgListCurrent->pNext)
return pArgListCurrent->pNext->szArg;
}
}
//fallthrough
return NULL;
}
char *kCommandLine::GetArgumentByNumber(WORD wNumber)
{
Rewind();
if (pArgListCurrent->szArg)
{
if (pArgListCurrent->sArgumentNumber == wNumber)
{
return pArgListCurrent->szArg;
}
while (GetNext())
{
if (pArgListCurrent->sArgumentNumber == wNumber)
{
return pArgListCurrent->szArg;
}
}
}
//fallthrough
return NULL;
}
BOOL kCommandLine::IsSpecified(char *szArgpass, BOOL bCaseInsensitive)
{
char szTemp[MAX_PATH * 4];
Rewind();
if (bCaseInsensitive)
_strlwr(szArgpass);
if (pArgListCurrent->szArg)
{
strcpy(szTemp, pArgListCurrent->szArg);
if (bCaseInsensitive)
_strlwr(szTemp);
//MessageBox(GetFocus(), szArgpass, szTemp, MB_OK);
if (!strcmp(szArgpass, szTemp))
return TRUE;
while (GetNext())
{
strcpy(szTemp, pArgListCurrent->szArg);
if (bCaseInsensitive)
_strlwr(szTemp);
//MessageBox(GetFocus(), szArgpass, szTemp, MB_OK);
if (!strcmp(szArgpass, szTemp))
return TRUE;
}
}
//fallthrough
return FALSE;
}
ARGUMENTS *kCommandLine::GetNext()
{
if (pArgListCurrent->pNext)
pArgListCurrent = pArgListCurrent->pNext;
else
return NULL;
return pArgListCurrent;
}
ARGUMENTS *kCommandLine::GetPrevious()
{
if (pArgListCurrent->pPrevious)
pArgListCurrent = pArgListCurrent->pPrevious;
else
return NULL;
return pArgListCurrent;
}