From f969a222670b9046727acf227f2f6435475302d2 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 26 Nov 2015 18:07:36 +0200 Subject: kmsprint: use the new option parser --- tests/CMakeLists.txt | 2 +- tests/kmsprint.cpp | 133 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 90 insertions(+), 45 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9f6a60c..092220f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,6 +11,6 @@ add_executable (kmsview kmsview.cpp) target_link_libraries(kmsview kms++ kmstest ${LIBDRM_LIBRARIES}) add_executable (kmsprint kmsprint.cpp) -target_link_libraries(kmsprint kms++ ${LIBDRM_LIBRARIES}) +target_link_libraries(kmsprint kms++ kmstest ${LIBDRM_LIBRARIES}) add_executable (optiontester optiontester.cpp) diff --git a/tests/kmsprint.cpp b/tests/kmsprint.cpp index 697506b..7b9de8c 100644 --- a/tests/kmsprint.cpp +++ b/tests/kmsprint.cpp @@ -3,13 +3,19 @@ #include #include "kms++.h" -#include "cmdoptions.h" +#include "opts.h" using namespace std; using namespace kms; namespace kmsprint { +static struct { + bool print_props; + bool print_modes; + bool recurse; +} opts; + string width(int w, string str) { str.resize(w, ' '); @@ -54,7 +60,7 @@ void print_properties(DrmObject& o, int ind) } } -void print_plane(Plane& p, int ind, const CmdOptions& opts) +void print_plane(Plane& p, int ind) { printf("%sPlane Id %d %d,%d -> %dx%d formats:", width(ind, "").c_str(), p.id(), p.crtc_x(), p.crtc_y(), p.x(), p.y()); @@ -62,11 +68,11 @@ void print_plane(Plane& p, int ind, const CmdOptions& opts) printf(" %s", PixelFormatToFourCC(f).c_str()); printf("\n"); - if (opts.is_set("p")) + if (opts.print_props) print_properties(p, ind+2); } -void print_crtc(Crtc& cc, int ind, const CmdOptions& opts) +void print_crtc(Crtc& cc, int ind) { printf("%sCRTC Id %d BufferId %d %dx%d at %dx%d gamma_size %d\n", width(ind, "").c_str(), cc.id(), cc.buffer_id(), cc.width(), @@ -75,28 +81,28 @@ void print_crtc(Crtc& cc, int ind, const CmdOptions& opts) printf("%s Mode ", width(ind, "").c_str()); print_mode(cc.mode(), 0); - if (opts.is_set("p")) + if (opts.print_props) print_properties(cc, ind+2); - if (opts.is_set("r")) + if (opts.recurse) for (auto p : cc.get_possible_planes()) - print_plane(*p, ind + 2, opts); + print_plane(*p, ind + 2); } -void print_encoder(Encoder& e, int ind, const CmdOptions& opts) +void print_encoder(Encoder& e, int ind) { printf("%sEncoder Id %d type %s\n", width(ind, "").c_str(), e.id(), e.get_encoder_type().c_str()); - if (opts.is_set("p")) + if (opts.print_props) print_properties(e, ind+2); - if (opts.is_set("r")) + if (opts.recurse) for (auto cc : e.get_possible_crtcs()) - print_crtc(*cc, ind + 2, opts); + print_crtc(*cc, ind + 2); } -void print_connector(Connector& c, int ind, const CmdOptions& opts) +void print_connector(Connector& c, int ind) { printf("%sConnector %s Id %d %sconnected", width(ind, "").c_str(), c.fullname().c_str(), c.id(), c.connected() ? "" : "dis"); @@ -104,14 +110,14 @@ void print_connector(Connector& c, int ind, const CmdOptions& opts) printf(" Subpixel: %s", c.subpixel_str().c_str()); printf("\n"); - if (opts.is_set("p")) + if (opts.print_props) print_properties(c, ind+2); - if (opts.is_set("r")) + if (opts.recurse) for (auto enc : c.get_encoders()) - print_encoder(*enc, ind + 2, opts); + print_encoder(*enc, ind + 2); - if (opts.is_set("m")) { + if (opts.print_modes) { auto modes = c.get_modes(); printf("%sModes, %u in total:\n", width(ind + 2, "").c_str(), (unsigned) modes.size()); @@ -122,51 +128,90 @@ void print_connector(Connector& c, int ind, const CmdOptions& opts) } -static map options = { - { "-id", HAS_PARAM("Object id to print") }, - { "p", NO_PARAM("Print properties") }, - { "m", NO_PARAM("Print modes") }, - { "r", NO_PARAM("Recursively print all related objects") }, -}; - using namespace kmsprint; -int main(int argc, char **argv) +static const char* usage_str = + "Usage: kmsprint [OPTIONS]\n\n" + "Options:\n" + " -m, --modes Print modes\n" + " -p, --props Print properties\n" + " -r, --recurse Recursively print all related objects\n" + " --id= Print object \n" + ; + +static void usage() { - Card card; - CmdOptions opts(argc, argv, options); + puts(usage_str); +} - if (opts.error().length()) { - cerr << opts.error() << opts.usage(); - return -1; +int main(int argc, char **argv) +{ + string dev_path; + unsigned id = 0; + + OptionSet optionset = { + Option("|device=", + [&](string s) + { + dev_path = s; + }), + Option("|id=", + [&](string s) + { + id = stoul(s); + }), + Option("p", [&](string s) + { + opts.print_props = true; + }), + Option("m", [&](string s) + { + opts.print_modes = true; + }), + Option("r", [&](string s) + { + opts.recurse = true; + }), + Option("h|help", [&]() + { + usage(); + exit(-1); + }), + }; + + optionset.parse(argc, argv); + + if (optionset.params().size() > 0) { + usage(); + exit(-1); } - /* No options implyles recursion */ - if (!opts.is_set("-id")) { - opts.get_option("r").oset(); + Card card; + + /* No options impliles recursion */ + if (id == 0) { + opts.recurse = true; for (auto conn : card.get_connectors()) - print_connector(*conn, 0, opts); + print_connector(*conn, 0); return 0; - } - - if (opts.is_set("-id")) { - auto ob = card.get_object(atoi(opts.opt_param("-id").c_str())); + } else { + auto ob = card.get_object(id); if (!ob) { - cerr << opts.cmd() << ": Object id " << - opts.opt_param("-id") << " not found." << endl; + cerr << "kmsprint" << ": Object id " << + id << " not found." << endl; return -1; } if (auto co = dynamic_cast(ob)) - print_connector(*co, 0, opts); + print_connector(*co, 0); else if (auto en = dynamic_cast(ob)) - print_encoder(*en, 0, opts); + print_encoder(*en, 0); else if (auto cr = dynamic_cast(ob)) - print_crtc(*cr, 0, opts); + print_crtc(*cr, 0); else if (auto pl = dynamic_cast(ob)) - print_plane(*pl, 0, opts); + print_plane(*pl, 0); else { - cerr << opts.cmd() << ": Unkown DRM Object type" << + cerr << "kmsprint" << ": Unkown DRM Object type" << endl; return -1; } -- cgit v1.2.3