172{
173 using namespace std;
175
176 typedef JContainer< vector<JTransmitter> > container_type;
177
178 string inputFile;
179 string outputFile;
180 vector<JModifier> mod;
181 vector<JTransmitter> add;
182 set<int> keep;
183 set<int> rm;
184 bool squash;
185 int debug;
186
187 try {
188
189 JParser<> zap("Auxiliary program to modify transmitter configuration.");
190
191 zap['f'] = make_field(inputFile, "transmitter input file") = "";
192 zap['o'] = make_field(outputFile, "transmitter output file");
193 zap['S'] = make_field(mod, "transmitter modifier") = JPARSER::initialised();
194 zap['A'] = make_field(add, "add transmitter") = JPARSER::initialised();
195 zap['k'] = make_field(keep, "keep transmitter[s]") = JPARSER::initialised();
196 zap['r'] = make_field(rm, "remove transmitter[s]") = JPARSER::initialised();
197 zap['q'] = make_field(squash, "squash meta data");
198 zap['d'] = make_field(debug, "debug level") = 2;
199
200 zap(argc, argv);
201 }
202 catch(const exception &error) {
203 FATAL(error.what() << endl);
204 }
205
206 container_type data;
207
208 if (inputFile != "") {
209 try {
210 data.load(inputFile.c_str());
211 }
212 catch(const exception& error) {
213
214 }
215 }
216
217 if (squash) {
218 data.comment.clear();
219 }
220
221 data.comment.add(JMeta(argc, argv));
222
223 for (vector<JTransmitter>::const_iterator i = add.begin(); i != add.end(); ++i) {
224 data.push_back(*i);
225 }
226
227 for (vector<JModifier>::const_iterator i = mod.begin(); i != mod.end(); ++i) {
228
229 for (container_type::iterator target = data.begin(); target != data.end(); ++target) {
230
231 if (target->getString() == i->id) {
232
233 DEBUG("Modifier" << ' '
234 << "(" << FILL(4,'0') << target->getString() << "," << FILL(2,'0') << target->getFloor() << FILL() << ")" << ' '
235 << "action" << ' ' << i->action << JEEPZ() << i->data << endl);
236
237 if (!i->apply(*target)) {
238 ERROR("No valid action: " << *i << endl);
239 }
240 }
241 }
242 }
243
244 for (container_type::iterator i = data.begin(); i != data.end(); ) {
245
246 if ((keep.empty() || keep.count(i->getString()) != 0) &&
247 (rm .empty() || rm .count(i->getString()) == 0))
248 ++i;
249 else
250 i = data.erase(i);
251 }
252
253 data.store(outputFile.c_str());
254}