This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

| Command Line Parser Submitted by

Hi, I'm Albert Sandberg (thec) and been visiting this site for quite some time and thought it was time for me to contribute to the community.
I've been writing an Command Line Parser which takes a line such as: demo.exe /fullscreen /x:320 /y:240 /time:52.32
And parses the line that you simply can pick out which parameters are passed to the program. It also allowes wierd lines such as:
demo.exe / fullscreen /x: 523
To be parsed even if that's not to good syntax :-) I'm only using stl and windows.h so you shouldn't have any problems with it... All sourcecode may be downloaded, modified and used until the fingers burned. I know for instance that I don't support "demo.exe -a -x" but that you should be able to fix under a minute, I'll let it be up to you to fix :-) Note that the sourcecode may state a different licence agreement, but this piece of description override whatever it says in the sourcecode! Happy programming!
Albert "thec" Sandberg

Currently browsing [commandline.zip] (1,819 bytes) - [commandlineparser.h] - (1,343 bytes)

    #ifndef COMMAND_LINE_PARSER
    #define COMMAND_LINE_PARSER

    /*
      =============================================================================
      = Helper Library. (c) Outbreak 2001
      =============================================================================
    	@ Responsible : Thec
    	@ Brief       : Command Line Parser, parses lines like:
    	                "demo.exe /fullscreen /x:320 /y:240 /time:50.00 /bpp:32"
      =============================================================================
    */

    #include <string>
    #include <vector>

    namespace Helper {

    	// Parses a command line like "demo.exe /fullscreen /x:320 /y:240 /time:52.00
    	class CommandLineParser {

    	private:

    		// Entity data
    		struct EntityData {
    			std::string name;
    			std::string value;
    		};

    		// Entity list.
    		std::vector<EntityData> entity;

    		// Trim and sets entity.
    		void addEntity(const std::string& input);

    		// Trimmer
    		std::string trim(const std::string& input);

    	public:

    		// Creates the register of strings
    		CommandLineParser();

    		// Check if command is entered, good for detecting "demo.exe /fullscreen"
    		const bool isEntity(const std::string& name);

    		// Get entity with entered name, for instance, "demo.exe /x:320 /y:240 /bpp:32"
    		const std::string getEntity(const std::string& name);
    	};
    }

    #endif

Currently browsing [commandline.zip] (1,819 bytes) - [commandlineparser.cpp] - (3,408 bytes)

    #include "commandlineparser.h"
    #include <windows.h>
    #include <helper/core/debug/debug.h>

    //렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁

    Helper::CommandLineParser::CommandLineParser() {

    	// Get command line arguments
    	std::string args = GetCommandLine();
    	Debug::log("CommandLineParser::CommandLineParser", "Command line found: %s", args.c_str());

    	int start=-1;

    	// Loop through argument line and search for entities.
    	for (int i=0; i<args.length(); i++) {

    		// Found new entity.
    		if (args[i] == '/') {

    			// Only if not first time.
    			if ((start != -1) && (start != (i-1))) {

    				// Adds entity to the list and trims the value.
    				addEntity(args.substr(start+1, i-start-1));
    			}

    			// Store position for next '/'
    			start = i;
    		}
    	}

    	// Add remaining string
    	if ((start!=-1) && (start < i-1)) {
    		addEntity(args.substr(start+1, i-start-1));
    	}
    }

    //렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁

    void Helper::CommandLineParser::addEntity(const std::string& input) {

    	// Set defaults
    	std::string name=input;
    	std::string value="";

    	// Loop through and look for ":" to make a value.
    	for (int i=1; i<input.length(); i++) {

    		// Found seperator
    		if ((input[i] == ':') || (input[i] == '=')) {

    			// Set name
    			name  = input.substr(0,i);

    			// Set value, if any
    			if (i+1 < input.length()) {
    				value = input.substr(i+1, input.length()-i-1);
    			}

    			break;
    		}
    	}

    	// Trim values
    	name = trim(name);
    	value = trim(value);

    	// Only add if name is valid!
    	if (name.length() != 0) {

    		// Debug
    		Debug::log("CommandLineParser::addEntity()", "Entity added, name: %s, value: %s", name.c_str(), value.c_str());

    		// Set up entity structure
    		EntityData ed;
    		ed.name  = name;
    		ed.value = value;

    		// Add entity
    		entity.push_back(ed);
    	}
    }

    //렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁

    std::string Helper::CommandLineParser::trim(const std::string& input) {

    	// If string is empty, there is nothing to look for.
    	if (input.length()==0) return "";

    	// Set up temporary
    	std::string final=input;

    	// Remove spaces at beginning
    	int i=0;
    	while ((i<input.length()) && (input[i]==' ')) {
    		i++;
    	}

    	// String full of spaces, return nothing.
    	if (i >= input.length()) return "";

    	if (i>0) {
    		final = input.substr(i, input.length()-i);
    	}

    	// Remove spaces at end
    	i=final.length()-1;
    	while ((i>=0) && (final[i]==' ')) {
    		i--;
    	}

    	final = final.substr(0, i+1);

    	// Return the new string
    	return final;
    }

    //렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁

    const bool Helper::CommandLineParser::isEntity(const std::string& name) {

    	// Loop through entities
    	for (int i=0; i<entity.size(); i++) {

    		// If match, return true
    		if (entity[i].name == name) return true;
    	}

    	return false;
    }

    //렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁

    const std::string Helper::CommandLineParser::getEntity(const std::string& name) {

    	// Loop through entities
    	for (int i=0; i<entity.size(); i++) {

    		// If match, return true
    		if (entity[i].name == name) return entity[i].value;
    	}

    	return "";
    }

    //렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁렁

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.