Back to index

lshw  02.16
options.cc
Go to the documentation of this file.
00001 /*
00002  * options.cc
00003  *
00004  * This module handles global options passed on the command-line.
00005  *
00006  */
00007 
00008 #include "version.h"
00009 #include "options.h"
00010 #include "osutils.h"
00011 
00012 #include <set>
00013 #include <vector>
00014 #include <string>
00015 #include <map>
00016 
00017 #include <stdlib.h>
00018 
00019 using namespace std;
00020 
00021 __ID("@(#) $Id: options.cc 2433 2012-01-10 22:01:30Z lyonel $");
00022 
00023 static set < string > disabled_tests;
00024 static set < string > visible_classes;
00025 static map < string, string > aliases;
00026 
00027 void alias(const char * aname, const char * cname)
00028 {
00029   aliases[lowercase(aname)] = lowercase(cname);
00030 }
00031 
00032 
00033 static string getcname(const char * aname)
00034 {
00035   if(aliases.find(lowercase(aname)) != aliases.end())
00036     return lowercase(aliases[lowercase(aname)]);
00037   else
00038     return lowercase(aname);
00039 }
00040 
00041 
00042 static void remove_option_argument(int i,
00043 int &argc,
00044 char *argv[])
00045 {
00046   for (int j = i; j + 2 < argc; j++)
00047     argv[j] = argv[j + 2];
00048 
00049   argc -= 2;
00050 }
00051 
00052 
00053 bool parse_options(int &argc,
00054 char *argv[])
00055 {
00056   int i = 1;
00057   string option = "";
00058 
00059   while (i < argc)
00060   {
00061     option = string(argv[i]);
00062 
00063     if (option == "-disable")
00064     {
00065       if (i + 1 >= argc)
00066         return false;                             // -disable requires an argument
00067 
00068       disable(argv[i + 1]);
00069 
00070       remove_option_argument(i, argc, argv);
00071     }
00072     else if (option == "-enable")
00073     {
00074       if (i + 1 >= argc)
00075         return false;                             // -enable requires an argument
00076 
00077       enable(argv[i + 1]);
00078 
00079       remove_option_argument(i, argc, argv);
00080     }
00081 #ifdef SQLITE
00082     else if (option == "-dump")
00083     {
00084       if (i + 1 >= argc)
00085         return false;                             // -dump requires an argument
00086 
00087       setenv("OUTFILE", argv[i + 1], 1);
00088       enable("output:db");
00089 
00090       remove_option_argument(i, argc, argv);
00091     }
00092 #endif
00093     else if ( (option == "-class") || (option == "-C") || (option == "-c"))
00094     {
00095       vector < string > classes;
00096 
00097       enable("output:list");
00098 
00099       if (i + 1 >= argc)
00100         return false;                             // -class requires an argument
00101 
00102       splitlines(argv[i + 1], classes, ',');
00103 
00104       for (unsigned int j = 0; j < classes.size(); j++)
00105         visible_classes.insert(getcname(classes[j].c_str()));
00106 
00107       remove_option_argument(i, argc, argv);
00108     }
00109     else
00110       i++;
00111   }
00112 
00113   return true;
00114 }
00115 
00116 
00117 bool enabled(const char *option)
00118 {
00119   return !(disabled(lowercase(option).c_str()));
00120 }
00121 
00122 
00123 bool disabled(const char *option)
00124 {
00125   return disabled_tests.find(lowercase(option)) != disabled_tests.end();
00126 }
00127 
00128 
00129 void enable(const char *option)
00130 {
00131   if (!disabled(option))
00132     return;
00133 
00134   disabled_tests.erase(lowercase(option));
00135 }
00136 
00137 
00138 void disable(const char *option)
00139 {
00140   disabled_tests.insert(lowercase(option));
00141 }
00142 
00143 
00144 bool visible(const char *c)
00145 {
00146   if (visible_classes.size() == 0)
00147     return true;
00148   return visible_classes.find(getcname(c)) != visible_classes.end();
00149 }