Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r58543 - in trunk/tools/bcp: . doc doc/html
From: john_at_[hidden]
Date: 2009-12-28 08:26:22


Author: johnmaddock
Date: 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
New Revision: 58543
URL: http://svn.boost.org/trac/boost/changeset/58543

Log:
Add namespace renaming option.
Reworked docs in quickbook format.
Added:
   trunk/tools/bcp/doc/
   trunk/tools/bcp/doc/Jamfile.v2 (contents, props changed)
   trunk/tools/bcp/doc/bcp.qbk (contents, props changed)
   trunk/tools/bcp/doc/html/
   trunk/tools/bcp/doc/html/index.html (contents, props changed)
Removed:
   trunk/tools/bcp/bcp.html
Text files modified:
   trunk/tools/bcp/add_dependent_lib.cpp | 6 +
   trunk/tools/bcp/add_path.cpp | 46 ++++++++++++
   trunk/tools/bcp/bcp.hpp | 2
   trunk/tools/bcp/bcp_imp.cpp | 16 ++++
   trunk/tools/bcp/bcp_imp.hpp | 31 +++++---
   trunk/tools/bcp/copy_path.cpp | 134 +++++++++++++++++++++++++++++++++++++++
   trunk/tools/bcp/file_types.cpp | 21 +++++
   trunk/tools/bcp/index.html | 4
   trunk/tools/bcp/main.cpp | 26 +++++--
   trunk/tools/bcp/output_licence_info.cpp | 2
   10 files changed, 256 insertions(+), 32 deletions(-)

Modified: trunk/tools/bcp/add_dependent_lib.cpp
==============================================================================
--- trunk/tools/bcp/add_dependent_lib.cpp (original)
+++ trunk/tools/bcp/add_dependent_lib.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -202,6 +202,12 @@
                {
                   m_dependencies[fs::path("libs") / libname / "build"] = p; // set up dependency tree
                   add_path(fs::path("libs") / libname / "build");
+ //m_dependencies[fs::path("boost-build.jam")] = p;
+ //add_path(fs::path("boost-build.jam"));
+ m_dependencies[fs::path("Jamroot")] = p;
+ add_path(fs::path("Jamroot"));
+ //m_dependencies[fs::path("tools/build")] = p;
+ //add_path(fs::path("tools/build"));
                }
             }
          }

Modified: trunk/tools/bcp/add_path.cpp
==============================================================================
--- trunk/tools/bcp/add_path.cpp (original)
+++ trunk/tools/bcp/add_path.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -23,7 +23,7 @@
 void bcp_implementation::add_path(const fs::path& p)
 {
    fs::path normalized_path = p;
- normalized_path.normalize();
+ normalized_path.normalize();
    if(fs::exists(m_boost_path / normalized_path))
    {
       if(fs::is_directory(m_boost_path / normalized_path))
@@ -34,6 +34,7 @@
    else
    {
       std::cerr << "CAUTION: dependent file " << p.string() << " does not exist." << std::endl;
+ std::cerr << " Found while scanning file " << m_dependencies[p].string() << std::endl;
    }
 }
 
@@ -102,6 +103,37 @@
    {
       add_file_dependencies(p, false);
    }
+ if(is_jam_file(p) && m_namespace_name.size() && ((std::distance(p.begin(), p.end()) < 3) || (*p.begin() != "tools") || (*++p.begin() != "build")))
+ {
+ //
+ // We're doing a rename of namespaces and library names
+ // so scan for names of libraries:
+ //
+ static const boost::regex e(
+ "\\<lib\\s+(boost\\w+)\\s+[:;]"
+ );
+
+ fileview view(m_boost_path / p);
+ boost::regex_token_iterator<const char*> i(view.begin(), view.end(), e, 1);
+ boost::regex_token_iterator<const char*> j;
+ while(i != j)
+ {
+ m_lib_names.insert(*i);
+ ++i;
+ }
+ static const std::pair<fs::path, std::string> specials_library_names[] = {
+ std::pair<fs::path, std::string>("libs/python/build/Jamfile.v2", "boost_python"),
+ std::pair<fs::path, std::string>("libs/python/build/Jamfile.v2", "boost_python3"),
+ };
+
+ for(unsigned int n = 0; n < (sizeof(specials_library_names)/sizeof(specials_library_names[0])); ++n)
+ {
+ if(0 == compare_paths(specials_library_names[n].first, p))
+ {
+ m_lib_names.insert(specials_library_names[n].second);
+ }
+ }
+ }
    //
    // if this is a html file, scan for dependencies:
    //
@@ -128,6 +160,14 @@
             s.erase(s.size() - 1);
          }
          //
+ // Remove any target suffix:
+ //
+ std::string::size_type n = s.find('#');
+ if(n != std::string::npos)
+ {
+ s.erase(n);
+ }
+ //
          // if the name starts with ./ remove it
          // or we'll get an error:
          if(s.compare(0, 2, "./") == 0)
@@ -280,7 +320,7 @@
    // Now we need to scan for Boost.Preprocessor includes that
    // are included via preprocessor iteration:
    //
- boost::regex ppfiles("^[[:blank:]]*#[[:blank:]]*define[[:blank:]]+(?:BOOST_PP_FILENAME|BOOST_PP_ITERATION_PARAMS|BOOST_PP_INDIRECT_SELF)[^\\n]+?[\"<]([^\">]+)[\">]");
+ static const boost::regex ppfiles("^[[:blank:]]*#[[:blank:]]*define[[:blank:]]+(?:BOOST_PP_FILENAME|BOOST_PP_ITERATION_PARAMS|BOOST_PP_INDIRECT_SELF)[^\\n]+?[\"<]([^\">]+)[\">]");
    i = boost::regex_token_iterator<const char*>(view.begin(), view.end(), ppfiles, 1);
    while(i != j)
    {
@@ -410,7 +450,7 @@
       "BOOST_PP_UPDATE_COUNTER()",
   };
 
