$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r57971 - in trunk: boost/program_options libs/program_options/build libs/program_options/src libs/program_options/test
From: s.ochsenknecht_at_[hidden]
Date: 2009-11-27 12:47:53
Author: s_ochsenknecht
Date: 2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
New Revision: 57971
URL: http://svn.boost.org/trac/boost/changeset/57971
Log:
add general split function, Fixes #2561
Added:
   trunk/libs/program_options/src/split.cpp   (contents, props changed)
   trunk/libs/program_options/test/split_test.cpp   (contents, props changed)
Text files modified: 
   trunk/boost/program_options/parsers.hpp                |    14 ++++++++++++++                          
   trunk/libs/program_options/build/Jamfile.v2            |     4 ++--                                    
   trunk/libs/program_options/src/options_description.cpp |     2 +-                                      
   trunk/libs/program_options/test/Jamfile.v2             |     1 +                                       
   4 files changed, 18 insertions(+), 3 deletions(-)
Modified: trunk/boost/program_options/parsers.hpp
==============================================================================
--- trunk/boost/program_options/parsers.hpp	(original)
+++ trunk/boost/program_options/parsers.hpp	2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
@@ -202,6 +202,20 @@
     BOOST_PROGRAM_OPTIONS_DECL parsed_options
     parse_environment(const options_description&, const char* prefix);
 
