#include <iostream>
#include <getopt.h>

using namespace std;

void usage(const char* progname)
{

	cout << "Usage: " << progname << " [-n <name>] [-m]"
			<< endl;
	cout <<endl;
	cout << " -n | --name :\tYour name..."<<endl;
	cout << " -m | --moo :\tCow mode." << endl;
	exit(1);
}


class MyArgs {
	private:
	char name[100];
	bool moo;

	public:
	MyArgs()
	{
		moo = false;
		strcpy(name, "");
	}

	void SetName(char* newname)
	{
		strncpy(name, newname, sizeof(name));
	}

	char* GetName()
	{
		return name;
	}

	void SetMoo(bool enable)
	{
		moo = enable;
	}

	bool GetMoo()
	{
		return moo;
	}
};

MyArgs ParseArgs(int argc, char **argv)
{
	MyArgs *a = new MyArgs();


	int c;
	while (1) {
		int optidx;
		static struct option long_options[] = {
			/* name, has_arg, flag, val */
			{ "name", 1, 0, 'n' },
			{ "moo", 0, 0, 'm' },
			{ 0, 0, 0, 0 }
		};

		c = getopt_long(argc, argv, "mn:", long_options, &optidx);
		if (c<0)
			break;
		
		switch (c) {
		case 'n':
			a->SetName(optarg);
		break;
		case 'm':
			a->SetMoo(true);
		break;
		case '?':
			usage(argv[0]);
		break;
		default:
			cout << "Unknown option" << endl;
		}
	}
	
	return *a;
}

int main(int argc, char **argv)
{
	MyArgs args = ParseArgs(argc, argv);

	if (args.GetMoo()) {
		cout << "MOOOO... ";
	} else {
		cout << "Hello ";
	}
	cout << args.GetName() << endl;

	return 0;
}