- boost::regex indirect_includes("^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+([^\"<][^\n]*?)[[:blank:]]*$");
+ static const boost::regex indirect_includes("^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+([^\"<][^\n]*?)[[:blank:]]*$");
    i = boost::regex_token_iterator<const char*>(view.begin(), view.end(), indirect_includes, 1);
    while(i != j)
    {

Modified: trunk/tools/bcp/bcp.hpp
==============================================================================
--- trunk/tools/bcp/bcp.hpp (original)
+++ trunk/tools/bcp/bcp.hpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -29,6 +29,8 @@
    virtual void set_boost_path(const char* p) = 0;
    virtual void set_destination(const char* p) = 0;
    virtual void add_module(const char* p) = 0;
+ virtual void set_namespace(const char* name) = 0;
+ virtual void set_namespace_alias(bool) = 0;
 
    virtual int run() = 0;
 

Deleted: trunk/tools/bcp/bcp.html
==============================================================================
--- trunk/tools/bcp/bcp.html 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
+++ (empty file)
@@ -1,193 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
- <head>
- <title>bcp</title>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <link rel="stylesheet" type="text/css" href="../../doc/html/boostbook.css">
- </head>
- <body>
- <P>
- <TABLE id="Table1" cellSpacing="1" cellPadding="1" width="100%" border="0">
- <TR>
- <td valign="top" width="300">
- <h3>C++ Boost</h3>
- </td>
- <TD width="353">
- <H1 align="center">The bcp utility</H1>
- </TD>
- <td width="50">
- <h3><a href="../../index.htm"><img alt="Boost.Regex Index" src="../../doc/html/images/up.png"
- border="0"></a></h3>
- </td>
- </TR>
- </TABLE>
- </P>
- <HR>
- <p></p>
- <P>The bcp utility is a tool for extracting subsets of Boost, it's useful for
- Boost authors who want to distribute their library separately from Boost, and
- for Boost users who want to distribute a subset of Boost with their
- application.</P>
- <P>bcp can also report on which parts of Boost your code is dependent on, and what
- licences are used by those dependencies.</P>
- <H2>Examples:</H2>
- <PRE>bcp scoped_ptr /foo</PRE>
- <P>Copies boost/scoped_ptr.hpp and dependencies to /foo.</P>
- <PRE>bcp boost/regex.hpp /foo</PRE>
- <P>Copies boost/regex.hpp and all dependencies including the regex source code (in
- libs/regex/src) and build files (in libs/regex/build) to /foo.&nbsp; Does not
- copy the regex documentation, &nbsp;test, or example code.</P>
- <PRE>bcp regex /foo</PRE>
- <P>Copies the full regex lib (in libs/regex) including dependencies (such as the
- boost.test source required by the regex test programs) to /foo.</P>
- <PRE>bcp regex config build /foo</PRE>
- <P>Copies the full regex lib (in libs/regex) plus the config lib (libs/config) and
- the build system (tools/build) to /foo including all the dependencies.</P>
- <PRE>bcp --scan --boost=/boost foo.cpp bar.cpp boost</PRE>
- <P>Scans the [non-boost] files foo.cpp and bar.cpp for boost dependencies and
- copies those dependencies to the sub-directory boost.</P>
- <PRE>bcp --report regex.hpp boost-regex-report.html</PRE>
- <P>Creates a HTML report called <EM>boost-regex-report.html</EM> for the boost
- module <EM>regex.hpp</EM>.&nbsp; The report contains license information,
- author details, and file dependencies.</P>
- <H2>Syntax:</H2>
- <PRE>bcp --list [options] module-list</PRE>
- <P>Outputs a list of all the files in module-list including dependencies.</P>
- <PRE>bcp [options] module-list output-path</PRE>
- <P>Copies all the files found in module-list to output-path</P>
- <PRE>bcp --report [options] module-list html-file</PRE>
- <P>Outputs a html report file containing:</P>
- <UL>
- <LI>
- All the licenses in effect, plus the files using each license, and
- the&nbsp;copyright holders&nbsp;using each license.
- <LI>
- Any files with no recognizable license (please report these to the boost
- mailing lists).
- <LI>
- Any files with no recognizable copyright holders (please report these to the
- boost mailing lists).
- <LI>
- All the copyright holders and the files on which they hold copyright.
- <LI>
- File dependency information - indicates the reason for the inclusion of any
- particular file in the dependencies found.</LI></UL>
- <H3>Options:</H3>
- <PRE>--boost=path</PRE>
- <P>Sets the location of the boost tree to <EM>path.&nbsp;</EM> If this option is
- not provided then the current path is assumed to be the root directory of the
- Boost tree.</P>
- <PRE>--scan</PRE>
- <P>Treats the module list as a list of (probably non-boost) files to scan for
- boost dependencies, the files listed in the module list are not copied (or
- listed), only the boost files upon which they depend.</P>
- <PRE>--svn</PRE>
- <P>Only copy files under svn version control.</P>
- <PRE>--unix-lines</PRE>
- <P>Make sure that all copied files use Unix style line endings.</P>
- <H4>module-list:&nbsp;</H4>
- <P>When the --scan option is not used then&nbsp;a list of boost files or library
- names to copy, this can be:</P>
- <OL>
- <LI>
- The name of a tool: for example "build" will find "tools/build".
- <LI>
- The name of a library: for example "regex".
- <LI>
- The title of a header: for example "scoped_ptr" will find
- "boost/scoped_ptr.hpp".
- <LI>
- The name of a header: for example "scoped_ptr.hpp" will find
- "boost/scoped_ptr.hpp".
- <LI>
- The name of a file: for example "boost/regex.hpp".</LI></OL>
- <P>When the --scan option is used, then a list of (probably non-boost) files to
- scan for boost dependencies, the files in the module list are not therefore
- copied/listed.</P>
- <H4>output-path:
- </H4>
- <P>The path to which files will be copied (this path must exist).</P>
- <H2>Dependencies</H2>
- <P>File dependencies are found as follows:</P>
- <UL>
- <LI>
- C++ source files are scanned for #includes, all #includes present in the boost
- source tree will then be scanned for their dependencies and so on.</LI>
- <LI>
- C++ source files are associated with the name of a library, if that library has
- source code (and possibly build data), then include that source in the
- dependencies.</LI>
- <LI>
- C++ source files are checked for dependencies on Boost.test (for example to see
- if they use cpp_main as an entry point).</LI>
- <LI>
- HTML files are scanned for immediate dependencies (images and style sheets, but
- not links).</LI></UL>
- <P>It should be noted that in practice bcp can produce a rather "fat" list of
- dependencies, reasons for this include:</P>
- <UL>
- <LI>
- It searches for library names first, so using "regex" as a name will give you
- everything in the libs/regex directory and everything that depends on.&nbsp;
- This can be a long list as all the regex test and example programs will get
- scanned for their dependencies.&nbsp; If you want a more minimal list, then try
- using the names of the headers you are actually including, or use the --scan
- option to scan your source code.</LI>
- <LI>
- If you include the header of a library with separate source, then you get that
- libraries source and all it's dependencies.&nbsp; This is deliberate and in
- general those extra dependencies are needed.</LI>
- <LI>
- When you include a header, bcp doesn't know what compiler you're using, so it
- follows all possible preprocessor paths. If you're distributing a subset of
- Boost with you're application then that is what you want to have happen in
- general.</LI></UL>
- <P>The last point above can result in a substantial increase in the number of
- headers found compared to most peoples expectations.&nbsp; For example bcp
- finds 274 header dependencies for boost/shared_ptr.hpp: by running bcp in
- report mode we can see why all these headers have been found as dependencies:</P>
- <UL>
- <LI>
- All of the Config&nbsp;library headers get included&nbsp;(52 headers, would be
- about 6 for one compiler only).</LI>
- <LI>
- A lot of MPL and type traits code that includes workarounds for broken
- compilers that you may or may not need.&nbsp; Tracing back through the code
- shows that most of these aren't needed unless the user has
- defined&nbsp;BOOST_SP_USE_QUICK_ALLOCATOR, however bcp isn't aware of whether
- that preprocessor path will be taken or not, so the headers get included just
- in case.&nbsp; This adds about 48 headers (type traits), plus another 49 from
- MPL.</LI>
- <LI>
- The Preprocessor library gets used heavily by MPL: this adds another 96
- headers.</LI>
- <LI>
- The Shared Pointer library contains a lot of platform specific code, split up
- into around 22 headers: normally your compiler would need only a couple of
- these files.</LI></UL>
- <P>As you can see the number of dependencies found are much larger than those used
- by any single compiler, however if you want to distribute a subset of Boost
- that's usable in any configuration, by any compiler, on any platform then
- that's exactly what you need.&nbsp; If you want to figure out which Boost
- headers are being used by your <EM>specific </EM>compiler then the best way to
- find out is to prepocess the code and scan the output for boost header
- includes.&nbsp; You should be aware that the result will be very platform and
- compiler specific, and may not contain all the headers needed if you so much as
- change a compiler switch (for example turn on threading support).</P>
- <P>
- <P>
- <HR>
- <P></P>
- <P></P>
- <p>Last revised $Date$</p>
- <P><I>© Copyright John Maddock&nbsp;2003-7</I></P>
- <P align="left"><I>Distributed under the Boost Software License, Version 1.0.
- (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- </I></P>
- </body>
-</html>
-
-
-
-
-

Modified: trunk/tools/bcp/bcp_imp.cpp
==============================================================================
--- trunk/tools/bcp/bcp_imp.cpp (original)
+++ trunk/tools/bcp/bcp_imp.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -18,7 +18,9 @@
 #include <string>
 
 bcp_implementation::bcp_implementation()
- : m_list_mode(false), m_list_summary_mode(false), m_license_mode(false), m_cvs_mode(false), m_svn_mode(false), m_unix_lines(false), m_scan_mode(false), m_bsl_convert_mode(false), m_bsl_summary_mode(false)
+ : m_list_mode(false), m_list_summary_mode(false), m_license_mode(false), m_cvs_mode(false),
+ m_svn_mode(false), m_unix_lines(false), m_scan_mode(false), m_bsl_convert_mode(false),
+ m_bsl_summary_mode(false), m_namespace_alias(false)
 {
 }
 
@@ -100,6 +102,16 @@
    m_module_list.push_back(p);
 }
 
+void bcp_implementation::set_namespace(const char* name)
+{
+ m_namespace_name = name;
+}
+
+void bcp_implementation::set_namespace_alias(bool b)
+{
+ m_namespace_alias = b;
+}
+
 fs::path get_short_path(const fs::path& p)
 {
    // truncate path no more than "x/y":
@@ -152,7 +164,7 @@
      fs::ifstream in(blanket_permission);
      std::string line;
      while (std::getline(in, line)) {
- boost::regex e("([^(]+)\\(");
+ static const boost::regex e("([^(]+)\\(");
        boost::smatch result;
        if (boost::regex_search(line, result, e))
          m_bsl_authors.insert(format_authors_name(result[1]));

Modified: trunk/tools/bcp/bcp_imp.hpp
==============================================================================
--- trunk/tools/bcp/bcp_imp.hpp (original)
+++ trunk/tools/bcp/bcp_imp.hpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -46,6 +46,7 @@
    ~bcp_implementation();
    static bool is_source_file(const fs::path& p);
    static bool is_html_file(const fs::path& p);
+ static bool is_jam_file(const fs::path& p);
 private:
    //
    // the following are the overridden virtuals from the base class:
@@ -62,6 +63,8 @@
    void set_boost_path(const char* p);
    void set_destination(const char* p);
    void add_module(const char* p);
+ void set_namespace(const char* name);
+ void set_namespace_alias(bool);
 
    virtual int run();
 
@@ -90,18 +93,22 @@
    bool m_scan_mode; // scan non-boost files.
    bool m_bsl_convert_mode; // try to convert to the BSL
    bool m_bsl_summary_mode; // summarise BSL issues only
+ bool m_namespace_alias; // make "boost" a namespace alias when doing a namespace rename.
    fs::path m_boost_path; // the path to the boost root
    fs::path m_dest_path; // the path to copy to
- std::map<fs::path, bool, path_less> m_cvs_paths; // valid files under cvs control
- std::set<fs::path, path_less> m_copy_paths; // list of files to copy
- std::map<int, license_data> m_license_data; // licenses in use
- std::set<fs::path, path_less> m_unknown_licenses; // files with no known license
- std::set<fs::path, path_less> m_unknown_authors; // files with no known copyright/author
- std::set<fs::path, path_less> m_can_migrate_to_bsl; // files that can migrate to the BSL
- std::set<fs::path, path_less> m_cannot_migrate_to_bsl; // files that cannot migrate to the BSL
- std::set<std::string> m_bsl_authors; // authors giving blanket permission to use the BSL
- std::set<std::string> m_authors_for_bsl_migration; // authors we need for BSL migration
- std::map<fs::path, std::pair<std::string, std::string>, path_less> m_converted_to_bsl;
- std::map<std::string, std::set<fs::path, path_less> > m_author_data; // all the authors
- std::map<fs::path, fs::path, path_less> m_dependencies; // dependency information
+ std::map<fs::path, bool, path_less> m_cvs_paths; // valid files under cvs control
+ std::set<fs::path, path_less> m_copy_paths; // list of files to copy
+ std::map<int, license_data> m_license_data; // licenses in use
+ std::set<fs::path, path_less> m_unknown_licenses; // files with no known license
+ std::set<fs::path, path_less> m_unknown_authors; // files with no known copyright/author
+ std::set<fs::path, path_less> m_can_migrate_to_bsl; // files that can migrate to the BSL
+ std::set<fs::path, path_less> m_cannot_migrate_to_bsl; // files that cannot migrate to the BSL
+ std::set<std::string> m_bsl_authors; // authors giving blanket permission to use the BSL
+ std::set<std::string> m_authors_for_bsl_migration; // authors we need for BSL migration
+ std::map<fs::path, std::pair<std::string, std::string>, path_less>
+ m_converted_to_bsl;
+ std::map<std::string, std::set<fs::path, path_less> > m_author_data; // all the authors
+ std::map<fs::path, fs::path, path_less> m_dependencies; // dependency information
+ std::string m_namespace_name; // namespace rename.
+ std::set<std::string> m_lib_names; // List of library binary names
 };

Modified: trunk/tools/bcp/copy_path.cpp
==============================================================================
--- trunk/tools/bcp/copy_path.cpp (original)
+++ trunk/tools/bcp/copy_path.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -11,12 +11,36 @@
  */
 
 #include "bcp_imp.hpp"
+#include "fileview.hpp"
 #include <boost/filesystem/operations.hpp>
+#include <boost/regex.hpp>
 #include <fstream>
 #include <iterator>
 #include <algorithm>
 #include <iostream>
 
+struct get_new_library_name
+{
+ get_new_library_name(const std::string& n) : m_new_name(n) {}
+ template <class I>
+ std::string operator()(const boost::match_results<I>& what)
+ {
+ std::string s = what[0];
+ std::string::size_type n = s.find("boost");
+ if(n == std::string::npos)
+ {
+ s.insert(0, m_new_name);
+ }
+ else
+ {
+ s.replace(n, 5, m_new_name);
+ }
+ return s;
+ }
+private:
+ std::string m_new_name;
+};
+
 void bcp_implementation::copy_path(const fs::path& p)
 {
    assert(!fs::is_directory(m_boost_path / p));
@@ -34,7 +58,115 @@
    //
    // do text based copy if requested:
    //
- if(m_unix_lines && !is_binary_file(p))
+ if(m_namespace_name.size() && m_lib_names.size() && is_jam_file(p))
+ {
+ static std::vector<char> v1, v2;
+ v1.clear();
+ v2.clear();
+ std::ifstream is((m_boost_path / p).native_file_string().c_str());
+ std::copy(std::istreambuf_iterator<char>(is), std::istreambuf_iterator<char>(), std::back_inserter(v1));
+
+ static boost::regex libname_matcher;
+ if(libname_matcher.empty())
+ {
+ std::string re = "\\<";
+ re += *m_lib_names.begin();
+ for(std::set<std::string>::const_iterator i = ++m_lib_names.begin(); i != m_lib_names.end(); ++i)
+ {
+ re += "|" + *i;
+ }
+ re += "\\>";
+ libname_matcher.assign(re);
+ }
+
+ regex_replace(std::back_inserter(v2), v1.begin(), v1.end(), libname_matcher, get_new_library_name(m_namespace_name));
+ std::swap(v1, v2);
+ v2.clear();
+
+ std::ofstream os;
+ if(m_unix_lines)
+ os.open((m_dest_path / p).native_file_string().c_str(), std::ios_base::binary | std::ios_base::out);
+ else
+ os.open((m_dest_path / p).native_file_string().c_str(), std::ios_base::out);
+ os.write(&*v1.begin(), v1.size());
+ os.close();
+ }
+ else if(m_namespace_name.size() && is_source_file(p))
+ {
+ //
+ // v1 hold the current content, v2 is temp buffer.
+ // Each time we do a search and replace the new content
+ // ends up in v2: we then swap v1 and v2, and clear v2.
+ //
+ static std::vector<char> v1, v2;
+ v1.clear();
+ v2.clear();
+ std::ifstream is((m_boost_path / p).native_file_string().c_str());
+ std::copy(std::istreambuf_iterator<char>(is), std::istreambuf_iterator<char>(), std::back_inserter(v1));
+
+ static const boost::regex namespace_matcher(
+ "(?|"
+ "(namespace\\s+)boost\\>()"
+ "|"
+ "()boost(\\s*(?:::|,|\\)))"
+ "|"
+ "(namespace\\s+\\w+\\s*=\\s*(?:::\\s*)?)boost\\>()"
+ "|"
+ "(^\\s*#\\s*define[^\\n]+)boost(\\s*)$"
+ ")"
+ );
+
+ regex_replace(std::back_inserter(v2), v1.begin(), v1.end(), namespace_matcher, "$1" + m_namespace_name + "$2");
+ std::swap(v1, v2);
+ v2.clear();
+
+ if(m_namespace_alias)
+ {
+ static const boost::regex namespace_alias(
+ /*
+ "namespace\\s+" + m_namespace_name +
+ "\\s*"
+ "("
+ "\\{"
+ "(?:"
+ "(?>[^\\{\\}/]+)"
+ "(?>"
+ "(?:"
+ "(?1)"
+ "|//[^\\n]+$"
+ "|/[^/]"
+ "|(?:^\\s*#[^\\n]*"
+ "(?:(?<=\\\\)\\n[^\\n]*)*)"
+ ")"
+ "[^\\{\\}]+"
+ ")*"
+ ")*"
+ "\\}"
+ ")"
+ */
+ /*
+ "(namespace\\s+" + m_namespace_name +
+ "\\s*\\{.*"
+ "\\})([^\\{\\};]*)\\z"
+ */
+ "namespace\\s+" + m_namespace_name +
+ "\\s*\\{"
+ );
+ regex_replace(std::back_inserter(v2), v1.begin(), v1.end(), namespace_alias,
+ "namespace " + m_namespace_name + "{} namespace boost = " + m_namespace_name + "; namespace " + m_namespace_name + "{");
+ std::swap(v1, v2);
+ v2.clear();
+ }
+
+ std::ofstream os;
+ if(m_unix_lines)
+ os.open((m_dest_path / p).native_file_string().c_str(), std::ios_base::binary | std::ios_base::out);
+ else
+ os.open((m_dest_path / p).native_file_string().c_str(), std::ios_base::out);
+ os.write(&*v1.begin(), v1.size());
+ os.close();
+ }
+ else if(m_unix_lines && !is_binary_file(p))
    {
       std::ifstream is((m_boost_path / p).native_file_string().c_str());
       std::istreambuf_iterator<char> isi(is);

Added: trunk/tools/bcp/doc/Jamfile.v2
==============================================================================
--- (empty file)
+++ trunk/tools/bcp/doc/Jamfile.v2 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -0,0 +1,22 @@
+
+# Copyright John Maddock 2005. Use, modification, and distribution are
+# subject to 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)
+
+using quickbook ;
+
+xml bcp : bcp.qbk ;
+boostbook standalone
+ :
+ bcp
+ :
+ # How far down we chunk nested sections, basically all of them:
+ <xsl:param>chunk.section.depth=0
+ # Path for links to Boost:
+ <xsl:param>boost.root=../../../..
+ # Path for libraries index:
+ <xsl:param>boost.libraries=../../../../libs/libraries.htm
+ # Use the main Boost stylesheet:
+ <xsl:param>html.stylesheet=../../../../doc/html/boostbook.css
+ ;
+

Added: trunk/tools/bcp/doc/bcp.qbk
==============================================================================
--- (empty file)
+++ trunk/tools/bcp/doc/bcp.qbk 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -0,0 +1,209 @@
+
+[article BCP
+ [quickbook 1.4]
+ [copyright 2209 John Maddock]
+ [purpose Regular Expressions]
+ [license
+ 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])
+ ]
+ [authors [Maddock, John]]
+ [category text]
+ [/last-revision $Date: 2008-02-21 12:58:15 +0000 (Thu, 21 Feb 2008) $]
+]
+
+[section:overview Overview]
+
+The bcp utility is a tool for extracting subsets of Boost, it's useful for Boost authors who want to distribute
+their library separately from Boost, and for Boost users who want to distribute a subset of Boost with their application.
+
+bcp can also report on which parts of Boost your code is dependent on, and what licences are used by those dependencies.
+
+[endsect]
+
+[section:examples Examples]
+
+[pre
+bcp scoped_ptr /foo
+]
+
+Copies boost/scoped_ptr.hpp and dependencies to /foo.
+
+[pre
+bcp boost/regex.hpp /foo
+]
+
+Copies boost/regex.hpp and all dependencies including the regex source code (in libs/regex/src) and
+build files (in libs/regex/build) to /foo. Does not copy the regex documentation, test, or example code.
+
+[pre
+bcp regex /foo
+]
+
+Copies the full regex lib (in libs/regex) including dependencies (such as the boost.test source required
+by the regex test programs) to /foo.
+
+[pre
+bcp --namespace=myboost --namespace-alias regex config build /foo
+]
+
+Copies the full regex lib (in libs\/regex) plus the config lib (libs\/config) and the build system (tools\/build)
+to \/foo including all the dependencies. Also renames the boost namespace to /myboost/ and changes the filenames
+of binary libraries to begin with the prefix "myboost" rather than "boost". The --namespace-alias option makes
+`namespace boost` an alias of the new name.
+
+[pre
+bcp --scan --boost=/boost foo.cpp bar.cpp boost
+]
+
+Scans the [non-boost] files foo.cpp and bar.cpp for boost dependencies and copies those dependencies to the sub-directory boost.
+
+[pre
+bcp --report regex.hpp boost-regex-report.html
+]
+
+Creates a HTML report called boost-regex-report.html for the boost module regex.hpp. The report contains license information, author details, and file dependencies.
+
+[endsect]
+
+[section:syntax Syntax]
+
+[section:main Behaviour Selection]
+
+[pre
+bcp --list \[options\] module-list
+]
+
+Outputs a list of all the files in module-list including dependencies.
+
+[pre
+bcp \[options\] module-list output-path
+]
+
+Copies all the files found in module-list to output-path
+
+[pre
+bcp --report \[options\] module-list html-file
+]
+
+Outputs a html report file containing:
+
+* All the licenses in effect, plus the files using each license, and the copyright holders using each license.
+* Any files with no recognizable license (please report these to the boost mailing lists).
+* Any files with no recognizable copyright holders (please report these to the boost mailing lists).
+* All the copyright holders and the files on which they hold copyright.
+* File dependency information - indicates the reason for the inclusion of any particular file in the dependencies found.
+
+[endsect]
+
+[section:options Options]
+
+[pre
+--boost=path
+]
+
+Sets the location of the boost tree to path. If this option is not provided then the current path is assumed to be
+the root directory of the Boost tree.
+
+[pre --namespace=newname ]
+
+When copying files, all occurances of the boost namespace will get renamed to "newname". Also
+renames Boost binaries to use "newname" rather than "boost" as a prefix.
+
+Often used in conjunction with the --namespace-alias option, this allows two different Boost versions to be
+used in the same program, but not in the same translation unit.
+
+[pre --namespace-alias]
+
+When used in conjunction with the --namespace option, then `namespace boost` will be declared as an alias
+of the new namespace name. This allows existing code that relies on Boost code being in `namespace boost`
+to compile unchanged, while retaining the "strong versioning" that can be achieved with a namespace change.
+
+[pre
+--scan
+]
+
+Treats the module list as a list of (probably non-boost) files to scan for boost dependencies,
+the files listed in the module list are not copied (or listed), only the boost files upon which they depend.
+
+[pre
+--svn
+]
+
+Only copy files under svn version control.
+
+[pre
+--unix-lines
+]
+
+Make sure that all copied files use Unix style line endings.
+
+[endsect]
+
+[section:module module-list]
+
+When the --scan option is not used then a list of boost files or library names to copy, this can be:
+
+# The name of a tool: for example "build" will find "tools/build".
+# The name of a library: for example "regex".
+# The title of a header: for example "scoped_ptr" will find "boost/scoped_ptr.hpp".
+# The name of a header: for example "scoped_ptr.hpp" will find "boost/scoped_ptr.hpp".
+# The name of a file: for example "boost/regex.hpp".
+
+When the --scan option is used, then a list of (probably non-boost) files to scan for boost dependencies,
+the files in the module list are not therefore copied/listed.
+
+[endsect]
+
+[section:output output-path]
+
+The path to which files will be copied (this path must exist).
+
+[endsect]
+
+[section Dependencies]
+
+File dependencies are found as follows:
+
+* C++ source files are scanned for #includes, all #includes present in the boost source tree will then be scanned for
+their dependencies and so on.
+* C++ source files are associated with the name of a library, if that library has source code
+(and possibly build data), then include that source in the dependencies.
+* C++ source files are checked for dependencies on Boost.test (for example to see if they use cpp_main as an entry point).
+* HTML files are scanned for immediate dependencies (images and style sheets, but not links).
+
+It should be noted that in practice bcp can produce a rather "fat" list of dependencies, reasons for this include:
+* It searches for library names first, so using "regex" as a name will give you everything in the
+libs/regex directory and everything that depends on. This can be a long list as all the regex test and example
+programs will get scanned for their dependencies. If you want a more minimal list, then try using the
+names of the headers you are actually including, or use the --scan option to scan your source code.
+* If you include the header of a library with separate source, then you get that libraries source and all
+it's dependencies. This is deliberate and in general those extra dependencies are needed.
+* When you include a header, bcp doesn't know what compiler you're using, so it follows all
+possible preprocessor paths. If you're distributing a subset of Boost with you're application then that
+is what you want to have happen in general.
+
+The last point above can result in a substantial increase in the number of headers found compared to most
+peoples expectations. For example bcp finds 274 header dependencies for boost/shared_ptr.hpp: by
+running bcp in report mode we can see why all these headers have been found as dependencies:
+
+* All of the Config library headers get included (52 headers, would be about 6 for one compiler only).
+* A lot of MPL and type traits code that includes workarounds for broken compilers that you may or may not need.
+Tracing back through the code shows that most of these aren't needed unless the user has
+defined BOOST_SP_USE_QUICK_ALLOCATOR, however bcp isn't aware of whether that preprocessor path will be
+taken or not, so the headers get included just in case. This adds about 48 headers (type traits), plus another 49 from MPL.
+* The Preprocessor library gets used heavily by MPL: this adds another 96 headers.
+* The Shared Pointer library contains a lot of platform specific code, split up into around 22 headers:
+normally your compiler would need only a couple of these files.
+
+As you can see the number of dependencies found are much larger than those used by any single compiler,
+however if you want to distribute a subset of Boost that's usable in any configuration, by any compiler,
+on any platform then that's exactly what you need. If you want to figure out which Boost headers are
+being used by your specific compiler then the best way to find out is to prepocess the code and scan
+the output for boost header includes. You should be aware that the result will be very platform and compiler
+specific, and may not contain all the headers needed if you so much as change a compiler switch
+(for example turn on threading support).
+
+[endsect]
+[endsect]

Added: trunk/tools/bcp/doc/html/index.html
==============================================================================
--- (empty file)
+++ trunk/tools/bcp/doc/html/index.html 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -0,0 +1,344 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>BCP</title>
+<link rel="stylesheet" href="../../../../doc/html/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
+<link rel="home" href="index.html" title="BCP">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center">Home</td>
+<td align="center">Libraries</td>
+<td align="center">People</td>
+<td align="center">FAQ</td>
+<td align="center">More</td>
+</tr></table>
+<hr>
+<div class="spirit-nav"></div>
+<div class="article" lang="en">
+<div class="titlepage">
+<div>
+<div><h2 class="title">
+<a name="bcp"></a>BCP</h2></div>
+<div><div class="authorgroup"><div class="author"><h3 class="author">
+<span class="firstname">John</span> <span class="surname">Maddock</span>
+</h3></div></div></div>
+<div><p class="copyright">Copyright &#169; 2209 John Maddock</p></div>
+<div><div class="legalnotice">
+<a name="id774375"></a><p>
+ 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)
+ </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="section"> Overview</span></dt>
+<dt><span class="section"> Examples</span></dt>
+<dt><span class="section"> Syntax</span></dt>
+<dd><dl>
+<dt><span class="section"> Behaviour Selection</span></dt>
+<dt><span class="section"> Options</span></dt>
+<dt><span class="section"> module-list</span></dt>
+<dt><span class="section"> output-path</span></dt>
+<dt><span class="section">Dependencies</span></dt>
+</dl></dd>
+</dl>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bcp.overview"></a><a class="link" href="index.html#bcp.overview" title="Overview"> Overview</a>
+</h2></div></div></div>
+<p>
+ The bcp utility is a tool for extracting subsets of Boost, it's useful for
+ Boost authors who want to distribute their library separately from Boost, and
+ for Boost users who want to distribute a subset of Boost with their application.
+ </p>
+<p>
+ bcp can also report on which parts of Boost your code is dependent on, and
+ what licences are used by those dependencies.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bcp.examples"></a><a class="link" href="index.html#bcp.examples" title="Examples"> Examples</a>
+</h2></div></div></div>
+<pre class="programlisting">bcp scoped_ptr /foo
+</pre>
+<p>
+ Copies boost/scoped_ptr.hpp and dependencies to /foo.
+ </p>
+<pre class="programlisting">bcp boost/regex.hpp /foo
+</pre>
+<p>
+ Copies boost/regex.hpp and all dependencies including the regex source code
+ (in libs/regex/src) and build files (in libs/regex/build) to /foo. Does not
+ copy the regex documentation, test, or example code.
+ </p>
+<pre class="programlisting">bcp regex /foo
+</pre>
+<p>
+ Copies the full regex lib (in libs/regex) including dependencies (such as the
+ boost.test source required by the regex test programs) to /foo.
+ </p>
+<pre class="programlisting">bcp --namespace=myboost --namespace-alias regex config build /foo
+</pre>
+<p>
+ Copies the full regex lib (in libs/regex) plus the config lib (libs/config)
+ and the build system (tools/build) to /foo including all the dependencies.
+ Also renames the boost namespace to <span class="emphasis"><em>myboost</em></span> and changes
+ the filenames of binary libraries to begin with the prefix "myboost"
+ rather than "boost". The --namespace-alias option makes <code class="computeroutput"><span class="keyword">namespace</span> <span class="identifier">boost</span></code>
+ an alias of the new name.
+ </p>
+<pre class="programlisting">bcp --scan --boost=/boost foo.cpp bar.cpp boost
+</pre>
+<p>
+ Scans the [non-boost] files foo.cpp and bar.cpp for boost dependencies and
+ copies those dependencies to the sub-directory boost.
+ </p>
+<pre class="programlisting">bcp --report regex.hpp boost-regex-report.html
+</pre>
+<p>
+ Creates a HTML report called boost-regex-report.html for the boost module regex.hpp.
+ The report contains license information, author details, and file dependencies.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="bcp.syntax"></a><a class="link" href="index.html#bcp.syntax" title="Syntax"> Syntax</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"> Behaviour Selection</span></dt>
+<dt><span class="section"> Options</span></dt>
+<dt><span class="section"> module-list</span></dt>
+<dt><span class="section"> output-path</span></dt>
+<dt><span class="section">Dependencies</span></dt>
+</dl></div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bcp.syntax.main"></a><a class="link" href="index.html#bcp.syntax.main" title="Behaviour Selection"> Behaviour Selection</a>
+</h3></div></div></div>
+<pre class="programlisting">bcp --list [options] module-list
+</pre>
+<p>
+ Outputs a list of all the files in module-list including dependencies.
+ </p>
+<pre class="programlisting">bcp [options] module-list output-path
+</pre>
+<p>
+ Copies all the files found in module-list to output-path
+ </p>
+<pre class="programlisting">bcp --report [options] module-list html-file
+</pre>
+<p>
+ Outputs a html report file containing:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ All the licenses in effect, plus the files using each license, and the
+ copyright holders using each license.
+ </li>
+<li>
+ Any files with no recognizable license (please report these to the boost
+ mailing lists).
+ </li>
+<li>
+ Any files with no recognizable copyright holders (please report these to
+ the boost mailing lists).
+ </li>
+<li>
+ All the copyright holders and the files on which they hold copyright.
+ </li>
+<li>
+ File dependency information - indicates the reason for the inclusion of
+ any particular file in the dependencies found.
+ </li>
+</ul></div>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bcp.syntax.options"></a><a class="link" href="index.html#bcp.syntax.options" title="Options"> Options</a>
+</h3></div></div></div>
+<pre class="programlisting">--boost=path
+</pre>
+<p>
+ Sets the location of the boost tree to path. If this option is not provided
+ then the current path is assumed to be the root directory of the Boost tree.
+ </p>
+<pre class="programlisting">--namespace=newname </pre>
+<p>
+ When copying files, all occurances of the boost namespace will get renamed
+ to "newname". Also renames Boost binaries to use "newname"
+ rather than "boost" as a prefix.
+ </p>
+<p>
+ Often used in conjunction with the --namespace-alias option, this allows
+ two different Boost versions to be used in the same program, but not in the
+ same translation unit.
+ </p>
+<pre class="programlisting">--namespace-alias</pre>
+<p>
+ When used in conjunction with the --namespace option, then <code class="computeroutput"><span class="keyword">namespace</span> <span class="identifier">boost</span></code>
+ will be declared as an alias of the new namespace name. This allows existing
+ code that relies on Boost code being in <code class="computeroutput"><span class="keyword">namespace</span>
+ <span class="identifier">boost</span></code> to compile unchanged, while
+ retaining the "strong versioning" that can be achieved with a namespace
+ change.
+ </p>
+<pre class="programlisting">--scan
+</pre>
+<p>
+ Treats the module list as a list of (probably non-boost) files to scan for
+ boost dependencies, the files listed in the module list are not copied (or
+ listed), only the boost files upon which they depend.
+ </p>
+<pre class="programlisting">--svn
+</pre>
+<p>
+ Only copy files under svn version control.
+ </p>
+<pre class="programlisting">--unix-lines
+</pre>
+<p>
+ Make sure that all copied files use Unix style line endings.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bcp.syntax.module"></a><a class="link" href="index.html#bcp.syntax.module" title="module-list"> module-list</a>
+</h3></div></div></div>
+<p>
+ When the --scan option is not used then a list of boost files or library
+ names to copy, this can be:
+ </p>
+<div class="orderedlist"><ol type="1">
+<li>
+ The name of a tool: for example "build" will find "tools/build".
+ </li>
+<li>
+ The name of a library: for example "regex".
+ </li>
+<li>
+ The title of a header: for example "scoped_ptr" will find "boost/scoped_ptr.hpp".
+ </li>
+<li>
+ The name of a header: for example "scoped_ptr.hpp" will find
+ "boost/scoped_ptr.hpp".
+ </li>
+<li>
+ The name of a file: for example "boost/regex.hpp".
+ </li>
+</ol></div>
+<p>
+ When the --scan option is used, then a list of (probably non-boost) files
+ to scan for boost dependencies, the files in the module list are not therefore
+ copied/listed.
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bcp.syntax.output"></a><a class="link" href="index.html#bcp.syntax.output" title="output-path"> output-path</a>
+</h3></div></div></div>
+<p>
+ The path to which files will be copied (this path must exist).
+ </p>
+</div>
+<div class="section" lang="en">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="bcp.syntax.dependencies"></a><a class="link" href="index.html#bcp.syntax.dependencies" title="Dependencies">Dependencies</a>
+</h3></div></div></div>
+<p>
+ File dependencies are found as follows:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ C++ source files are scanned for #includes, all #includes present in the
+ boost source tree will then be scanned for their dependencies and so on.
+ </li>
+<li>
+ C++ source files are associated with the name of a library, if that library
+ has source code (and possibly build data), then include that source in
+ the dependencies.
+ </li>
+<li>
+ C++ source files are checked for dependencies on Boost.test (for example
+ to see if they use cpp_main as an entry point).
+ </li>
+<li>
+ HTML files are scanned for immediate dependencies (images and style sheets,
+ but not links).
+ </li>
+</ul></div>
+<p>
+ It should be noted that in practice bcp can produce a rather "fat"
+ list of dependencies, reasons for this include: * It searches for library
+ names first, so using "regex" as a name will give you everything
+ in the libs/regex directory and everything that depends on. This can be a
+ long list as all the regex test and example programs will get scanned for
+ their dependencies. If you want a more minimal list, then try using the names
+ of the headers you are actually including, or use the --scan option to scan
+ your source code. * If you include the header of a library with separate
+ source, then you get that libraries source and all it's dependencies. This
+ is deliberate and in general those extra dependencies are needed. * When
+ you include a header, bcp doesn't know what compiler you're using, so it
+ follows all possible preprocessor paths. If you're distributing a subset
+ of Boost with you're application then that is what you want to have happen
+ in general.
+ </p>
+<p>
+ The last point above can result in a substantial increase in the number of
+ headers found compared to most peoples expectations. For example bcp finds
+ 274 header dependencies for boost/shared_ptr.hpp: by running bcp in report
+ mode we can see why all these headers have been found as dependencies:
+ </p>
+<div class="itemizedlist"><ul type="disc">
+<li>
+ All of the Config library headers get included (52 headers, would be about
+ 6 for one compiler only).
+ </li>
+<li>
+ A lot of MPL and type traits code that includes workarounds for broken
+ compilers that you may or may not need. Tracing back through the code shows
+ that most of these aren't needed unless the user has defined BOOST_SP_USE_QUICK_ALLOCATOR,
+ however bcp isn't aware of whether that preprocessor path will be taken
+ or not, so the headers get included just in case. This adds about 48 headers
+ (type traits), plus another 49 from MPL.
+ </li>
+<li>
+ The Preprocessor library gets used heavily by MPL: this adds another 96
+ headers.
+ </li>
+<li>
+ The Shared Pointer library contains a lot of platform specific code, split
+ up into around 22 headers: normally your compiler would need only a couple
+ of these files.
+ </li>
+</ul></div>
+<p>
+ As you can see the number of dependencies found are much larger than those
+ used by any single compiler, however if you want to distribute a subset of
+ Boost that's usable in any configuration, by any compiler, on any platform
+ then that's exactly what you need. If you want to figure out which Boost
+ headers are being used by your specific compiler then the best way to find
+ out is to prepocess the code and scan the output for boost header includes.
+ You should be aware that the result will be very platform and compiler specific,
+ and may not contain all the headers needed if you so much as change a compiler
+ switch (for example turn on threading support).
+ </p>
+</div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"><p><small>Last revised: December 28, 2009 at 13:24:19 GMT</small></p></td>
+<td align="right"><div class="copyright-footer"></div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav"></div>
+</body>
+</html>

Modified: trunk/tools/bcp/file_types.cpp
==============================================================================
--- trunk/tools/bcp/file_types.cpp (original)
+++ trunk/tools/bcp/file_types.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -19,11 +19,11 @@
    static const boost::regex e(
       ".*\\."
       "(?:"
- "c|cxx|h|hxx|inc|.?pp|yy?"
+ "c|cxx|h|hxx|inc|inl|.?pp|yy?"
       ")",
       boost::regex::perl | boost::regex::icase
       );
- return boost::regex_match(p.string(), e);
+ return boost::regex_match(p.filename(), e);
 }
 
 bool bcp_implementation::is_html_file(const fs::path& p)
