commit a237d993b5c97bface28534c1d08216bd580829f
parent f87f5765b28638fef7eef413628a7e0df9776919
Author: Morel Bérenger <berengermorel76@gmail.com>
Date:   Sat, 30 May 2020 04:59:56 +0200
allow providing parameters as command-line parameters
Diffstat:
2 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/src/lmerge.cpp b/src/lmerge.cpp
@@ -18,7 +18,6 @@
  * * check that ENTRY_SEP works as expected;
  * * fix the fact input needs a "\\n" at end of last line for it to be merged;
  * * UTF-8 support (field separators);
- * * providing FIELDS variable as command-line option;
  * * -v/--version option;
  * * allow to customize the memory allocation scheme at runtime;
  * * allow to not print twice merged fields;
@@ -73,11 +72,26 @@ bool allocate_markers(
 
 void print_help( char const* pgm, FILE* target, opt_desc_t const* start, opt_desc_t const* end );
 
-int main( int argc, char const *const * argv )
+int main( int argc, char const *const *argv )
 {
+	char const * SEP_START = getenv( "FIELD_SEP" );
+	char const * SEP_ENTRY = getenv( "ENTRY_SEP" );
+	char const * FIELDS    = getenv( "FIELDS" );
+	if( !SEP_START )
+	{
+		SEP_START = " \t";
+	}
+	if( !SEP_ENTRY )
+	{
+		SEP_ENTRY = "\n";
+	}
+
 	opt_desc_t opts[] =
 	{
 		{ "help", "shows this message", 'h', 0, nullptr, nullptr, nullptr },
+		{ "field_sep", "field separator", 't'  , 0, &SEP_START, set<char const**>, show<char*> },
+		{ "entry_sep", "entry separator", 'l'  , 0, &SEP_ENTRY, set<char const**>, show<char*> },
+		{ "fields"   , "fields to compare", 'f', 0, &FIELDS   , set<char const**>, show<char*> },
 	};
 	auto b_opts = std::begin( opts );
 	auto e_opts = std::end( opts );
@@ -107,21 +121,12 @@ int main( int argc, char const *const * argv )
 		}
 	}
 
-	char const * const DEFAULT_FIELD_SEP = " \t";
-	char const * const DEFAULT_ENTRY_SEP = "\n";
-
-	char const * SEP_START = getenv( "FIELD_SEP" );
-	if( !SEP_START )
-	{
-		SEP_START = DEFAULT_FIELD_SEP;
-	}
-	char const * SEP_ENTRY = getenv( "ENTRY_SEP" );
-	if( !SEP_ENTRY )
+	if( opts[0].count )
 	{
-		SEP_ENTRY = DEFAULT_ENTRY_SEP;
+		print_help( argv[0], stdout, b_opts, e_opts );
+		return EXIT_SUCCESS;
 	}
 
-	char const * const FIELDS = getenv( "FIELDS" );
 	if( !FIELDS )
 	{
 		fputs( "ERROR: FIELDS is not defined\n", stderr );
diff --git a/src/optparser.hpp b/src/optparser.hpp
@@ -67,6 +67,21 @@ void print_opts( FILE* target, opt_desc_t const* start, opt_desc_t const* end );
 #include <type_traits>
 #include <limits>
 
+// C "semi-static" strings in pointer
+template <typename T>
+bool  set(
+		typename std::enable_if <std::is_same<char const**,T>::value, void*>::type val,
+		char const* arg )
+{
+	if( !val )
+	{
+		return true;
+	}
+
+	*static_cast<char const**>( val ) = arg;
+	return false;
+}
+
 // C strings in statically allocated buffer
 template <typename T, size_t SZ>
 bool  set(