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

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