| #!/usr/bin/perl -w |
| |
| use strict; |
| use File::Path; |
| |
| our $boost_dir = "boostified"; |
| |
| sub print_line |
| { |
| my ($output, $line, $from, $lineno) = @_; |
| |
| # Warn if the resulting line is >80 characters wide. |
| if (length($line) > 80) |
| { |
| if ($from =~ /\.[chi]pp$/) |
| { |
| print("Warning: $from:$lineno: output >80 characters wide.\n"); |
| } |
| } |
| |
| # Write the output. |
| print($output $line . "\n"); |
| } |
| |
| sub source_contains_asio_thread_usage |
| { |
| my ($from) = @_; |
| |
| # Open the input file. |
| open(my $input, "<$from") or die("Can't open $from for reading"); |
| |
| # Check file for use of asio::thread. |
| while (my $line = <$input>) |
| { |
| chomp($line); |
| if ($line =~ /asio::thread/) |
| { |
| close($input); |
| return 1; |
| } |
| elsif ($line =~ /^ *thread /) |
| { |
| close($input); |
| return 1; |
| } |
| } |
| |
| close($input); |
| return 0; |
| } |
| |
| sub source_contains_asio_include |
| { |
| my ($from) = @_; |
| |
| # Open the input file. |
| open(my $input, "<$from") or die("Can't open $from for reading"); |
| |
| # Check file for inclusion of asio.hpp. |
| while (my $line = <$input>) |
| { |
| chomp($line); |
| if ($line =~ /# *include [<"]asio\.hpp[>"]/) |
| { |
| close($input); |
| return 1; |
| } |
| } |
| |
| close($input); |
| return 0; |
| } |
| |
| sub copy_source_file |
| { |
| my ($from, $to) = @_; |
| |
| # Ensure the output directory exists. |
| my $dir = $to; |
| $dir =~ s/[^\/]*$//; |
| mkpath($dir); |
| |
| # First determine whether the file makes any use of asio::thread. |
| my $uses_asio_thread = source_contains_asio_thread_usage($from); |
| |
| my $includes_asio = source_contains_asio_include($from); |
| |
| my $is_asio_hpp = 0; |
| $is_asio_hpp = 1 if ($from =~ /asio\.hpp/); |
| |
| my $needs_doc_link = 0; |
| $needs_doc_link = 1 if ($is_asio_hpp); |
| |
| my $is_error_hpp = 0; |
| $is_error_hpp = 1 if ($from =~ /asio\/error\.hpp/); |
| |
| my $is_qbk = 0; |
| $is_qbk = 1 if ($from =~ /.qbk$/); |
| |
| my $is_xsl = 0; |
| $is_xsl = 1 if ($from =~ /.xsl$/); |
| |
| my $is_test = 0; |
| $is_test = 1 if ($from =~ /tests\/unit/); |
| |
| # Open the files. |
| open(my $input, "<$from") or die("Can't open $from for reading"); |
| open(my $output, ">$to") or die("Can't open $to for writing"); |
| |
| # Copy the content. |
| my $lineno = 1; |
| while (my $line = <$input>) |
| { |
| chomp($line); |
| |
| # Unconditional replacements. |
| $line =~ s/[\\@]ref boost_bind/boost::bind()/g; |
| if ($from =~ /.*\.txt$/) |
| { |
| $line =~ s/[\\@]ref async_read/boost::asio::async_read()/g; |
| $line =~ s/[\\@]ref async_write/boost::asio::async_write()/g; |
| } |
| if ($line =~ /asio_detail_posix_thread_function/) |
| { |
| $line =~ s/asio_detail_posix_thread_function/boost_asio_detail_posix_thread_function/g; |
| } |
| if ($line =~ /asio_signal_handler/) |
| { |
| $line =~ s/asio_signal_handler/boost_asio_signal_handler/g; |
| } |
| if ($line =~ /ASIO_/ && !($line =~ /BOOST_ASIO_/)) |
| { |
| $line =~ s/ASIO_/BOOST_ASIO_/g; |
| } |
| |
| # Extra replacements for quickbook and XSL source only. |
| if ($is_qbk || $is_xsl) |
| { |
| $line =~ s/asio\.examples/boost_asio.examples/g; |
| $line =~ s/asio\.history/boost_asio.history/g; |
| $line =~ s/asio\.index/boost_asio.index/g; |
| $line =~ s/asio\.overview/boost_asio.overview/g; |
| $line =~ s/asio\.reference/boost_asio.reference/g; |
| $line =~ s/asio\.tutorial/boost_asio.tutorial/g; |
| $line =~ s/asio\.using/boost_asio.using/g; |
| $line =~ s/Asio/Boost.Asio/g; |
| $line =~ s/changes made in each release/changes made in each Boost release/g; |
| $line =~ s/\[\$/[\$boost_asio\//g; |
| $line =~ s/\[@\.\.\/src\/examples/[\@boost_asio\/example/g; |
| $line =~ s/include\/asio/boost\/asio/g; |
| $line =~ s/\^asio/^boost\/asio/g; |
| $line =~ s/namespaceasio/namespaceboost_1_1asio/g; |
| $line =~ s/ \(\[\@examples\/diffs.*$//; |
| } |
| |
| # Conditional replacements. |
| if ($line =~ /^( *)namespace asio {/) |
| { |
| if ($is_qbk) |
| { |
| print_line($output, $1 . "namespace boost { namespace asio {", $from, $lineno); |
| } |
| else |
| { |
| print_line($output, $1 . "namespace boost {", $from, $lineno); |
| print_line($output, $line, $from, $lineno); |
| } |
| } |
| elsif ($line =~ /^( *)} \/\/ namespace asio$/) |
| { |
| if ($is_qbk) |
| { |
| print_line($output, $1 . "} } // namespace boost::asio", $from, $lineno); |
| } |
| else |
| { |
| print_line($output, $line, $from, $lineno); |
| print_line($output, $1 . "} // namespace boost", $from, $lineno); |
| } |
| } |
| elsif ($line =~ /^(# *include )[<"](asio\.hpp)[>"]$/) |
| { |
| print_line($output, $1 . "<boost/" . $2 . ">", $from, $lineno); |
| if ($uses_asio_thread) |
| { |
| print_line($output, $1 . "<boost/thread/thread.hpp>", $from, $lineno) if (!$is_test); |
| $uses_asio_thread = 0; |
| } |
| } |
| elsif ($line =~ /^(# *include )[<"]boost\/.*[>"].*$/) |
| { |
| if (!$includes_asio && $uses_asio_thread) |
| { |
| print_line($output, $1 . "<boost/thread/thread.hpp>", $from, $lineno) if (!$is_test); |
| $uses_asio_thread = 0; |
| } |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /^(# *include )[<"]asio\/thread\.hpp[>"]/) |
| { |
| if ($is_test) |
| { |
| print_line($output, $1 . "<boost/asio/detail/thread.hpp>", $from, $lineno); |
| } |
| else |
| { |
| # Line is removed. |
| } |
| } |
| elsif ($line =~ /(# *include )[<"]asio\/error_code\.hpp[>"]/) |
| { |
| if ($is_asio_hpp) |
| { |
| # Line is removed. |
| } |
| else |
| { |
| print_line($output, $1 . "<boost/cerrno.hpp>", $from, $lineno) if ($is_error_hpp); |
| print_line($output, $1 . "<boost/system/error_code.hpp>", $from, $lineno); |
| } |
| } |
| elsif ($line =~ /# *include [<"]asio\/impl\/error_code\.[hi]pp[>"]/) |
| { |
| # Line is removed. |
| } |
| elsif ($line =~ /(# *include )[<"]asio\/system_error\.hpp[>"]/) |
| { |
| if ($is_asio_hpp) |
| { |
| # Line is removed. |
| } |
| else |
| { |
| print_line($output, $1 . "<boost/system/system_error.hpp>", $from, $lineno); |
| } |
| } |
| elsif ($line =~ /(^.*# *include )[<"](asio\/[^>"]*)[>"](.*)$/) |
| { |
| print_line($output, $1 . "<boost/" . $2 . ">" . $3, $from, $lineno); |
| } |
| elsif ($line =~ /#.*defined\(.*ASIO_HAS_STD_SYSTEM_ERROR\)$/) |
| { |
| # Line is removed. |
| } |
| elsif ($line =~ /asio::thread/) |
| { |
| if ($is_test) |
| { |
| $line =~ s/asio::thread/asio::detail::thread/g; |
| } |
| else |
| { |
| $line =~ s/asio::thread/boost::thread/g; |
| } |
| if (!($line =~ /boost::asio::/)) |
| { |
| $line =~ s/asio::/boost::asio::/g; |
| } |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /^( *)thread( .*)$/ && !$is_qbk) |
| { |
| if ($is_test) |
| { |
| print_line($output, $1 . "boost::asio::detail::thread" . $2, $from, $lineno); |
| } |
| else |
| { |
| print_line($output, $1 . "boost::thread" . $2, $from, $lineno); |
| } |
| } |
| elsif ($line =~ /namespace std {/) |
| { |
| print_line($output, "namespace boost {", $from, $lineno); |
| print_line($output, "namespace system {", $from, $lineno); |
| } |
| elsif ($line =~ /std::error_code/) |
| { |
| $line =~ s/std::error_code/boost::system::error_code/g; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /} \/\/ namespace std/) |
| { |
| print_line($output, "} // namespace system", $from, $lineno); |
| print_line($output, "} // namespace boost", $from, $lineno); |
| } |
| elsif ($line =~ /asio::/ && !($line =~ /boost::asio::/)) |
| { |
| $line =~ s/asio::error_code/boost::system::error_code/g; |
| $line =~ s/asio::error_category/boost::system::error_category/g; |
| $line =~ s/asio::system_category/boost::system::system_category/g; |
| $line =~ s/asio::system_error/boost::system::system_error/g; |
| $line =~ s/asio::/boost::asio::/g if !$is_xsl; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /using namespace asio/) |
| { |
| $line =~ s/using namespace asio/using namespace boost::asio/g; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /asio_handler_alloc_helpers/) |
| { |
| $line =~ s/asio_handler_alloc_helpers/boost_asio_handler_alloc_helpers/g; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /asio_handler_cont_helpers/) |
| { |
| $line =~ s/asio_handler_cont_helpers/boost_asio_handler_cont_helpers/g; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /asio_handler_invoke_helpers/) |
| { |
| $line =~ s/asio_handler_invoke_helpers/boost_asio_handler_invoke_helpers/g; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /[\\@]ref boost_bind/) |
| { |
| $line =~ s/[\\@]ref boost_bind/boost::bind()/g; |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /( *)\[category template\]/) |
| { |
| print_line($output, $1 . "[authors [Kohlhoff, Christopher]]", $from, $lineno); |
| print_line($output, $line, $from, $lineno); |
| } |
| elsif ($line =~ /boostify: non-boost docs start here/) |
| { |
| while ($line = <$input>) |
| { |
| last if $line =~ /boostify: non-boost docs end here/; |
| } |
| } |
| elsif ($line =~ /boostify: non-boost code starts here/) |
| { |
| while ($line = <$input>) |
| { |
| last if $line =~ /boostify: non-boost code ends here/; |
| } |
| } |
| elsif ($line =~ /^$/ && $needs_doc_link) |
| { |
| $needs_doc_link = 0; |
| print_line($output, "// See www.boost.org/libs/asio for documentation.", $from, $lineno); |
| print_line($output, "//", $from, $lineno); |
| print_line($output, $line, $from, $lineno); |
| } |
| else |
| { |
| print_line($output, $line, $from, $lineno); |
| } |
| ++$lineno; |
| } |
| |
| # Ok, we're done. |
| close($input); |
| close($output); |
| } |
| |
| sub copy_include_files |
| { |
| my @dirs = ( |
| "include", |
| "include/asio", |
| "include/asio/detail", |
| "include/asio/detail/impl", |
| "include/asio/generic", |
| "include/asio/generic/detail", |
| "include/asio/generic/detail/impl", |
| "include/asio/impl", |
| "include/asio/ip", |
| "include/asio/ip/impl", |
| "include/asio/ip/detail", |
| "include/asio/ip/detail/impl", |
| "include/asio/local", |
| "include/asio/local/detail", |
| "include/asio/local/detail/impl", |
| "include/asio/posix", |
| "include/asio/ssl", |
| "include/asio/ssl/detail", |
| "include/asio/ssl/detail/impl", |
| "include/asio/ssl/impl", |
| "include/asio/ssl/old", |
| "include/asio/ssl/old/detail", |
| "include/asio/windows"); |
| |
| foreach my $dir (@dirs) |
| { |
| our $boost_dir; |
| my @files = ( glob("$dir/*.hpp"), glob("$dir/*.ipp"), glob("$dir/*cpp") ); |
| foreach my $file (@files) |
| { |
| if ($file ne "include/asio/thread.hpp" |
| and $file ne "include/asio/error_code.hpp" |
| and $file ne "include/asio/system_error.hpp" |
| and $file ne "include/asio/impl/error_code.hpp" |
| and $file ne "include/asio/impl/error_code.ipp") |
| { |
| my $from = $file; |
| my $to = $file; |
| $to =~ s/^include\//$boost_dir\/libs\/asio\/include\/boost\//; |
| copy_source_file($from, $to); |
| } |
| } |
| } |
| } |
| |
| sub create_lib_directory |
| { |
| my @dirs = ( |
| "doc", |
| "example", |
| "test"); |
| |
| our $boost_dir; |
| foreach my $dir (@dirs) |
| { |
| mkpath("$boost_dir/libs/asio/$dir"); |
| } |
| } |
| |
| sub copy_unit_tests |
| { |
| my @dirs = ( |
| "src/tests/unit", |
| "src/tests/unit/archetypes", |
| "src/tests/unit/generic", |
| "src/tests/unit/ip", |
| "src/tests/unit/local", |
| "src/tests/unit/posix", |
| "src/tests/unit/ssl", |
| "src/tests/unit/windows"); |
| |
| our $boost_dir; |
| foreach my $dir (@dirs) |
| { |
| my @files = ( glob("$dir/*.*pp"), glob("$dir/Jamfile*") ); |
| foreach my $file (@files) |
| { |
| if ($file ne "src/tests/unit/thread.cpp" |
| and $file ne "src/tests/unit/error_handler.cpp" |
| and $file ne "src/tests/unit/unit_test.cpp") |
| { |
| my $from = $file; |
| my $to = $file; |
| $to =~ s/^src\/tests\/unit\//$boost_dir\/libs\/asio\/test\//; |
| copy_source_file($from, $to); |
| } |
| } |
| } |
| } |
| |
| sub copy_latency_tests |
| { |
| my @dirs = ( |
| "src/tests/latency"); |
| |
| our $boost_dir; |
| foreach my $dir (@dirs) |
| { |
| my @files = ( glob("$dir/*.*pp"), glob("$dir/Jamfile*") ); |
| foreach my $file (@files) |
| { |
| my $from = $file; |
| my $to = $file; |
| $to =~ s/^src\/tests\/latency\//$boost_dir\/libs\/asio\/test\/latency\//; |
| copy_source_file($from, $to); |
| } |
| } |
| } |
| |
| sub copy_examples |
| { |
| my @dirs = ( |
| "src/examples/cpp03/allocation", |
| "src/examples/cpp03/buffers", |
| "src/examples/cpp03/chat", |
| "src/examples/cpp03/echo", |
| "src/examples/cpp03/fork", |
| "src/examples/cpp03/http/client", |
| "src/examples/cpp03/http/doc_root", |
| "src/examples/cpp03/http/server", |
| "src/examples/cpp03/http/server2", |
| "src/examples/cpp03/http/server3", |
| "src/examples/cpp03/http/server4", |
| "src/examples/cpp03/icmp", |
| "src/examples/cpp03/invocation", |
| "src/examples/cpp03/iostreams", |
| "src/examples/cpp03/local", |
| "src/examples/cpp03/multicast", |
| "src/examples/cpp03/nonblocking", |
| "src/examples/cpp03/porthopper", |
| "src/examples/cpp03/serialization", |
| "src/examples/cpp03/services", |
| "src/examples/cpp03/socks4", |
| "src/examples/cpp03/spawn", |
| "src/examples/cpp03/ssl", |
| "src/examples/cpp03/timeouts", |
| "src/examples/cpp03/timers", |
| "src/examples/cpp03/tutorial", |
| "src/examples/cpp03/tutorial/daytime1", |
| "src/examples/cpp03/tutorial/daytime2", |
| "src/examples/cpp03/tutorial/daytime3", |
| "src/examples/cpp03/tutorial/daytime4", |
| "src/examples/cpp03/tutorial/daytime5", |
| "src/examples/cpp03/tutorial/daytime6", |
| "src/examples/cpp03/tutorial/daytime7", |
| "src/examples/cpp03/tutorial/timer1", |
| "src/examples/cpp03/tutorial/timer2", |
| "src/examples/cpp03/tutorial/timer3", |
| "src/examples/cpp03/tutorial/timer4", |
| "src/examples/cpp03/tutorial/timer5", |
| "src/examples/cpp03/windows", |
| "src/examples/cpp11/allocation", |
| "src/examples/cpp11/buffers", |
| "src/examples/cpp11/chat", |
| "src/examples/cpp11/echo", |
| "src/examples/cpp11/executors", |
| "src/examples/cpp11/futures", |
| "src/examples/cpp11/http/server", |
| "src/examples/cpp11/iostreams", |
| "src/examples/cpp11/spawn", |
| "src/examples/cpp14/executors"); |
| |
| our $boost_dir; |
| foreach my $dir (@dirs) |
| { |
| my @files = ( |
| glob("$dir/*.*pp"), |
| glob("$dir/*.html"), |
| glob("$dir/Jamfile*"), |
| glob("$dir/*.pem"), |
| glob("$dir/README*"), |
| glob("$dir/*.txt")); |
| foreach my $file (@files) |
| { |
| my $from = $file; |
| my $to = $file; |
| $to =~ s/^src\/examples\//$boost_dir\/libs\/asio\/example\//; |
| copy_source_file($from, $to); |
| } |
| } |
| } |
| |
| sub copy_doc |
| { |
| our $boost_dir; |
| my @files = ( |
| "src/doc/asio.qbk", |
| "src/doc/examples.qbk", |
| "src/doc/reference.xsl", |
| "src/doc/tutorial.xsl", |
| glob("src/doc/overview/*.qbk"), |
| glob("src/doc/requirements/*.qbk")); |
| foreach my $file (@files) |
| { |
| my $from = $file; |
| my $to = $file; |
| $to =~ s/^src\/doc\//$boost_dir\/libs\/asio\/doc\//; |
| copy_source_file($from, $to); |
| } |
| } |
| |
| sub copy_tools |
| { |
| our $boost_dir; |
| my @files = ( |
| glob("src/tools/*.pl")); |
| foreach my $file (@files) |
| { |
| my $from = $file; |
| my $to = $file; |
| $to =~ s/^src\/tools\//$boost_dir\/libs\/asio\/tools\//; |
| copy_source_file($from, $to); |
| } |
| } |
| |
| copy_include_files(); |
| create_lib_directory(); |
| copy_unit_tests(); |
| copy_latency_tests(); |
| copy_examples(); |
| copy_doc(); |
| copy_tools(); |