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

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