1 /******************************
2 ** Tsunagari Tile Engine **
4 ** Copyright 2011 OmegaSDG **
5 ******************************/
12 CommandLineOptions::CommandLineOptions(int argc
, char** argv
) :
13 argc(argc
), argv(argv
)
17 CommandLineOptions::~CommandLineOptions()
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
;
35 OptionsList
.push_back(opt
);
38 bool CommandLineOptions::parse()
44 for (arg
= 1; arg
< argc
; arg
++) {
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()) {
53 OptionsList
[opt
]->value
=
63 if (!found
) /* We didn't find the option. */
69 bool CommandLineOptions::check(std::string longopt
)
73 for (search
= 0; search
< OptionsList
.size(); search
++) {
74 if (!OptionsList
[search
]->longopt
.compare(longopt
))
75 return OptionsList
[search
]->present
;
81 std::string
CommandLineOptions::get(std::string longopt
)
85 for (search
= 0; search
< OptionsList
.size(); search
++) {
86 if (!OptionsList
[search
]->longopt
.compare(longopt
))
87 return OptionsList
[search
]->value
;
93 void CommandLineOptions::usage()
98 usageSize(&optmaxlen
, &argmaxlen
);
100 usagePrintLong(optmaxlen
, argmaxlen
);
103 void CommandLineOptions::usageSize(size_t* optmaxlen
, size_t* argmaxlen
)
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()
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
++) {
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 ");
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());
147 fprintf(stderr
, "]");
151 void CommandLineOptions::usagePrintLong(size_t optmaxlen
, size_t argmaxlen
)
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());
162 fprintf(stderr
, " ");
164 (std::string("%-")+itostr(optmaxlen
+1)+"s").c_str(),
165 OptionsList
[opt
]->longopt
.c_str());
166 if (!OptionsList
[opt
]->argument
.empty())
168 (std::string("%-")+itostr(argmaxlen
+3)+"s").c_str(),
169 OptionsList
[opt
]->argument
.c_str());
172 (std::string("%-")+itostr(argmaxlen
+3)+"c").c_str(),
174 fprintf(stderr
, "%s\n",
175 OptionsList
[opt
]->description
.c_str());
178 fprintf(stderr
, "\n\n");