+    /** Splits a given string to a collection of single strings which
+        can be passed to command_line_parser. The second parameter is
+        used to specify a collection of possible seperator chars used
+        for splitting. The seperator is defaulted to space " ".
+    */
+    BOOST_PROGRAM_OPTIONS_DECL std::vector<std::string>
+    split(const std::string& cmdline, const std::string& sep = " ");
+    
+#ifndef BOOST_NO_STD_WSTRING
+    /** @overload */
+    BOOST_PROGRAM_OPTIONS_DECL std::vector<std::wstring>
+    split(const std::wstring& cmdline, const std::wstring& sep = L" ");
+#endif
+
     #ifdef _WIN32
     /** Parses the char* string which is passed to WinMain function on
         windows. This function is provided for convenience, and because it's
Modified: trunk/libs/program_options/build/Jamfile.v2
==============================================================================
--- trunk/libs/program_options/build/Jamfile.v2	(original)
+++ trunk/libs/program_options/build/Jamfile.v2	2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
@@ -6,7 +6,7 @@
 SOURCES =
     cmdline config_file options_description parsers variables_map 
     value_semantic positional_options utf8_codecvt_facet
-    convert winmain
+    convert winmain split
     ;
 
 lib boost_program_options
@@ -16,4 +16,4 @@
     : <link>shared:<define>BOOST_PROGRAM_OPTIONS_DYN_LINK=1
     ;
 
-boost-install boost_program_options ;
\ No newline at end of file
+boost-install boost_program_options ;
Modified: trunk/libs/program_options/src/options_description.cpp
==============================================================================
--- trunk/libs/program_options/src/options_description.cpp	(original)
+++ trunk/libs/program_options/src/options_description.cpp	2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
@@ -8,7 +8,7 @@
 #define BOOST_PROGRAM_OPTIONS_SOURCE
 #include <boost/program_options/config.hpp>
 #include <boost/program_options/options_description.hpp>
-// FIXME: this is only to get multiple_occureces class
+// FIXME: this is only to get multiple_occurences class
 // should move that to a separate headers.
 #include <boost/program_options/parsers.hpp>
 
Added: trunk/libs/program_options/src/split.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/program_options/src/split.cpp	2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
@@ -0,0 +1,65 @@
+// Copyright Sascha Ochsenknecht 2009.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#define BOOST_PROGRAM_OPTIONS_SOURCE
+#include <boost/program_options/parsers.hpp>
+#include <string>
+#include <vector>
+
+namespace boost { namespace program_options { namespace detail {
+
+
+   template<class charT>
+   std::vector<std::basic_string<charT> > 
+   split(const std::basic_string<charT>& cmdline, const std::basic_string<charT>& sep)
+   {
+      std::vector<std::basic_string<charT> > result;
+      if (!cmdline.empty()) 
+      { 
+         std::basic_string<charT> sub(cmdline), val;
+         std::size_t pos; 
+
+         while (sub.size() > 0) 
+         {                                                     
+            if ((pos = sub.find_first_of(sep)) != sub.npos) 
+            {                 
+               val = sub.substr(0,pos);                                               
+               sub = sub.substr(pos+1);                                               
+            } 
+            else 
+            {                                                                  
+               val = sub;                                                             
+               sub.erase();                                                           
+            }                                                                         
+            if (!val.empty()) 
+            {
+               result.push_back(val);
+            }
+         }      
+      }
+      return result;   
+   }
+   
+}}}
+
+namespace boost { namespace program_options {
+
+   // Take a command line string and splits in into tokens, according
+   // to the given collection of seperators chars.
+   BOOST_PROGRAM_OPTIONS_DECL std::vector<std::string> 
+   split(const std::string& cmdline, const std::string& sep)
+   {
+      return detail::split(cmdline, sep);
+   }
+
+#ifndef BOOST_NO_STD_WSTRING
+   BOOST_PROGRAM_OPTIONS_DECL std::vector<std::wstring>
+   split(const std::wstring& cmdline, const std::wstring& sep)
+   {
+      return detail::split(cmdline, sep);
+   }
+#endif
+
+}}
Modified: trunk/libs/program_options/test/Jamfile.v2
==============================================================================
--- trunk/libs/program_options/test/Jamfile.v2	(original)
+++ trunk/libs/program_options/test/Jamfile.v2	2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
@@ -28,6 +28,7 @@
     [ po-test unicode_test.cpp ] 
     [ po-test winmain.cpp ] 
     [ po-test exception_test.cpp ]
+    [ po-test split_test.cpp ]
     ;
         
 exe test_convert : test_convert.cpp ;   
Added: trunk/libs/program_options/test/split_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/program_options/test/split_test.cpp	2009-11-27 12:47:51 EST (Fri, 27 Nov 2009)
@@ -0,0 +1,104 @@
+// Copyright Sascha Ochsenknecht 2009.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt
+// or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <boost/program_options/parsers.hpp>
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/variables_map.hpp>
+#include <boost/program_options/cmdline.hpp>
+using namespace boost::program_options;
+
+#include <iostream>
+#include <sstream>
+#include <vector>
+#include <cassert>
+using namespace std;
+
+#include "minitest.hpp"
+
+void check_value(const string& option, const string& value)
+{
+    BOOST_CHECK(option == value);
+}
+
+void split_whitespace(const options_description& description)
+{
+
+   const char* cmdline = "prg --input input.txt \t --optimization 4 \t\n --opt    option";
+   
+   vector< string > tokens =  split(cmdline, " \t\n");
+   
+   BOOST_REQUIRE(tokens.size() == 7);
+   check_value(tokens[0], "prg");
+   check_value(tokens[1], "--input");
+   check_value(tokens[2], "input.txt");
+   check_value(tokens[3], "--optimization");
+   check_value(tokens[4], "4");
+   check_value(tokens[5], "--opt");
+   check_value(tokens[6], "option");
+
+   variables_map vm;  
+   store(command_line_parser(tokens).options(description).run(), vm);
+   notify(vm);
+}
+
+void split_equalsign(const options_description& description)
+{
+
+   const char* cmdline = "prg --input=input.txt  --optimization=4 --opt=option";
+   
+   vector< string > tokens =  split(cmdline, "= ");
+   
+   BOOST_REQUIRE(tokens.size() == 7);
+   check_value(tokens[0], "prg");
+   check_value(tokens[1], "--input");
+   check_value(tokens[2], "input.txt");
+   check_value(tokens[3], "--optimization");
+   check_value(tokens[4], "4");
+   check_value(tokens[5], "--opt");
+   check_value(tokens[6], "option");
+
+   variables_map vm;  
+   store(command_line_parser(tokens).options(description).run(), vm);
+   notify(vm);
+}
+
+void split_semi(const options_description& description)
+{
+
+   const char* cmdline = "prg;--input input.txt;--optimization 4;--opt option";
+   
+   vector< string > tokens =  split(cmdline, "; ");
+   
+   BOOST_REQUIRE(tokens.size() == 7);
+   check_value(tokens[0], "prg");
+   check_value(tokens[1], "--input");
+   check_value(tokens[2], "input.txt");
+   check_value(tokens[3], "--optimization");
+   check_value(tokens[4], "4");
+   check_value(tokens[5], "--opt");
+   check_value(tokens[6], "option");
+
+   variables_map vm;  
+   store(command_line_parser(tokens).options(description).run(), vm);
+   notify(vm);
+}
+
+
+int main(int /*ac*/, char** /*av*/)
+{
+   options_description desc;
+   desc.add_options()
+        ("input,i", value<string>(), "the input file")
+        ("optimization,O", value<unsigned>(), "optimization level")
+        ("opt,o", value<string>(), "misc option")
+      ;
+
+   split_whitespace(desc);
+   split_equalsign(desc);
+   split_semi(desc);
+   
+   return 0;
+}