]> AND Private Git Repository - loba.git/blob - options.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
61861f046f7ac1035cc6cd26186cf4bbe1901ebd
[loba.git] / options.cpp
1 #include "options.h"
2
3 #include <cstring>              // strrchr
4 #include <iomanip>
5 #include <iostream>
6 #include <sstream>
7 #include <unistd.h>             // getopt
8 #include <xbt/log.h>
9 #include "misc.h"
10
11 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simu);
12
13 namespace opt {
14
15     const char* program_name;
16
17     const char* platform_file;
18     const char* application_file;
19
20     int help_requested = 0;
21     bool version_requested = false;
22
23     unsigned log_rate = 1;
24
25     unsigned maxiter = 4;
26     bool exit_on_close = false;
27
28     bool bookkeeping = false;
29
30     cost_func comp_cost("1e9, 0"); // fixme: find better defaults
31
32 } // namespace opt
33
34 namespace {
35
36     const char* on_off(bool b)
37     {
38         return b ? "on" : "off";
39     }
40
41 }
42
43 int opt::parse_args(int* argc, char* argv[])
44 {
45     int result = 1;
46
47     char* tmp = strrchr(argv[0], '/');
48     opt::program_name = (tmp ? tmp + 1 : argv[0]);
49
50     int c;
51     opterr = 0;
52     while ((c = getopt(*argc, argv, "bc:ehi:l:V")) != -1) {
53         switch (c) {
54         case 'b':
55             opt::bookkeeping = true;
56             break;
57         case 'e':
58             opt::exit_on_close = true;
59             break;
60         case 'h':
61             opt::help_requested++;
62             break;
63         case 'c':
64             opt::comp_cost = cost_func(optarg);
65             break;
66         case 'i':
67             std::istringstream(optarg) >> opt::maxiter;
68             break;
69         case 'l':
70             std::istringstream(optarg) >> opt::log_rate;
71             break;
72         case 'V':
73             opt::version_requested = true;
74             break;
75         case '?':
76             ERROR1("invalid option -- '%c'", optopt);
77             result = 0;
78             break;
79         }
80     }
81     if (opt::version_requested || opt::help_requested)
82         return 1;
83
84     int rem_args = *argc - optind;
85     switch (rem_args) {
86     case 0:
87         ERROR0("missing parameter -- <plaform_file>");
88     case 1:
89         ERROR0("missing parameter -- <application_file>");
90         result = 0;
91         break;
92
93     default:
94         opt::platform_file = argv[optind];
95         opt::application_file = argv[optind + 1];
96         if (rem_args == 2)
97             break;
98         for (int i = optind + 2 ; i < *argc ; ++i)
99             ERROR1("unused parameter -- \"%s\"", argv[i]);
100         result = 0;
101         break;
102     }
103
104     return result;
105 }
106
107 void opt::print()
108 {
109     INFO0(",----[ Simulation parameters ]");
110     INFO1("| platform_file.......: \"%s\"", opt::platform_file);
111     INFO1("| application_file....: \"%s\"", opt::application_file);
112     INFO1("| log rate............: %u",     opt::log_rate);
113     INFO1("| maxiter.............: %u",     opt::maxiter);
114     INFO1("| exit on close.......: %s",     on_off(opt::exit_on_close));
115     INFO1("| bookkeeping.........: %s",     on_off(opt::bookkeeping));
116     INFO1("| comp. cost factors..: [%s]",   opt::comp_cost.to_string().c_str());
117     INFO0("`----");
118 }
119
120 void opt::usage()
121 {
122     const int indent1 = 6;
123     const int indent2 = 12;
124
125 #define oo(opt, arg) std::setw(indent1) << (opt) << " "               \
126     << std::setw(indent2) << std::left << (arg) << std::right
127 #define o(opt) oo(opt, "")
128
129     std::clog << "Usage: " << opt::program_name
130               << " [options] <platform_file> <application_file>\n";
131
132     std::clog << o("-h")
133               << "print help and exit (use -hh or -hhh for extended help)\n";
134     if (opt::help_requested < 1)
135         return;
136
137     std::clog << o("-V") << "print version and exit\n";
138
139     std::clog << o("-b") << "activate bookkeeping\n";
140     std::clog << oo("-c", "[fn,...]f0")
141               << "polynomial factors for computation cost ("
142               << opt::comp_cost.to_string() << ")\n";
143     std::clog << o("-e") << "exit on close reception\n";
144     std::clog << oo("-i", "value")
145               << "maximum number of iterations, 0 for infinity ("
146               << opt::maxiter << ")\n";
147     std::clog << oo("-l", "value")
148               << "print current load every \"value\" iterations, 0 to disable ("
149               << opt::log_rate << ")\n";
150
151 #undef o
152 #undef oo
153 }
154
155 // Local variables:
156 // mode: c++
157 // End: