fix redraw at top-left of map
[Tsunagari.git] / src / cmd.cpp
blob958ddccad6bd5681bd675626b0796e4f97cb05e7
1 /******************************
2 ** Tsunagari Tile Engine **
3 ** cmd.cpp **
4 ** Copyright 2011 OmegaSDG **
5 ******************************/
7 #include <stdio.h>
9 #include "cmd.h"
10 #include "common.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 size_t optmaxlen = 0;
96 size_t argmaxlen = 0;
98 usageSize(&optmaxlen, &argmaxlen);
99 usagePrintShort();
100 usagePrintLong(optmaxlen, argmaxlen);
103 void CommandLineOptions::usageSize(size_t* optmaxlen, size_t* argmaxlen)
105 unsigned int opt;
107 for (opt = 0; opt < OptionsList.size(); opt++) {
108 if (OptionsList[opt]->shortopt.size() +
109 OptionsList[opt]->longopt.size() > *optmaxlen)
110 *optmaxlen = OptionsList[opt]->shortopt.size() +
111 OptionsList[opt]->longopt.size() + 1;
112 if (OptionsList[opt]->argument.size() > *argmaxlen)
113 *argmaxlen = OptionsList[opt]->argument.size();
117 void CommandLineOptions::usagePrintShort()
119 unsigned int opt;
120 size_t usagecurrlen = 0;
122 fprintf(stderr, "Usage: %s", argv[0]);
123 usagecurrlen += (std::string("Usage: ") + argv[0]).size();
125 for (opt = 0; opt < OptionsList.size(); opt++) {
126 usagecurrlen += 3;
127 if (!OptionsList[opt]->shortopt.empty())
128 usagecurrlen += OptionsList[opt]->shortopt.size() + 1;
129 usagecurrlen += OptionsList[opt]->longopt.size();
130 if (!OptionsList[opt]->argument.empty())
131 usagecurrlen += OptionsList[opt]->argument.size() + 1;
133 if (usagecurrlen > 60) {
134 fprintf(stderr, "\n ");
135 usagecurrlen = 0;
138 fprintf(stderr, " [");
139 if (!OptionsList[opt]->shortopt.empty())
140 fprintf(stderr, "%s|",
141 OptionsList[opt]->shortopt.c_str());
142 fprintf(stderr, "%s", OptionsList[opt]->longopt.c_str());
143 if (!OptionsList[opt]->argument.empty())
144 fprintf(stderr, " %s]",
145 OptionsList[opt]->argument.c_str());
146 else
147 fprintf(stderr, "]");
151 void CommandLineOptions::usagePrintLong(size_t optmaxlen, size_t argmaxlen)
153 unsigned int opt;
155 fprintf(stderr, "\n\nAvailable options:\n");
157 for (opt = 0; opt < OptionsList.size(); opt++) {
158 if (!OptionsList[opt]->shortopt.empty())
159 fprintf(stderr, " %s,",
160 OptionsList[opt]->shortopt.c_str());
161 else
162 fprintf(stderr, " ");
163 fprintf(stderr,
164 (std::string("%-")+itostr(optmaxlen+1)+"s").c_str(),
165 OptionsList[opt]->longopt.c_str());
166 if (!OptionsList[opt]->argument.empty())
167 fprintf(stderr,
168 (std::string("%-")+itostr(argmaxlen+3)+"s").c_str(),
169 OptionsList[opt]->argument.c_str());
170 else
171 fprintf(stderr,
172 (std::string("%-")+itostr(argmaxlen+3)+"c").c_str(),
173 ' ');
174 fprintf(stderr, "%s\n",
175 OptionsList[opt]->description.c_str());
178 fprintf(stderr, "\n\n");