www.pudn.com > win32code2.rar > cmdlineargs.h


#ifndef CMDLINEARGS_H 
#define CMDLINEARGS_H 
 
#include  
#include  
 
class CmdLineArgs : public std::vector 
{ 
public: 
    CmdLineArgs () 
    { 
        // Save local copy of the command line string, because 
        // ParseCmdLine() modifies this string while parsing it. 
        PSZ cmdline = GetCommandLine(); 
        m_cmdline = new char [strlen (cmdline) + 1]; 
        if (m_cmdline) 
        { 
            strcpy (m_cmdline, cmdline); 
            ParseCmdLine();  
        } 
    } 
    ~CmdLineArgs() 
    { 
        delete m_cmdline; 
    } 
 
private: 
    PSZ m_cmdline; // the command line string 
 
    //////////////////////////////////////////////////////////////////////////////// 
    // Parse m_cmdline into individual tokens, which are delimited by spaces. If a 
    // token begins with a quote, then that token is terminated by the next quote 
    // followed immediately by a space or terminator.  This allows tokens to contain 
    // spaces. 
    // This input string:     This "is" a ""test"" "of the parsing" alg"o"rithm. 
    // Produces these tokens: This, is, a, "test", of the parsing, alg"o"rithm 
    //////////////////////////////////////////////////////////////////////////////// 
    void ParseCmdLine () 
    { 
        enum { TERM  = '\0', 
               QUOTE = '\"' }; 
 
        bool bInQuotes = false; 
        PSZ pargs = m_cmdline; 
 
        while (*pargs) 
        { 
            while (isspace (*pargs))        // skip leading whitespace 
                pargs++; 
 
            bInQuotes = (*pargs == QUOTE);  // see if this token is quoted 
 
            if (bInQuotes)                  // skip leading quote 
                pargs++;  
 
            push_back (pargs);              // store position of current token 
 
            // Find next token. 
            // NOTE: Args are normally terminated by whitespace, unless the 
            // arg is quoted.  That's why we handle the two cases separately, 
            // even though they are very similar. 
            if (bInQuotes) 
            { 
                // find next quote followed by a space or terminator 
                while (*pargs &&  
                      !(*pargs == QUOTE && (isspace (pargs[1]) || pargs[1] == TERM))) 
                    pargs++; 
                if (*pargs) 
                { 
                    *pargs = TERM;  // terminate token 
                    if (pargs[1])   // if quoted token not followed by a terminator 
                        pargs += 2; // advance to next token 
                } 
            } 
            else 
            { 
                // skip to next non-whitespace character 
                while (*pargs && !isspace (*pargs))  
                    pargs++; 
                if (*pargs && isspace (*pargs)) // end of token 
                { 
                   *pargs = TERM;    // terminate token 
                    pargs++;         // advance to next token or terminator 
                } 
            } 
        } // while (*pargs) 
    } // ParseCmdLine() 
}; // class CmdLineArgs 
 
 
#endif // CMDLINEARGS_H