//+------------------------------------------------------------------- // 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 #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 // 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 ; }