From a584cc40de9721b6f9a5aa2feedbc7e650a7b5b6 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Fri, 15 Jan 2021 18:02:54 +0100 Subject: [PATCH] finish CLI tool tdm_ripper --- makefile | 11 +- src/main.cpp | 290 ++++++++++++++++++++++++--------------------------- 2 files changed, 141 insertions(+), 160 deletions(-) diff --git a/makefile b/makefile index 594b0b8..88d31c1 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ EXE = tdmripper # compiler and C++ standard -CC = g++ -std=c++11 +CC = g++ -std=c++17 # compiler options and optimization flags OPT = -O3 -Wall -Werror -Wunused-variable -Wsign-compare @@ -13,9 +13,8 @@ OPT = -O3 -Wall -Werror -Wunused-variable -Wsign-compare LIB = pugixml/ # determine git version/commit tag -TAGV := $(shell git describe --tag | head -n1) -COMM := $(shell git rev-parse HEAD | head -c8) -GITV := $(TAGV)-g$(COMM) +GTAG := $(shell git tag | head -n1) +GHSH := $(shell git rev-parse HEAD | head -c8) # --------------------------------------------------------------------------- # # CLI tool @@ -26,8 +25,8 @@ $(EXE) : main.o tdm_ripper.o # build main.cpp object file and include git version/commit tag main.o : src/main.cpp @cp $< $<.cpp - @sed -i 's/tagfullstring/$(GITV)/g' $<.cpp - @sed -i 's/versionstring/$(TAGV)/g' $<.cpp + @sed -i 's/TAGSTRING/$(GTAG)/g' $<.cpp + @sed -i 's/HASHSTRING/$(GHSH)/g' $<.cpp $(CC) -c $(OPT) -I $(LIB) -I lib/ $<.cpp -o $@ @rm $<.cpp diff --git a/src/main.cpp b/src/main.cpp index f9f862c..6ee85c5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,15 +2,18 @@ #include "tdm_ripper.hpp" +#include +#include + // ------------------------------------------------------------------------- // -const std::string tagfull("tagfullstring"); -const std::string version("versionstring"); +const std::string gittag("TAGSTRING"); +const std::string githash("HASHSTRING"); void show_usage() { std::cout<<"\n" - <<"tdmripper ["< optkeys; +const std::string argmsg = std::string("both .tdm and .tdx file (and maybe any valid option) must be provided!"); +const std::string arguse = std::string("see $ tdmripper --help for usage"); + optkeys parse_args(int argc, char* argv[], bool showargs = false) { if ( showargs ) @@ -42,107 +51,94 @@ optkeys parse_args(int argc, char* argv[], bool showargs = false) // declare empty key-value object optkeys prsdkeys; - // at least both tdm and tdx file must be provided - if ( argc > 1 ) + if ( argc == 2 ) { - if ( std::string(argv[1]) == std::string("--help") ) + if ( std::string(argv[1]) == std::string("--help") + || std::string(argv[1]) == std::string("-h") ) { show_usage(); } - else if ( std::string(argv[1]) == std::string("--version") ) + else if ( std::string(argv[1]) == std::string("--version") + || std::string(argv[1]) == std::string("-v") ) { - std::cout<<"tdmripper "< 2 ) // && argc%2 == 1 ) + { + // tdm file + if ( std::string(argv[argc-2]).find(std::string(".tdm")) != std::string::npos ) + { + prsdkeys.insert(std::pair("tdm",argv[argc-2])); + } + else + { + std::string tdmerr = std::string(argv[argc-2]) + + std::string(" does not look like a .tdm file") + + std::string(", evtl. add file extension *.tdm") + + std::string("\n") + arguse; + throw std::runtime_error(tdmerr); + } + // tdx file + if ( std::string(argv[argc-1]).find(std::string(".tdx")) != std::string::npos ) + { + prsdkeys.insert(std::pair("tdx",argv[argc-1])); + } + else + { + std::string tdxerr = std::string(argv[argc-1]) + + std::string(" does not look like a .tdx file") + + std::string(", evtl. add file extension *.tdx") + + std::string("\n") + arguse; + throw std::runtime_error(tdxerr); + } + // options (in any order) + // for ( int i = 1; i < argc-2; i+=2 ) + for ( int i = 1; i < argc-2; i++ ) + { + if ( std::string(argv[i]) == std::string("--output") + || std::string(argv[i]) == std::string("-d") ) + { + prsdkeys.insert(std::pair("output",argv[i+1])); + i += 1; + } + else if ( std::string(argv[i]) == std::string("--csvsep") + || std::string(argv[i]) == std::string("-s") ) + { + prsdkeys.insert(std::pair("csvsep",argv[i+1])); + i += 1; + } + else if ( std::string(argv[i]) == std::string("--prefix") + || std::string(argv[i]) == std::string("-p") ) + { + prsdkeys.insert(std::pair("prefix",argv[i+1])); + i += 1; + } + else if ( std::string(argv[i]) == std::string("--listgroups") + || std::string(argv[i]) == std::string("-g") ) + { + prsdkeys.insert(std::pair("listgroups",argv[i+1])); + } + else if ( std::string(argv[i]) == std::string("--listchannels") + || std::string(argv[i]) == std::string("-c") ) + { + prsdkeys.insert(std::pair("listchannels",argv[i+1])); + } + else + { + std::string argerr = std::string("unkown option '") + argv[i] + std::string("'"); + throw std::runtime_error(argerr + std::string("\n") + arguse); } } - // { - // if ( std::string(argv[i]) == std::string("--image") ) - // { - // if ( i+1 == argc || std::string(argv[i+1]).substr(0,2) == std::string("--") ) - // { - // throw std::runtime_error("invalid or missing --image argument"); - // } - // else - // { - // prsdkeys.insert(std::pair("image",argv[i+1])); - // } - // i++; - // } - // else if ( std::string(argv[i]) == std::string("--drive") ) - // { - // if ( i+1 == argc || std::string(argv[i+1]).substr(0,2) == std::string("--") ) - // { - // throw std::runtime_error("invalid or missing --drive argument"); - // } - // else - // { - // prsdkeys.insert(std::pair("drive",argv[i+1])); - // } - // i++; - // } - // else if ( std::string(argv[i]) == std::string("--config") ) - // { - // if ( i+1 == argc || std::string(argv[i+1]).substr(0,2) == std::string("--") ) - // { - // throw std::runtime_error("invalid or missing --config argument"); - // } - // else - // { - // prsdkeys.insert(std::pair("config",argv[i+1])); - // } - // i++; - // } - // else if ( std::string(argv[i]) == std::string("--writeblocksize") ) - // { - // if ( i+1 == argc || std::string(argv[i+1]).substr(0,2) == std::string("--") ) - // { - // throw std::runtime_error("invalid or missing --writeblocksize argument"); - // } - // else - // { - // prsdkeys.insert(std::pair("writeblock",argv[i+1])); - // } - // i++; - // } - // else if ( std::string(argv[i]) == std::string("--readblocksize") ) - // { - // if ( i+1 == argc || std::string(argv[i+1]).substr(0,2) == std::string("--") ) - // { - // throw std::runtime_error("invalid or missing --readblocksize argument"); - // } - // else - // { - // prsdkeys.insert(std::pair("readblock",argv[i+1])); - // } - // i++; - // } - // else if ( std::string(argv[i]) == std::string("--novalidate") ) - // { - // prsdkeys.insert(std::pair("novalidate","no")); - // } - // else if ( std::string(argv[i]) == std::string("--listdrives") ) - // { - // prsdkeys.insert(std::pair("listdrives","yes")); - // } - // else if ( std::string(argv[i]) == std::string("--help") ) - // { - // show_usage(); - // } - // else - // { - // throw std::runtime_error(std::string("invalid argument ") + std::string(argv[i])); - // } - // } } else { - // show_usage(); - throw std::runtime_error(".tdm/.tdx files are missing! see $ ./tdmripper --help for usage"); + throw std::runtime_error(argmsg + std::string("\n") + arguse); } return prsdkeys; @@ -155,67 +151,53 @@ int main(int argc, char* argv[]) // parse CLI arguments optkeys cfgopts = parse_args(argc,argv); - // // path of filename provided ? - // assert( argc > 1 && "please provide a filename and path" ); - // - // std::cout<<"number of CLI-arguments: "<