//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1994 - 1995. // // File: cmdparse.cxx // // Contents: Member functions implementation of CCmdLineParserA class // // Classes: // // Functions: // // History: 11-08-94 SriniG Created // 11-22-96 Ericne Removed CString dependancy, // made template, improved efficiency // //---------------------------------------------------------------------------- #include "cmdparse.hxx" // This is a type-safe way of dealing with template character constants const char CCmdLineParserTemplate::m_slash = '/'; const char CCmdLineParserTemplate::m_hyphen = '-'; const WCHAR CCmdLineParserTemplate::m_slash = L'/'; const WCHAR CCmdLineParserTemplate::m_hyphen = L'-'; // // Helper functions // inline int StringCompare( const char * szFirst, const char * szSecond ) { return strcmp( szFirst, szSecond ); } inline int StringCompare( const wchar_t * szFirst, const wchar_t * szSecond ) { return wcscmp( szFirst, szSecond ); } //+--------------------------------------------------------------------------- // // Function: CCmdLineParserTemplate // // Synopsis: Constructor // // Arguments: [argc] -- The "main" parameter // [argv] -- The "main" parameter // // Returns: // // History: 11-08-94 SriniG Created // 11-22-96 Ericne Removed CString dependancy, // made template, improved efficiency // // Notes: // //---------------------------------------------------------------------------- template CCmdLineParserTemplate::CCmdLineParserTemplate( int & argc, T **& argv ) : m_argc( argc ), m_argv( argv ) { int iLoop = 0; // argc and argv are modifiable. Change all switches that start with // m_hyphen to m_slash. for( iLoop = 1; iLoop < m_argc; iLoop++ ) { if( m_hyphen == *argv[ iLoop ] ) *argv[ iLoop ] = m_slash; } } template CCmdLineParserTemplate::~CCmdLineParserTemplate() { } //+--------------------------------------------------------------------------- // // Function: IsFlagExist // // Synopsis: Checks for the existence of a flag in the cmd line // // Arguments: [szFlag] -- flag string, don't include m_slash or m_hyphen // // Returns: True if the flag exists, False if not // // History: 11-08-94 SriniG Created // 11-22-96 Ericne Removed CString dependancy, // made template, improved efficiency // // Notes: // //---------------------------------------------------------------------------- template BOOL CCmdLineParserTemplate::IsFlagExist( const T * szFlag ) { for( int iLoop = 1; iLoop < m_argc; iLoop++ ) { if( ( m_slash == *m_argv[ iLoop ] || m_hyphen == *m_argv[ iLoop ] ) && ( 0 == StringCompare( m_argv[ iLoop ] + 1, szFlag ) ) ) { // Keep track of which params have been referenced *m_argv[ iLoop ] = m_hyphen; return( TRUE ); } } return( FALSE ); } //+--------------------------------------------------------------------------- // // Function: EnumerateFlag // // Synopsis: Enumerates the parameters associated with a given flag // // Arguments: [szFlag] -- The flag // [pParams] -- pointer to the array of parameter strings // [cCount] -- Number of parameters associated with the flag. // // Returns: True if flag exists, False if the flag doesn't // // History: 11-08-94 SriniG Created // 11-22-96 Ericne Removed CString dependancy, // made template, improved efficiency // // Notes: // //---------------------------------------------------------------------------- template BOOL CCmdLineParserTemplate::EnumerateFlag( const T * szFlag, T **& pParams, int & nCount ) { // Initialize the reference parameters pParams = NULL; nCount = 0; // Make sure we have a valid string if( NULL == szFlag ) return( FALSE ); // Make pParams to point to the first parameter. cCount should give // the number of parameters that follow flag for( int iLoop = 1; iLoop < m_argc; iLoop++ ) { if( ( m_slash == *m_argv[ iLoop ] || m_hyphen == *m_argv[ iLoop ] ) && ( 0 == StringCompare( m_argv[ iLoop ] + 1, szFlag ) ) ) { // Keep track of which params have been referenced *m_argv[ iLoop ] = m_hyphen; // Count the number of parameters following the flag for( int jLoop = iLoop + 1; jLoop < m_argc; jLoop++ ) { // BUGBUG can't have a negative number as a parameter. if( m_slash == *m_argv[ jLoop ] || m_hyphen == *m_argv[ jLoop ] ) break; else ++nCount; } // If we found parameters, set pParams to point to the first if( nCount > 0 ) { pParams = m_argv + iLoop + 1; } // No need to look further return( TRUE ); } } return( FALSE ); } //+--------------------------------------------------------------------------- // // Member: ::GetNextFlag // // Synopsis: Can get the flags in order. Can be used after attempting // to retrieve all accepted parameters -- any parameters left over // are not recognized // // Arguments: [szFlag] -- reference to a character pointer // // Returns: FALSE if there are no more flags to return // // History: 11-22-96 Ericne Created // // Notes: // //---------------------------------------------------------------------------- template BOOL CCmdLineParserTemplate::GetNextFlag( T *& szFlag ) { // Initialize the reference parameter szFlag = NULL; // Find the first unreferenced parameter and return a pointer to it for( int iLoop = 1; iLoop < m_argc; iLoop++ ) { if( m_slash == *m_argv[ iLoop ] ) { *m_argv[ iLoop ] = m_hyphen; szFlag = m_argv[ iLoop ] + 1; return( TRUE ); } } return( FALSE ); } //::GetNextFlag