Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

243 lines
7.0 KiB

//+-------------------------------------------------------------------
// Microsoft OLE
// Copyright (C) Microsoft Corporation, 1994-1995.
//
// File: arghelp.cxx
//
// Contents: Helper functions for manipulating & parsing command
// line arguments (both Windows and Command Line styles).
//
// Classes: None
//
// History: 22-Nov-94 DeanE Created
//---------------------------------------------------------------------
#include <dfheader.hxx>
#pragma hdrstop
#ifdef _MAC
//
// On the mac, default to win95, since
// we're not going to do any tests that
// we don't do on win95
//
DWORD g_dwOperatingSystem = OS_WIN95 ;
#else //!_MAC
DWORD g_dwOperatingSystem = OS_NT ;
#endif //_MAC
#define CCH_MAX_MODULE_NAME 250
//+---------------------------------------------------------------------
// Macro: FindNextToken - looks for next non-space char and
// writes NILs over spaces it finds
// FindNextSpace - looks for next space char
// FindNextNil - looks for next NIl before tail, does a
// continue instead of a break at tail to
// allow loop to increment
// FindNextNonNil - looks for next non-NIl before tail
//
// Synopsis: Helper macros for walking strings. Walks pointer to
// desired point in string.
//
// History: 28-Mar-94 DarrylA Created.
//----------------------------------------------------------------------
#define FindNextToken(ptr) \
while('\0' != *(ptr)&&' '==(*(ptr))) { *(ptr) = '\0'; ++(ptr); } \
if('\0' == *(ptr)) break
#define FindNextSpace(ptr) \
while('\0' != *(ptr)&&' '!=(*(ptr))) ++(ptr); \
if('\0' == *(ptr)) break
#define FindNextNil(ptr, tail) \
while('\0' != *(ptr)&&(ptr)<(tail)) ++(ptr); \
if((tail) == (ptr)) continue
#define FindNextNonNil(ptr, tail) \
while('\0' == *(ptr)&&(ptr)<(tail)) ++(ptr); \
if((tail) == (ptr)) break
//+-------------------------------------------------------------------
// Function: CmdlineToArgs
//
// Synopsis: Turns the Windows-style Command Line passed into argc/
// argv-style arguments.
//
// Arguments: [paszCmdline] - Windows-style ANSI command line.
// [pargc] - Pointer to resulting argc.
// [pargv] - Pointer to resulting argv.
//
// Returns: S_OK if no problems, error code otherwise.
//
// History: 05-Apr-94 DarrylA Created.
// 22-Nov-94 DeanE Stolen from Marshal tests
//--------------------------------------------------------------------
HRESULT CmdlineToArgs(
LPSTR paszCmdline,
PINT pargc,
CHAR ***pargv)
{
// DH_ASSERT(!IsBadWritePtr(pargc, sizeof(PINT)));
// DH_ASSERT(!IsBadWritePtr(pargv, sizeof(CHAR ***)));
int cArgs = 1;
int cchTemp = 0;
ULONG cchCmdline = 0;
CHAR **ppArgs = NULL;
PCHAR ptail = NULL;
LPSTR aszCmdline = NULL;
PCHAR ptr = NULL;
// Copy command line string into an ANSI buffer
cchCmdline = (ULONG) strlen(paszCmdline);
aszCmdline = new(NullOnFail) CHAR[cchCmdline+1];
if (aszCmdline == NULL)
{
return(E_OUTOFMEMORY);
}
strcpy(aszCmdline, paszCmdline);
cchTemp = (int) cchCmdline;
ptr = aszCmdline;
// The command line is now in the ansi buffer. Now we need to traverse
// it and figure out the number of parameters. While we walk over
// spaces, we will replace them with '\0' so that afterwards, we just
// dup each string into the new array.
//
while('\0' != *ptr)
{
FindNextToken(ptr);
++cArgs;
FindNextSpace(ptr);
}
ptail = ptr; // now points to NIL at end of string
ptr = aszCmdline;
// Now we need to allocate space for the arguments
ppArgs = new(NullOnFail) LPSTR[cArgs];
if (NULL == ppArgs)
{
delete aszCmdline;
return(E_OUTOFMEMORY);
}
BOOL fNewFail = FALSE;
int i = 0; // init to zero in case the strdup fails
// Initialize ppArgs[0] with the module name
ppArgs[0] = new(NullOnFail) CHAR[CCH_MAX_MODULE_NAME];
if (NULL == ppArgs[0])
{
delete aszCmdline;
delete ppArgs;
return(E_OUTOFMEMORY);
}
char szTempModule[CCH_MAX_MODULE_NAME];
short ret;
cchTemp = (int) GetModuleFileNameA(NULL, szTempModule, CCH_MAX_MODULE_NAME);
ret = GetFileTitleA(szTempModule, ppArgs[0], CCH_MAX_MODULE_NAME);
if (ret != 0)
{
cchTemp = 0;
}
else
{
cchTemp = strlen(ppArgs[0]);
}
if ((cchTemp == 0) || (cchTemp == CCH_MAX_MODULE_NAME))
{
delete aszCmdline;
delete ppArgs[0];
delete ppArgs;
return(E_FAIL);
}
// Now traverse the command line, plucking arguments and copying them
// into the ppArgs array
//
for(i=1; i<cArgs; i++)
{
FindNextNonNil(ptr, ptail);
ppArgs[i] = new(NullOnFail) CHAR[strlen(ptr)+1];
if (NULL == ppArgs[i])
{
fNewFail = TRUE;
break;
}
else
{
strcpy(ppArgs[i], ptr);
}
FindNextNil(ptr, ptail);
}
// Check for errors - clean up if we got one
if (i != cArgs || TRUE == fNewFail)
{
for (int j=0; j<i; j++)
{
delete ppArgs[j];
}
delete aszCmdline;
delete ppArgs;
return(E_OUTOFMEMORY);
}
// Set up return parameters
*pargc = cArgs;
*pargv = ppArgs;
// Clean up and exit
delete aszCmdline;
return(S_OK);
}
//+---------------------------------------------------------------------------
//
// Function: GetOSFromCmdline
//
// Synopsis: The operating system can be specified by putting /OS:<os>
// on the command line. Check for it.
//
// Parameters: [pCmdLine] -- The command object for /OS
//
// Returns: OS_NT -- Running on NT
// OS_WIN95 -- Running on Win95
// OS_WIN95_DCOM -- Running on Win95 + DCOM
//
// History: 06-Jun-96 AlexE Created
//
//----------------------------------------------------------------------------
DWORD GetOSFromCmdline(CBaseCmdlineObj *pCmdLine)
{
//
// If there is an OS specifier on the command line, set
// the global variable g_dwOperatingSystem to the right
// thing -- it is set to NT by default during compile time.
//
if (pCmdLine->IsFound())
{
if (0 == _olestricmp(pCmdLine->GetValue(), OS_STRING_WIN95))
{
g_dwOperatingSystem = OS_WIN95 ;
}
else if (0 == _olestricmp(pCmdLine->GetValue(), OS_STRING_WIN95DCOM))
{
g_dwOperatingSystem = OS_WIN95_DCOM ;
}
}
return g_dwOperatingSystem ;
}