remove +x from source
[Tsunagari.git] / src / cmd.cpp
blob2a8f9f32c08f536aa71cf92a06053a00a48d773f
1 /*********************************
2 ** Tsunagari Tile Engine **
3 ** cmd.cpp **
4 ** Copyright 2011-2012 OmegaSDG **
5 *********************************/
7 #include <stdio.h>
9 #include "cmd.h"
10 #include "string.h"
12 CommandLineOptions::CommandLineOptions(int argc, char** argv) :
13 argc(argc), argv(argv)
17 CommandLineOptions::~CommandLineOptions()
19 unsigned int opt;
21 for (opt = 0; opt < OptionsList.size(); opt++)
22 delete OptionsList[opt];
25 void CommandLineOptions::insert(std::string shortopt, std::string longopt,
26 std::string argument, std::string description)
28 Option* opt = new Option;
29 opt->shortopt = shortopt;
30 opt->longopt = longopt;
31 opt->argument = argument;
32 opt->description = description;
33 opt->present = false;
34 opt->value = "";
35 OptionsList.push_back(opt);
38 bool CommandLineOptions::parse()
40 int arg;
41 unsigned int opt;
42 bool found;
44 for (arg = 1; arg < argc; arg++) {
45 found = false;
46 for (opt = 0; opt < OptionsList.size(); opt++) {
47 if (!OptionsList[opt]->shortopt.compare(argv[arg]) ||
48 !OptionsList[opt]->longopt.compare(argv[arg])) {
49 found = true; /* We found the option. */
50 OptionsList[opt]->present = true;
51 if (!OptionsList[opt]->argument.empty()) {
52 if (arg + 1 < argc) {
53 OptionsList[opt]->value =
54 argv[arg+1];
55 arg += 1;
57 else
58 return false;
60 break;
63 if (!found) /* We didn't find the option. */
64 return false;
66 return true;
69 bool CommandLineOptions::check(std::string longopt)
71 unsigned int search;
73 for (search = 0; search < OptionsList.size(); search++) {
74 if (!OptionsList[search]->longopt.compare(longopt))
75 return OptionsList[search]->present;
78 return false;
81 std::string CommandLineOptions::get(std::string longopt)
83 unsigned int search;
85 for (search = 0; search < OptionsList.size(); search++) {
86 if (!OptionsList[search]->longopt.compare(longopt))
87 return OptionsList[search]->value;
90 return "";
93 void CommandLineOptions::usage()
95 int optmaxlen = 0;
96 int argmaxlen = 0;
98 usageSize(&optmaxlen, &argmaxlen);
99 usagePrintShort();
100 usagePrintLong(optmaxlen, argmaxlen);
103 void CommandLineOptions::usageSize(int* optmaxlen, int* argmaxlen)
105 unsigned int opt;
107 for (opt = 0; opt < OptionsList.size(); opt++) {
108 if (OptionsList[opt]->shortopt.size() +
109 OptionsList[opt]->longopt.size() > (unsigned)*optmaxlen)
110 *optmaxlen = (int)OptionsList[opt]->shortopt.size() +
111 (int)OptionsList[opt]->longopt.size() + 1;
112 if ((int)OptionsList[opt]->argument.size() > *argmaxlen)
113 *argmaxlen = (int)OptionsList[opt]->argument.size();
117 void CommandLineOptions::usagePrintShort()
119 fprintf(stderr, "Usage: %s [OPTIONS]", argv[0]);
122 void CommandLineOptions::usagePrintLong(int optmaxlen, int argmaxlen)
124 unsigned int opt;
126 fprintf(stderr, "\n\nAvailable options:\n");
128 for (opt = 0; opt < OptionsList.size(); opt++) {
129 if (!OptionsList[opt]->shortopt.empty())
130 fprintf(stderr, " %s,",
131 OptionsList[opt]->shortopt.c_str());
132 else
133 fprintf(stderr, " ");
134 fprintf(stderr,
135 (std::string("%-")+itostr(optmaxlen+1)+"s").c_str(),
136 OptionsList[opt]->longopt.c_str());
137 if (!OptionsList[opt]->argument.empty())
138 fprintf(stderr,
139 (std::string("%-")+itostr(argmaxlen+3)+"s").c_str(),
140 OptionsList[opt]->argument.c_str());
141 else
142 fprintf(stderr,
143 (std::string("%-")+itostr(argmaxlen+3)+"c").c_str(),
144 ' ');
145 fprintf(stderr, "%s\n",
146 OptionsList[opt]->description.c_str());
149 fprintf(stderr, "\n\n");