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
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 ;
|
|
}
|