@@ -34,7 +34,7 @@
          "html?|css"
       ")"
       );
- return boost::regex_match(p.string(), e);
+ return boost::regex_match(p.filename(), e);
 }
 
 bool bcp_implementation::is_binary_file(const fs::path& p)
@@ -55,3 +55,18 @@
    return !boost::regex_match(p.leaf(), e);
 
 }
+
+bool bcp_implementation::is_jam_file(const fs::path& p)
+{
+ static const boost::regex e(
+ ".*\\."
+ "(?:"
+ "jam|v2"
+ ")"
+ "|"
+ "(Jamfile|Jamroot)\\.?",
+ boost::regex::perl | boost::regex::icase
+ );
+ return boost::regex_match(p.filename(), e);
+}
+

Modified: trunk/tools/bcp/index.html
==============================================================================
--- trunk/tools/bcp/index.html (original)
+++ trunk/tools/bcp/index.html 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -1,10 +1,10 @@
 <html>
    <head>
- <meta http-equiv="refresh" content="0; URL=bcp.html">
+ <meta http-equiv="refresh" content="0; URL=doc/html/index.html">
    </head>
    <body>
       <p>
- Automatic redirection failed, please go to bcp.html.
+ Automatic redirection failed, please go to doc/html/index.html.
       </p>
       <p>Copyright&nbsp;John Maddock 2007</p>
       <p>Distributed under the Boost Software License, Version 1.0. (See accompanying file <a href="../../LICENSE_1_0.txt">

Modified: trunk/tools/bcp/main.cpp
==============================================================================
--- trunk/tools/bcp/main.cpp (original)
+++ trunk/tools/bcp/main.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -34,15 +34,17 @@
       " bcp [options] module-list output-path\n"
       "\n"
       "Options:\n"
- " --boost=path sets the location of the boost tree to path\n"
- " --scan treat the module list as a list of (possibly non-boost)\n"
- " files to scan for boost dependencies\n"
- " --cvs only copy files under cvs version control\n"
- " --unix-lines make sure that all copied files use Unix style line endings\n"
+ " --boost=path sets the location of the boost tree to path\n"
+ " --scan treat the module list as a list of (possibly non-boost)\n"
+ " files to scan for boost dependencies\n"
+ " --svn only copy files under cvs version control\n"
+ " --unix-lines make sure that all copied files use Unix style line endings\n"
+ " --namespace=name rename the boost namespace to name (also changes library names).\n"
+ " --namespace-alias Makes namespace boost an alias of the namespace set with --namespace.\n"
       "\n"
- "module-list: a list of boost files or library names to copy\n"
- "html-file: the name of a html file to which the report will be written\n"
- "output-path: the path to which files will be copied\n";
+ "module-list: a list of boost files or library names to copy\n"
+ "html-file: the name of a html file to which the report will be written\n"
+ "output-path: the path to which files will be copied\n";
 }
 
 bool filesystem_name_check( const std::string & name )
@@ -135,6 +137,14 @@
       {
          papp->set_boost_path(argv[i] + 8);
       }
+ else if(0 == std::strncmp("--namespace=", argv[i], 12))
+ {
+ papp->set_namespace(argv[i] + 12);
+ }
+ else if(0 == std::strncmp("--namespace-alias", argv[i], 17))
+ {
+ papp->set_namespace_alias(true);
+ }
       else if(argv[i][0] == '-')
       {
          std::cout << "Error: Unknown argument " << argv[i] << std::endl;

Modified: trunk/tools/bcp/output_licence_info.cpp
==============================================================================
--- trunk/tools/bcp/output_licence_info.cpp (original)
+++ trunk/tools/bcp/output_licence_info.cpp 2009-12-28 08:26:20 EST (Mon, 28 Dec 2009)
@@ -139,7 +139,7 @@
    // version):
    //
    fileview version_file(m_boost_path / "boost/version.hpp");
- boost::regex version_regex(
+ static const boost::regex version_regex(
       "^[[:blank:]]*#[[:blank:]]*define[[:blank:]]+BOOST_VERSION[[:blank:]]+(\\d+)");
    boost::cmatch what;
    if(boost::regex_search(version_file.begin(), version_file.end(), what, version_regex))


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk