CCmdLine - a class for parsing command line (with or without MFC)

CCmdLine is a simple way to parse a command line into switches and arguments. Ex :
    MyApp.exe -sw1 arg1 arg2 -sw2 arg3 -sw3 -sw4

When using CCmdLine, "-sw1", "-sw2", "-sw3" and "-sw4" are switches and "arg1", "arg2" and "arg3" are arguments.

Parsing command lines with the standard C string functions (strlen, strcpy, etc.) or even with the CString operators is a nightmare. But, CCmdLine makes it effortless.

CCmdLine was written for use with console apps, but can be easily used in any application which requires command-line parsing.

CCmdLine uses STL for its collection classes, so it works in MFC and non-MFC apps. If you are using this in an MFC app, the switches and arguments will be returned as CStrings. If you are using this in a non-MFC app, they will be returned as STL 'string's.


Example : Assume the application we're writing uses a command line that has two required switches and two optional switches. The app should abort if the required switches are not present and continue with default values if the optional switches are not present.
    Sample command line :
      MyApp.exe -p1 text1 text2 -p2 "this is a big argument" -opt1 -55 -opt2
    
    Switches -p1 and -p2 are required.
    p1 has two arguments and p2 has one.

    Switches -opt1 and -opt2 are optional.
    opt1 requires a numeric argument.
    opt2 has no arguments.

    Also, assume that the app displays a 'help' screen if the '-h' switch is present on the command line.
Here's how you can use CCmdLine to handle this :

// if this is an MFC app, uncomment this line
// #include "stdafx.h"

#include "CmdLine.h"

void main(int argc, char **argv)
{
  // our cmd line parser object
  CCmdLine cmdLine;

  // parse the command line
  // use __argc and __argv, in MFC apps
  if (cmdLine.SplitLine(argc, argv) < 1)
  {
     // no switches were given on the command line, abort
     ASSERT(0);
     exit(-1);
  }

  // test for the 'help' case
  if (cmdLine.HasSwitch("-h"))
  {
     show_help();
     exit(0);
  }

  // StringType is CString when using MFC, else STL's 'string'
  StringType p1_1, p1_2, p2_1;

  // get the required arguments
  try
  {  
     // if any of these GetArgument calls fail, 
     // we'll end up in the catch() block

     // get the first -p1 argument
     p1_1 = cmdLine.GetArgument("-p1", 0);

     // get the second -p1 argument
     p1_2 = cmdLine.GetArgument("-p1", 1);

     // get the first -p2 argument
     p2_1 = cmdLine.GetArgument("-p2", 0);

  }
  catch (...)
  {
     // one of the required arguments was missing, abort
     ASSERT(0);
     exit(-1);
  }

  // get the optional parameters

  // GetSafeArgument does not throw exceptions, and allows for 
  // the use of a default value, in case the switch is not found
  // convert to an int, default to '100'
  int iOpt1Val =    atoi( cmdLine.GetSafeArgument( "-opt1", 0, 100 ) );

  // since opt2 has no arguments, just test for the presence of
  // the '-opt2' switch
  bool bOptSwitch2 =   cmdLine.HasSwitch("-opt2");

  .... and so on....

}

Downloads

Download source - 5 Kb



Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • What does it take to win? According to Jack Welch, winning in business is great because when companies win, people thrive and grow. However, it goes without saying that you have to win the right way -- cleanly and by the rules. Even the most talented businessperson with the best intentions will get nowhere unless he or she knows how to win in today's complex business world. Read this book summary to learn not only the strategies of winning, but also the value that those strategies bring to your professional …

  • Do you spend a lot of time thinking about your enemies? Attacker attribution - figuring out who's out to get you - is one of the most important things an organization can do to protect itself.  Because you have no hope of defending yourself if you don't understand who the attackers are. Good news? Every organization isn't targeted by all the attackers. Bad news? No one can identify your potential attackers as well as you. Read this graphics-rich threat summary for 2014 to determine who might be your next …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date