103 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "base/application.h"
 | 
						|
 | 
						|
#include <boost/lexical_cast.hpp>
 | 
						|
#include <libgen.h>
 | 
						|
#include <linux/limits.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
using namespace base;
 | 
						|
using namespace boost;
 | 
						|
using namespace std;
 | 
						|
 | 
						|
//----------------------------------------------------------------
 | 
						|
 | 
						|
command::command(string const &name)
 | 
						|
	: name_(name) {
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
command::die(string const &msg)
 | 
						|
{
 | 
						|
	cerr << msg << endl;
 | 
						|
	usage(cerr);
 | 
						|
	exit(1);
 | 
						|
}
 | 
						|
 | 
						|
uint64_t
 | 
						|
command::parse_uint64(string const &str, string const &desc)
 | 
						|
{
 | 
						|
	try {
 | 
						|
		// FIXME: check trailing garbage is handled
 | 
						|
		return lexical_cast<uint64_t>(str);
 | 
						|
 | 
						|
	} catch (...) {
 | 
						|
		ostringstream out;
 | 
						|
		out << "Couldn't parse " << desc << ": '" << str << "'";
 | 
						|
		die(out.str());
 | 
						|
	}
 | 
						|
 | 
						|
	return 0; // never get here
 | 
						|
}
 | 
						|
 | 
						|
//----------------------------------------------------------------
 | 
						|
 | 
						|
int
 | 
						|
application::run(int argc, char **argv)
 | 
						|
{
 | 
						|
	string cmd = get_basename(argv[0]);
 | 
						|
 | 
						|
	if (cmd == string("pdata_tools")) {
 | 
						|
		argc--;
 | 
						|
		argv++;
 | 
						|
 | 
						|
		if (!argc) {
 | 
						|
			usage();
 | 
						|
			return 1;
 | 
						|
		}
 | 
						|
 | 
						|
		cmd = argv[0];
 | 
						|
	}
 | 
						|
 | 
						|
	std::list<command::ptr>::const_iterator it;
 | 
						|
	for (it = cmds_.begin(); it != cmds_.end(); ++it) {
 | 
						|
		if (cmd == (*it)->get_name()) {
 | 
						|
			try {
 | 
						|
				return (*it)->run(argc, argv);
 | 
						|
			} catch (std::exception const &e) {
 | 
						|
				cerr << e.what() << "\n";
 | 
						|
				return 1;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	std::cerr << "Unknown command '" << cmd << "'\n";
 | 
						|
	usage();
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
application::usage()
 | 
						|
{
 | 
						|
	std::cerr << "Usage: <command> <args>\n"
 | 
						|
		  << "commands:\n";
 | 
						|
 | 
						|
	std::list<command::ptr>::const_iterator it;
 | 
						|
	for (it = cmds_.begin(); it != cmds_.end(); ++it) {
 | 
						|
		std::cerr << "  " << (*it)->get_name() << "\n";
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
std::string
 | 
						|
application::get_basename(std::string const &path) const
 | 
						|
{
 | 
						|
	char buffer[PATH_MAX + 1];
 | 
						|
 | 
						|
	memset(buffer, 0, sizeof(buffer));
 | 
						|
	strncpy(buffer, path.c_str(), PATH_MAX);
 | 
						|
 | 
						|
	return ::basename(buffer);
 | 
						|
}
 | 
						|
 | 
						|
//----------------------------------------------------------------
 |