Revision: 425 Author: alai04 Date: Sun Aug 22 23:21:17 2010 Log: 升级至1.44.0,第一批,libs/目录d-f子目录 新增 msm, polygon 两个子库 http://code.google.com/p/boost-doc-zh/source/detail?r=425 Added: /trunk/libs/detail /trunk/libs/detail/utf8_codecvt_facet.cpp /trunk/libs/filesystem/v2 /trunk/libs/filesystem/v2/build /trunk/libs/filesystem/v2/build/Jamfile.v2 /trunk/libs/filesystem/v3 /trunk/libs/filesystem/v3/build /trunk/libs/filesystem/v3/build/Jamfile.v2 /trunk/libs/filesystem/v3/doc /trunk/libs/filesystem/v3/doc/Jamfile.v2 /trunk/libs/filesystem/v3/doc/POSIX_filename_encoding.txt /trunk/libs/filesystem/v3/doc/deprecated.html /trunk/libs/filesystem/v3/doc/design.htm /trunk/libs/filesystem/v3/doc/do_list.html /trunk/libs/filesystem/v3/doc/faq.htm /trunk/libs/filesystem/v3/doc/index.htm /trunk/libs/filesystem/v3/doc/path_table.cpp /trunk/libs/filesystem/v3/doc/path_table.txt /trunk/libs/filesystem/v3/doc/portability_guide.htm /trunk/libs/filesystem/v3/doc/reference.html /trunk/libs/filesystem/v3/doc/tutorial.html /trunk/libs/filesystem/v3/doc/v3.html /trunk/libs/filesystem/v3/doc/v3_design.html /trunk/libs/filesystem/v3/example /trunk/libs/filesystem/v3/example/Jamfile.v2 /trunk/libs/filesystem/v3/example/error_demo.cpp /trunk/libs/filesystem/v3/example/file_size.cpp /trunk/libs/filesystem/v3/example/mbcopy.cpp /trunk/libs/filesystem/v3/example/mbpath.cpp /trunk/libs/filesystem/v3/example/mbpath.hpp /trunk/libs/filesystem/v3/example/path_info.cpp /trunk/libs/filesystem/v3/example/simple_ls.cpp /trunk/libs/filesystem/v3/example/tchar.cpp /trunk/libs/filesystem/v3/example/test /trunk/libs/filesystem/v3/example/test/Jamfile.v2 /trunk/libs/filesystem/v3/example/test/bld.bat /trunk/libs/filesystem/v3/example/test/bld.sh /trunk/libs/filesystem/v3/example/test/setup.bat /trunk/libs/filesystem/v3/example/test/setup.sh /trunk/libs/filesystem/v3/example/tut0.cpp /trunk/libs/filesystem/v3/example/tut1.cpp /trunk/libs/filesystem/v3/example/tut2.cpp /trunk/libs/filesystem/v3/example/tut3.cpp /trunk/libs/filesystem/v3/example/tut4.cpp /trunk/libs/filesystem/v3/example/tut5.cpp /trunk/libs/filesystem/v3/index.html /trunk/libs/filesystem/v3/src /trunk/libs/filesystem/v3/src/codecvt_error_category.cpp /trunk/libs/filesystem/v3/src/operations.cpp /trunk/libs/filesystem/v3/src/path.cpp /trunk/libs/filesystem/v3/src/path_traits.cpp /trunk/libs/filesystem/v3/src/portability.cpp /trunk/libs/filesystem/v3/src/unique_path.cpp /trunk/libs/filesystem/v3/src/utf8_codecvt_facet.cpp /trunk/libs/filesystem/v3/src/windows_file_codecvt.cpp /trunk/libs/filesystem/v3/src/windows_file_codecvt.hpp /trunk/libs/filesystem/v3/test /trunk/libs/filesystem/v3/test/Jamfile.v2 /trunk/libs/filesystem/v3/test/convenience_test.cpp /trunk/libs/filesystem/v3/test/deprecated_test.cpp /trunk/libs/filesystem/v3/test/design_use_cases.cpp /trunk/libs/filesystem/v3/test/equivalent.cpp /trunk/libs/filesystem/v3/test/fstream_test.cpp /trunk/libs/filesystem/v3/test/large_file_support_test.cpp /trunk/libs/filesystem/v3/test/msvc /trunk/libs/filesystem/v3/test/msvc/common.vsprops /trunk/libs/filesystem/v3/test/msvc/convenience_test/trunk/libs/filesystem/v3/test/msvc/convenience_test/convenience_test.vcproj
/trunk/libs/filesystem/v3/test/msvc/deprecated_test /trunk/libs/filesystem/v3/test/msvc/deprecated_test/deprecated_test.vcproj /trunk/libs/filesystem/v3/test/msvc/error_demo /trunk/libs/filesystem/v3/test/msvc/error_demo/error_demo.vcproj /trunk/libs/filesystem/v3/test/msvc/filesystem-v3.sln /trunk/libs/filesystem/v3/test/msvc/filesystem_dll /trunk/libs/filesystem/v3/test/msvc/filesystem_dll/filesystem_dll.vcproj /trunk/libs/filesystem/v3/test/msvc/fstream_test /trunk/libs/filesystem/v3/test/msvc/fstream_test/fstream_test.vcproj /trunk/libs/filesystem/v3/test/msvc/operations_test /trunk/libs/filesystem/v3/test/msvc/operations_test/operations_test.vcproj /trunk/libs/filesystem/v3/test/msvc/operations_unit_test/trunk/libs/filesystem/v3/test/msvc/operations_unit_test/operations_unit_test.vcproj
/trunk/libs/filesystem/v3/test/msvc/path_test /trunk/libs/filesystem/v3/test/msvc/path_test/path_test.vcproj /trunk/libs/filesystem/v3/test/msvc/path_test_dynamic_link/trunk/libs/filesystem/v3/test/msvc/path_test_dynamic_link/path_test_dynamic_linkl.vcproj
/trunk/libs/filesystem/v3/test/msvc/path_unit_test /trunk/libs/filesystem/v3/test/msvc/path_unit_test/path_unit_test.vcproj /trunk/libs/filesystem/v3/test/msvc/simple_ls /trunk/libs/filesystem/v3/test/msvc/simple_ls/simple_ls.vcproj /trunk/libs/filesystem/v3/test/msvc/system_dll /trunk/libs/filesystem/v3/test/msvc/system_dll/system_dll.vcproj /trunk/libs/filesystem/v3/test/msvc/tchar_example /trunk/libs/filesystem/v3/test/msvc/tchar_example/tchar_example.vcproj /trunk/libs/filesystem/v3/test/msvc/tut0 /trunk/libs/filesystem/v3/test/msvc/tut0/tut0.vcproj /trunk/libs/filesystem/v3/test/msvc/tut1 /trunk/libs/filesystem/v3/test/msvc/tut1/tut1.vcproj /trunk/libs/filesystem/v3/test/msvc/tut2 /trunk/libs/filesystem/v3/test/msvc/tut2/tut2.vcproj /trunk/libs/filesystem/v3/test/msvc/tut3 /trunk/libs/filesystem/v3/test/msvc/tut3/tut3.vcproj /trunk/libs/filesystem/v3/test/msvc/tut4 /trunk/libs/filesystem/v3/test/msvc/tut4/tut4.vcproj /trunk/libs/filesystem/v3/test/msvc/wide_test /trunk/libs/filesystem/v3/test/msvc/wide_test/wide_test.vcproj /trunk/libs/filesystem/v3/test/msvc10 /trunk/libs/filesystem/v3/test/msvc10/common.props /trunk/libs/filesystem/v3/test/msvc10/convenience_test/trunk/libs/filesystem/v3/test/msvc10/convenience_test/convenience_test.vcxproj
/trunk/libs/filesystem/v3/test/msvc10/deprecated_test/trunk/libs/filesystem/v3/test/msvc10/deprecated_test/deprecated_test.vcxproj
/trunk/libs/filesystem/v3/test/msvc10/filesystem-v3.sln /trunk/libs/filesystem/v3/test/msvc10/filesystem_dll /trunk/libs/filesystem/v3/test/msvc10/filesystem_dll/filesystem_dll.vcxproj /trunk/libs/filesystem/v3/test/msvc10/fstream_test /trunk/libs/filesystem/v3/test/msvc10/fstream_test/fstream_test.vcxproj /trunk/libs/filesystem/v3/test/msvc10/operations_test/trunk/libs/filesystem/v3/test/msvc10/operations_test/operations_test.vcxproj
/trunk/libs/filesystem/v3/test/msvc10/operations_unit_test/trunk/libs/filesystem/v3/test/msvc10/operations_unit_test/operations_unit_test.vcxproj
/trunk/libs/filesystem/v3/test/msvc10/path_test /trunk/libs/filesystem/v3/test/msvc10/path_test/path_test.vcxproj /trunk/libs/filesystem/v3/test/msvc10/path_unit_test /trunk/libs/filesystem/v3/test/msvc10/path_unit_test/path_unit_test.vcxproj /trunk/libs/filesystem/v3/test/msvc10/system_dll /trunk/libs/filesystem/v3/test/msvc10/system_dll/system_dll.vcxproj /trunk/libs/filesystem/v3/test/msvc10/tut1 /trunk/libs/filesystem/v3/test/msvc10/tut1/tut1.vcxproj /trunk/libs/filesystem/v3/test/msvc10/tut2 /trunk/libs/filesystem/v3/test/msvc10/tut2/tut2.vcxproj /trunk/libs/filesystem/v3/test/msvc10/tut3 /trunk/libs/filesystem/v3/test/msvc10/tut3/tut3.vcxproj /trunk/libs/filesystem/v3/test/msvc10/tut4 /trunk/libs/filesystem/v3/test/msvc10/tut4/tut4.vcxproj /trunk/libs/filesystem/v3/test/operations_test.cpp /trunk/libs/filesystem/v3/test/operations_unit_test.cpp /trunk/libs/filesystem/v3/test/path_test.cpp /trunk/libs/filesystem/v3/test/path_unit_test.cpp /trunk/libs/filesystem/v3/test/test_codecvt.hpp /trunk/libs/format/test /trunk/libs/format/test/Jamfile.v2 /trunk/libs/format/test/format_test1.cpp /trunk/libs/format/test/format_test2.cpp /trunk/libs/format/test/format_test3.cpp /trunk/libs/format/test/format_test_enum.cpp /trunk/libs/format/test/format_test_wstring.cpp /trunk/libs/functional/hash/test/implicit_fail_test.cpp /trunk/libs/functional/hash/test/shared_ptr_fail_test.cpp/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/iter_fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/reverse_fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/reverse_iter_fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/iter_fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/reverse_fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/reverse_iter_fold.html
/trunk/libs/fusion/doc/html/fusion/view/repetitive_view.html /trunk/libs/fusion/test/algorithm/fold.hpp /trunk/libs/fusion/test/algorithm/fold2.cpp /trunk/libs/fusion/test/algorithm/iter_fold.cpp /trunk/libs/fusion/test/algorithm/reverse_fold.cpp /trunk/libs/fusion/test/algorithm/reverse_iter_fold.cpp /trunk/libs/msm /trunk/libs/msm/doc /trunk/libs/msm/doc/HTML /trunk/libs/msm/doc/HTML/boostbook.css /trunk/libs/msm/doc/HTML/ch01.html /trunk/libs/msm/doc/HTML/ch02.html /trunk/libs/msm/doc/HTML/ch02s02.html /trunk/libs/msm/doc/HTML/ch02s03.html /trunk/libs/msm/doc/HTML/ch03.html /trunk/libs/msm/doc/HTML/ch03s02.html /trunk/libs/msm/doc/HTML/ch03s03.html /trunk/libs/msm/doc/HTML/ch03s04.html /trunk/libs/msm/doc/HTML/ch03s05.html /trunk/libs/msm/doc/HTML/ch04.html /trunk/libs/msm/doc/HTML/ch04s02.html /trunk/libs/msm/doc/HTML/ch04s03.html /trunk/libs/msm/doc/HTML/ch04s04.html /trunk/libs/msm/doc/HTML/ch04s05.html /trunk/libs/msm/doc/HTML/ch05.html /trunk/libs/msm/doc/HTML/ch06.html /trunk/libs/msm/doc/HTML/ch06s02.html /trunk/libs/msm/doc/HTML/ch06s03.html /trunk/libs/msm/doc/HTML/ch06s04.html /trunk/libs/msm/doc/HTML/ch07.html /trunk/libs/msm/doc/HTML/ch07s02.html /trunk/libs/msm/doc/HTML/ch08.html /trunk/libs/msm/doc/HTML/ch09.html /trunk/libs/msm/doc/HTML/ch10.html /trunk/libs/msm/doc/HTML/examples /trunk/libs/msm/doc/HTML/examples/AnonymousTutorial.cpp /trunk/libs/msm/doc/HTML/examples/AnonymousTutorialEuml.cpp /trunk/libs/msm/doc/HTML/examples/AnonymousTutorialWithFunctors.cpp /trunk/libs/msm/doc/HTML/examples/BoostCon09Full.cpp /trunk/libs/msm/doc/HTML/examples/CompilerStressTestEuml.cpp /trunk/libs/msm/doc/HTML/examples/CompositeTutorial.cpp /trunk/libs/msm/doc/HTML/examples/CompositeTutorialEuml.cpp /trunk/libs/msm/doc/HTML/examples/DirectEntryEuml.cpp /trunk/libs/msm/doc/HTML/examples/DirectEntryTutorial.cpp /trunk/libs/msm/doc/HTML/examples/EumlInternal.cpp /trunk/libs/msm/doc/HTML/examples/EumlInternalDistributed.cpp /trunk/libs/msm/doc/HTML/examples/EumlSimple.cpp /trunk/libs/msm/doc/HTML/examples/Flags.cpp /trunk/libs/msm/doc/HTML/examples/History.cpp /trunk/libs/msm/doc/HTML/examples/HistoryEuml.cpp /trunk/libs/msm/doc/HTML/examples/MsmComposite.cpp /trunk/libs/msm/doc/HTML/examples/MsmSimple.cpp /trunk/libs/msm/doc/HTML/examples/MsmSimpleFunctors.cpp /trunk/libs/msm/doc/HTML/examples/Orthogonal-deferred.cpp /trunk/libs/msm/doc/HTML/examples/Orthogonal-deferred2.cpp /trunk/libs/msm/doc/HTML/examples/OrthogonalDeferredEuml.cpp /trunk/libs/msm/doc/HTML/examples/OrthogonalDeferredEuml2.cpp /trunk/libs/msm/doc/HTML/examples/ParsingDigits.cpp /trunk/libs/msm/doc/HTML/examples/SCComposite.cpp /trunk/libs/msm/doc/HTML/examples/SCSimple.cpp /trunk/libs/msm/doc/HTML/examples/SM-2Arg.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTimer.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorial.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorial2.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorialEuml.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorialEuml2.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorialInternal.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorialInternal2.cpp /trunk/libs/msm/doc/HTML/examples/SimpleTutorialInternalFunctors.cpp /trunk/libs/msm/doc/HTML/examples/SimpleWithFunctors.cpp /trunk/libs/msm/doc/HTML/examples/SimpleWithFunctors2.cpp /trunk/libs/msm/doc/HTML/examples/SimpleWithFunctors3.cpp /trunk/libs/msm/doc/HTML/examples/TestInternal.cpp /trunk/libs/msm/doc/HTML/examples/char_event_dispatcher.hpp /trunk/libs/msm/doc/HTML/examples/distributed_table /trunk/libs/msm/doc/HTML/examples/distributed_table/DistributedTable.cpp /trunk/libs/msm/doc/HTML/examples/distributed_table/Empty.cpp /trunk/libs/msm/doc/HTML/examples/distributed_table/Empty.hpp /trunk/libs/msm/doc/HTML/examples/distributed_table/Events.hpp /trunk/libs/msm/doc/HTML/examples/distributed_table/Open.cpp /trunk/libs/msm/doc/HTML/examples/distributed_table/Open.hpp /trunk/libs/msm/doc/HTML/examples/iPodEuml.cpp /trunk/libs/msm/doc/HTML/examples/iPodSearch.cpp /trunk/libs/msm/doc/HTML/examples/iPodSearchEuml.cpp /trunk/libs/msm/doc/HTML/examples/iPod_distributed /trunk/libs/msm/doc/HTML/examples/iPod_distributed/Events.hpp /trunk/libs/msm/doc/HTML/examples/iPod_distributed/MenuMode.cpp /trunk/libs/msm/doc/HTML/examples/iPod_distributed/MenuMode.hpp /trunk/libs/msm/doc/HTML/examples/iPod_distributed/PlayingMode.cpp /trunk/libs/msm/doc/HTML/examples/iPod_distributed/PlayingMode.hpp /trunk/libs/msm/doc/HTML/examples/iPod_distributed/iPod.cpp /trunk/libs/msm/doc/HTML/examples/ipod_functors.hpp /trunk/libs/msm/doc/HTML/examples/logging_functors.h /trunk/libs/msm/doc/HTML/index.html /trunk/libs/msm/doc/HTML/pr01.html /trunk/libs/msm/doc/HTML/pt01.html /trunk/libs/msm/doc/HTML/pt02.html /trunk/libs/msm/doc/HTML/re01.html /trunk/libs/msm/doc/HTML/re02.html /trunk/libs/msm/doc/HTML/re03.html /trunk/libs/msm/doc/PDF /trunk/libs/msm/doc/PDF/examples /trunk/libs/msm/doc/PDF/examples/AnonymousTutorial.cpp /trunk/libs/msm/doc/PDF/examples/AnonymousTutorialEuml.cpp /trunk/libs/msm/doc/PDF/examples/AnonymousTutorialWithFunctors.cpp /trunk/libs/msm/doc/PDF/examples/BoostCon09Full.cpp /trunk/libs/msm/doc/PDF/examples/CompilerStressTestEuml.cpp /trunk/libs/msm/doc/PDF/examples/CompositeTutorial.cpp /trunk/libs/msm/doc/PDF/examples/CompositeTutorialEuml.cpp /trunk/libs/msm/doc/PDF/examples/DirectEntryEuml.cpp /trunk/libs/msm/doc/PDF/examples/DirectEntryTutorial.cpp /trunk/libs/msm/doc/PDF/examples/EumlInternal.cpp /trunk/libs/msm/doc/PDF/examples/EumlInternalDistributed.cpp /trunk/libs/msm/doc/PDF/examples/EumlSimple.cpp /trunk/libs/msm/doc/PDF/examples/Flags.cpp /trunk/libs/msm/doc/PDF/examples/History.cpp /trunk/libs/msm/doc/PDF/examples/HistoryEuml.cpp /trunk/libs/msm/doc/PDF/examples/MsmComposite.cpp /trunk/libs/msm/doc/PDF/examples/MsmSimple.cpp /trunk/libs/msm/doc/PDF/examples/MsmSimpleFunctors.cpp /trunk/libs/msm/doc/PDF/examples/Orthogonal-deferred.cpp /trunk/libs/msm/doc/PDF/examples/Orthogonal-deferred2.cpp /trunk/libs/msm/doc/PDF/examples/OrthogonalDeferredEuml.cpp /trunk/libs/msm/doc/PDF/examples/OrthogonalDeferredEuml2.cpp /trunk/libs/msm/doc/PDF/examples/ParsingDigits.cpp /trunk/libs/msm/doc/PDF/examples/SCComposite.cpp /trunk/libs/msm/doc/PDF/examples/SCSimple.cpp /trunk/libs/msm/doc/PDF/examples/SM-2Arg.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTimer.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorial.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorial2.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorialEuml.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorialEuml2.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorialInternal.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorialInternal2.cpp /trunk/libs/msm/doc/PDF/examples/SimpleTutorialInternalFunctors.cpp /trunk/libs/msm/doc/PDF/examples/SimpleWithFunctors.cpp /trunk/libs/msm/doc/PDF/examples/SimpleWithFunctors2.cpp /trunk/libs/msm/doc/PDF/examples/SimpleWithFunctors3.cpp /trunk/libs/msm/doc/PDF/examples/TestInternal.cpp /trunk/libs/msm/doc/PDF/examples/char_event_dispatcher.hpp /trunk/libs/msm/doc/PDF/examples/distributed_table /trunk/libs/msm/doc/PDF/examples/distributed_table/DistributedTable.cpp /trunk/libs/msm/doc/PDF/examples/distributed_table/Empty.cpp /trunk/libs/msm/doc/PDF/examples/distributed_table/Empty.hpp /trunk/libs/msm/doc/PDF/examples/distributed_table/Events.hpp /trunk/libs/msm/doc/PDF/examples/distributed_table/Open.cpp /trunk/libs/msm/doc/PDF/examples/distributed_table/Open.hpp /trunk/libs/msm/doc/PDF/examples/iPodEuml.cpp /trunk/libs/msm/doc/PDF/examples/iPodSearch.cpp /trunk/libs/msm/doc/PDF/examples/iPodSearchEuml.cpp /trunk/libs/msm/doc/PDF/examples/iPod_distributed /trunk/libs/msm/doc/PDF/examples/iPod_distributed/Events.hpp /trunk/libs/msm/doc/PDF/examples/iPod_distributed/MenuMode.cpp /trunk/libs/msm/doc/PDF/examples/iPod_distributed/MenuMode.hpp /trunk/libs/msm/doc/PDF/examples/iPod_distributed/PlayingMode.cpp /trunk/libs/msm/doc/PDF/examples/iPod_distributed/PlayingMode.hpp /trunk/libs/msm/doc/PDF/examples/iPod_distributed/iPod.cpp /trunk/libs/msm/doc/PDF/examples/ipod_functors.hpp /trunk/libs/msm/doc/PDF/examples/logging_functors.h /trunk/libs/msm/doc/PDF/msm.pdf /trunk/libs/msm/doc/images /trunk/libs/msm/doc/images/AnnexA.jpg /trunk/libs/msm/doc/images/Anonymous.jpg /trunk/libs/msm/doc/images/CompositeTutorial.jpg /trunk/libs/msm/doc/images/FlagsTutorial.jpg /trunk/libs/msm/doc/images/HistoryTutorial.jpg /trunk/libs/msm/doc/images/Orthogonal-deferred.jpg /trunk/libs/msm/doc/images/ParsingDigits.jpg /trunk/libs/msm/doc/images/SimpleTutorial.jpg /trunk/libs/msm/doc/images/completion.gif /trunk/libs/msm/doc/images/conflict1.gif /trunk/libs/msm/doc/images/conflict2.gif /trunk/libs/msm/doc/images/entry_point.gif /trunk/libs/msm/doc/images/entrytutorial.jpg /trunk/libs/msm/doc/images/error_no_regions.jpg /trunk/libs/msm/doc/images/exit.gif /trunk/libs/msm/doc/images/explicit.gif /trunk/libs/msm/doc/images/fork.gif /trunk/libs/msm/doc/images/history.gif /trunk/libs/msm/doc/images/init_state.gif /trunk/libs/msm/doc/images/regions.gif /trunk/libs/msm/doc/images/sm.gif /trunk/libs/msm/doc/images/state.gif /trunk/libs/msm/doc/images/terminate.gif /trunk/libs/msm/doc/images/transition.jpg /trunk/libs/msm/doc/src /trunk/libs/msm/doc/src/msm.xml /trunk/libs/msm/index.html /trunk/libs/msm/test /trunk/libs/msm/test/Anonymous.cpp /trunk/libs/msm/test/AnonymousEuml.cpp /trunk/libs/msm/test/CompositeEuml.cpp /trunk/libs/msm/test/CompositeMachine.cpp /trunk/libs/msm/test/Constructor.cpp /trunk/libs/msm/test/Entries.cpp /trunk/libs/msm/test/History.cpp /trunk/libs/msm/test/Jamfile.v2 /trunk/libs/msm/test/OrthogonalDeferred.cpp /trunk/libs/msm/test/OrthogonalDeferred2.cpp /trunk/libs/msm/test/OrthogonalDeferredEuml.cpp /trunk/libs/msm/test/SimpleEuml.cpp /trunk/libs/msm/test/SimpleEuml2.cpp /trunk/libs/msm/test/SimpleInternal.cpp /trunk/libs/msm/test/SimpleInternalEuml.cpp /trunk/libs/msm/test/SimpleInternalFunctors.cpp /trunk/libs/msm/test/SimpleMachine.cpp /trunk/libs/msm/test/SimpleWithFunctors.cpp /trunk/libs/polygon /trunk/libs/polygon/Jamfile.v2 /trunk/libs/polygon/doc /trunk/libs/polygon/doc/GTL_boostcon2009.pdf /trunk/libs/polygon/doc/GTL_boostcon_draft03.pdf /trunk/libs/polygon/doc/analysis.htm /trunk/libs/polygon/doc/gtl_connectivity_extraction.htm /trunk/libs/polygon/doc/gtl_connectivity_extraction_45.htm /trunk/libs/polygon/doc/gtl_connectivity_extraction_90.htm /trunk/libs/polygon/doc/gtl_connectivity_extraction_usage.htm /trunk/libs/polygon/doc/gtl_coordinate_concept.htm /trunk/libs/polygon/doc/gtl_custom_point.htm /trunk/libs/polygon/doc/gtl_custom_polygon.htm /trunk/libs/polygon/doc/gtl_custom_polygon_set.htm /trunk/libs/polygon/doc/gtl_design_overview.htm /trunk/libs/polygon/doc/gtl_interval_concept.htm /trunk/libs/polygon/doc/gtl_isotropy.htm /trunk/libs/polygon/doc/gtl_minkowski_tutorial.htm /trunk/libs/polygon/doc/gtl_point_concept.htm /trunk/libs/polygon/doc/gtl_point_usage.htm /trunk/libs/polygon/doc/gtl_polygon_45_concept.htm /trunk/libs/polygon/doc/gtl_polygon_45_set_concept.htm /trunk/libs/polygon/doc/gtl_polygon_45_with_holes_concept.htm /trunk/libs/polygon/doc/gtl_polygon_90_concept.htm /trunk/libs/polygon/doc/gtl_polygon_90_set_concept.htm /trunk/libs/polygon/doc/gtl_polygon_90_with_holes_concept.htm /trunk/libs/polygon/doc/gtl_polygon_concept.htm /trunk/libs/polygon/doc/gtl_polygon_set_concept.htm /trunk/libs/polygon/doc/gtl_polygon_set_usage.htm /trunk/libs/polygon/doc/gtl_polygon_usage.htm /trunk/libs/polygon/doc/gtl_polygon_with_holes_concept.htm /trunk/libs/polygon/doc/gtl_property_merge.htm /trunk/libs/polygon/doc/gtl_property_merge_45.htm /trunk/libs/polygon/doc/gtl_property_merge_90.htm /trunk/libs/polygon/doc/gtl_property_merge_usage.htm /trunk/libs/polygon/doc/gtl_rectangle_concept.htm /trunk/libs/polygon/doc/gtl_tutorial.htm /trunk/libs/polygon/doc/images /trunk/libs/polygon/doc/images/NAND.PNG /trunk/libs/polygon/doc/images/boost.png /trunk/libs/polygon/doc/images/concept_table.png /trunk/libs/polygon/doc/images/convolution1.PNG /trunk/libs/polygon/doc/images/convolution2.PNG /trunk/libs/polygon/doc/images/convolve_edges.PNG /trunk/libs/polygon/doc/images/foo.PNG /trunk/libs/polygon/doc/images/hand.png /trunk/libs/polygon/doc/images/intlogo.gif /trunk/libs/polygon/doc/images/nands.PNG /trunk/libs/polygon/doc/images/perf_graph.PNG /trunk/libs/polygon/doc/images/perimeter_convolve.PNG /trunk/libs/polygon/doc/images/refinements.png /trunk/libs/polygon/doc/index.htm /trunk/libs/polygon/doc/tutorial /trunk/libs/polygon/doc/tutorial/compare_schematics.hpp /trunk/libs/polygon/doc/tutorial/connectivity_database.hpp /trunk/libs/polygon/doc/tutorial/device.hpp /trunk/libs/polygon/doc/tutorial/extract.cpp /trunk/libs/polygon/doc/tutorial/extract_devices.hpp /trunk/libs/polygon/doc/tutorial/layout_database.hpp /trunk/libs/polygon/doc/tutorial/layout_pin.hpp /trunk/libs/polygon/doc/tutorial/layout_rectangle.hpp /trunk/libs/polygon/doc/tutorial/minkowski.cpp /trunk/libs/polygon/doc/tutorial/nand.layout /trunk/libs/polygon/doc/tutorial/nand.schematic /trunk/libs/polygon/doc/tutorial/nand_short.layout /trunk/libs/polygon/doc/tutorial/nor.layout /trunk/libs/polygon/doc/tutorial/nor.schematic /trunk/libs/polygon/doc/tutorial/parse_layout.hpp /trunk/libs/polygon/doc/tutorial/schematic_database.hpp /trunk/libs/polygon/index.html /trunk/libs/polygon/test /trunk/libs/polygon/test/Jamfile.v2 /trunk/libs/polygon/test/gtl_boost_unit_test.cpp Deleted: /trunk/libs/function/doc/html Modified: /trunk/libs/date_time/xmldoc/Jamfile.v2 /trunk/libs/date_time/xmldoc/changes.xml /trunk/libs/date_time/xmldoc/format_flags.xml /trunk/libs/exception/doc/boost_exception_get_error_info_hpp.html /trunk/libs/exception/doc/get_error_info.html /trunk/libs/exception/test/no_exceptions_test.cpp /trunk/libs/exception/test/refcount_ptr_test.cpp /trunk/libs/filesystem/index.html /trunk/libs/flyweight/doc/release_notes.html /trunk/libs/flyweight/example/composite.cpp /trunk/libs/foreach/doc/Jamfile.v2 /trunk/libs/format/doc/format.html /trunk/libs/function/doc/Jamfile.v2 /trunk/libs/function_types/doc/Jamfile/trunk/libs/function_types/doc/html/boost_functiontypes/about_tag_types.html /trunk/libs/function_types/doc/html/boost_functiontypes/acknowledgements.html
/trunk/libs/function_types/doc/html/boost_functiontypes/introduction.html /trunk/libs/function_types/doc/html/boost_functiontypes/rationale.html/trunk/libs/function_types/doc/html/boost_functiontypes/reference/classification.html /trunk/libs/function_types/doc/html/boost_functiontypes/reference/decomposition.html /trunk/libs/function_types/doc/html/boost_functiontypes/reference/macros.html /trunk/libs/function_types/doc/html/boost_functiontypes/reference/synthesis.html /trunk/libs/function_types/doc/html/boost_functiontypes/reference/tag_types.html
/trunk/libs/function_types/doc/html/boost_functiontypes/reference.html /trunk/libs/function_types/doc/html/boost_functiontypes/use_cases.html /trunk/libs/function_types/doc/html/index.html /trunk/libs/functional/hash/doc/changes.qbk /trunk/libs/functional/hash/test/Jamfile.v2 /trunk/libs/fusion/changelist.txt /trunk/libs/fusion/doc/Jamfile /trunk/libs/fusion/doc/adapted.qbk /trunk/libs/fusion/doc/algorithm.qbk /trunk/libs/fusion/doc/changelog.qbk /trunk/libs/fusion/doc/container.qbk /trunk/libs/fusion/doc/fusion.qbk /trunk/libs/fusion/doc/html/fusion/acknowledgements.html /trunk/libs/fusion/doc/html/fusion/adapted/adapt_assoc.html /trunk/libs/fusion/doc/html/fusion/adapted/adapt_assoc_struct_named.html /trunk/libs/fusion/doc/html/fusion/adapted/adapt_assoc_tpl_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/adapt_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/adapt_struct_named.html /trunk/libs/fusion/doc/html/fusion/adapted/adapt_tpl_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/array.html /trunk/libs/fusion/doc/html/fusion/adapted/boost__array.html /trunk/libs/fusion/doc/html/fusion/adapted/boost__tuple.html /trunk/libs/fusion/doc/html/fusion/adapted/define_assoc_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/define_assoc_tpl_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/define_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/define_tpl_struct.html /trunk/libs/fusion/doc/html/fusion/adapted/mpl_sequence.html /trunk/libs/fusion/doc/html/fusion/adapted/std__pair.html /trunk/libs/fusion/doc/html/fusion/adapted.html/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/accumulate.html
/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/fold.html/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions/for_each.html
/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/functions.html/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/accumulate.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/fold.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions/for_each.html
/trunk/libs/fusion/doc/html/fusion/algorithm/iteration/metafunctions.html /trunk/libs/fusion/doc/html/fusion/algorithm/iteration.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/all.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/any.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/count.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/count_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/find.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/find_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions/none.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/functions.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/all.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/any.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/count.html/trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/count_if.html
/trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/find.html/trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/find_if.html
/trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions/none.html /trunk/libs/fusion/doc/html/fusion/algorithm/query/metafunctions.html /trunk/libs/fusion/doc/html/fusion/algorithm/query.html/trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/clear.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/erase.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/erase_key.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/filter.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/filter_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/insert.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/insert_range.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/join.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/pop_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/pop_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/push_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/push_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/remove.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/remove_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/replace.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/replace_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/reverse.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/transform.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions/zip.html
/trunk/libs/fusion/doc/html/fusion/algorithm/transformation/functions.html/trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/clear.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/erase.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/erase_key.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/filter.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/filter_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/insert.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/insert_range.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/join.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/pop_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/pop_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/push_back.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/push_front.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/remove.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/remove_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/replace.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/replace_if.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/reverse.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/transform.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions/zip.html /trunk/libs/fusion/doc/html/fusion/algorithm/transformation/metafunctions.html
/trunk/libs/fusion/doc/html/fusion/algorithm/transformation.html /trunk/libs/fusion/doc/html/fusion/algorithm.html /trunk/libs/fusion/doc/html/fusion/change_log.html /trunk/libs/fusion/doc/html/fusion/container/cons.html/trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_list.html /trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_map.html /trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html /trunk/libs/fusion/doc/html/fusion/container/conversion/functions/as_vector.html
/trunk/libs/fusion/doc/html/fusion/container/conversion/functions.html/trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_list.html /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_map.html /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_set.html /trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions/as_vector.html
/trunk/libs/fusion/doc/html/fusion/container/conversion/metafunctions.html /trunk/libs/fusion/doc/html/fusion/container/conversion.html/trunk/libs/fusion/doc/html/fusion/container/generation/functions/list_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_cons.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_list.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_map.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_set.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/make_vector.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/map_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/tiers.html /trunk/libs/fusion/doc/html/fusion/container/generation/functions/vector_tie.html
/trunk/libs/fusion/doc/html/fusion/container/generation/functions.html/trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/list_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_cons.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_list.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_map.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_set.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/make_vector.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/map_tie.html /trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions/vector_tie.html
/trunk/libs/fusion/doc/html/fusion/container/generation/metafunctions.html /trunk/libs/fusion/doc/html/fusion/container/generation.html /trunk/libs/fusion/doc/html/fusion/container/list.html /trunk/libs/fusion/doc/html/fusion/container/map.html /trunk/libs/fusion/doc/html/fusion/container/set.html /trunk/libs/fusion/doc/html/fusion/container/vector.html /trunk/libs/fusion/doc/html/fusion/container.html /trunk/libs/fusion/doc/html/fusion/extension/ext_full.html /trunk/libs/fusion/doc/html/fusion/extension/iterator_facade.html /trunk/libs/fusion/doc/html/fusion/extension/sequence_facade.html /trunk/libs/fusion/doc/html/fusion/extension.html /trunk/libs/fusion/doc/html/fusion/functional/adapters/fused.html/trunk/libs/fusion/doc/html/fusion/functional/adapters/fused_function_object.html
/trunk/libs/fusion/doc/html/fusion/functional/adapters/fused_procedure.html /trunk/libs/fusion/doc/html/fusion/functional/adapters/limits.html /trunk/libs/fusion/doc/html/fusion/functional/adapters/unfused.html /trunk/libs/fusion/doc/html/fusion/functional/adapters/unfused_typed.html /trunk/libs/fusion/doc/html/fusion/functional/adapters.html /trunk/libs/fusion/doc/html/fusion/functional/concepts/callable.html /trunk/libs/fusion/doc/html/fusion/functional/concepts/def_callable.html /trunk/libs/fusion/doc/html/fusion/functional/concepts/poly.html /trunk/libs/fusion/doc/html/fusion/functional/concepts/reg_callable.html /trunk/libs/fusion/doc/html/fusion/functional/concepts.html/trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html /trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused_proc.html /trunk/libs/fusion/doc/html/fusion/functional/generation/functions/mk_unfused.html
/trunk/libs/fusion/doc/html/fusion/functional/generation/functions.html/trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_fused.html /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_fused_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_fused_proc.html /trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions/mk_unfused.html
/trunk/libs/fusion/doc/html/fusion/functional/generation/metafunctions.html /trunk/libs/fusion/doc/html/fusion/functional/generation.html/trunk/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/functions/invoke_proc.html
/trunk/libs/fusion/doc/html/fusion/functional/invocation/functions.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/limits.html/trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions/invoke.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions/invoke_fobj.html /trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions/invoke_proc.html
/trunk/libs/fusion/doc/html/fusion/functional/invocation/metafunctions.html /trunk/libs/fusion/doc/html/fusion/functional/invocation.html /trunk/libs/fusion/doc/html/fusion/functional.html /trunk/libs/fusion/doc/html/fusion/introduction.html/trunk/libs/fusion/doc/html/fusion/iterator/concepts/associative_iterator.html /trunk/libs/fusion/doc/html/fusion/iterator/concepts/bidirectional_iterator.html
/trunk/libs/fusion/doc/html/fusion/iterator/concepts/forward_iterator.html/trunk/libs/fusion/doc/html/fusion/iterator/concepts/random_access_iterator.html
/trunk/libs/fusion/doc/html/fusion/iterator/concepts.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/advance.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/advance_c.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/deref.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/deref_data.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/distance.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/next.html /trunk/libs/fusion/doc/html/fusion/iterator/functions/prior.html /trunk/libs/fusion/doc/html/fusion/iterator/functions.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/advance.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/advance_c.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/deref.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/deref_data.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/distance.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/equal_to.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/key_of.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/next.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/prior.html /trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/value_of.html/trunk/libs/fusion/doc/html/fusion/iterator/metafunctions/value_of_data.html
/trunk/libs/fusion/doc/html/fusion/iterator/metafunctions.html /trunk/libs/fusion/doc/html/fusion/iterator/operator/operator_equality.html/trunk/libs/fusion/doc/html/fusion/iterator/operator/operator_inequality.html /trunk/libs/fusion/doc/html/fusion/iterator/operator/operator_unary_star.html
/trunk/libs/fusion/doc/html/fusion/iterator/operator.html /trunk/libs/fusion/doc/html/fusion/iterator.html /trunk/libs/fusion/doc/html/fusion/notes.html /trunk/libs/fusion/doc/html/fusion/organization.html /trunk/libs/fusion/doc/html/fusion/preface.html /trunk/libs/fusion/doc/html/fusion/quick_start.html /trunk/libs/fusion/doc/html/fusion/references.html/trunk/libs/fusion/doc/html/fusion/sequence/concepts/associative_sequence.html /trunk/libs/fusion/doc/html/fusion/sequence/concepts/bidirectional_sequence.html
/trunk/libs/fusion/doc/html/fusion/sequence/concepts/forward_sequence.html/trunk/libs/fusion/doc/html/fusion/sequence/concepts/random_access_sequence.html
/trunk/libs/fusion/doc/html/fusion/sequence/concepts.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/at.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/at_c.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/at_key.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/back.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/begin.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/empty.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/end.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/front.html/trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/has_key.html
/trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/size.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions/swap.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/functions.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/at.html/trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/at_c.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/at_key.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/back.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/begin.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/empty.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/end.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/front.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/has_key.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/size.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/swap.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/value_at.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_c.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions/value_at_key.html
/trunk/libs/fusion/doc/html/fusion/sequence/intrinsic/metafunctions.html /trunk/libs/fusion/doc/html/fusion/sequence/intrinsic.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/equal.html/trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/greater_than.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/greater_than_equal.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/less_than.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/less_than_equal.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison/not_equal.html
/trunk/libs/fusion/doc/html/fusion/sequence/operator/comparison.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/i_o/in.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/i_o/out.html /trunk/libs/fusion/doc/html/fusion/sequence/operator/i_o.html /trunk/libs/fusion/doc/html/fusion/sequence/operator.html /trunk/libs/fusion/doc/html/fusion/sequence.html /trunk/libs/fusion/doc/html/fusion/support/category_of.html /trunk/libs/fusion/doc/html/fusion/support/deduce.html /trunk/libs/fusion/doc/html/fusion/support/deduce_sequence.html /trunk/libs/fusion/doc/html/fusion/support/is_sequence.html /trunk/libs/fusion/doc/html/fusion/support/is_view.html /trunk/libs/fusion/doc/html/fusion/support/pair.html /trunk/libs/fusion/doc/html/fusion/support/tag_of.html /trunk/libs/fusion/doc/html/fusion/support.html/trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/construction.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/element_access.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/relational_operators.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/tuple_creation_functions.html /trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple/tuple_helper_classes.html
/trunk/libs/fusion/doc/html/fusion/tuple/class_template_tuple.html /trunk/libs/fusion/doc/html/fusion/tuple/pairs.html /trunk/libs/fusion/doc/html/fusion/tuple.html /trunk/libs/fusion/doc/html/fusion/view/filter_view.html /trunk/libs/fusion/doc/html/fusion/view/iterator_range.html /trunk/libs/fusion/doc/html/fusion/view/joint_view.html /trunk/libs/fusion/doc/html/fusion/view/nview.html /trunk/libs/fusion/doc/html/fusion/view/reverse_view.html /trunk/libs/fusion/doc/html/fusion/view/single_view.html /trunk/libs/fusion/doc/html/fusion/view/transform_view.html /trunk/libs/fusion/doc/html/fusion/view/zip_view.html /trunk/libs/fusion/doc/html/fusion/view.html /trunk/libs/fusion/doc/html/index.html /trunk/libs/fusion/doc/view.qbk /trunk/libs/fusion/test/Jamfile /trunk/libs/fusion/test/algorithm/all.cpp /trunk/libs/fusion/test/algorithm/any.cpp /trunk/libs/fusion/test/algorithm/fold.cpp /trunk/libs/fusion/test/algorithm/none.cpp /trunk/libs/fusion/test/functional/unfused_typed.cpp /trunk/libs/fusion/test/sequence/adapt_assoc_class.cpp /trunk/libs/fusion/test/sequence/adapt_assoc_class_named.cpp /trunk/libs/fusion/test/sequence/adapt_assoc_struct.cpp /trunk/libs/fusion/test/sequence/adapt_assoc_struct_named.cpp /trunk/libs/fusion/test/sequence/adapt_assoc_tpl_class.cpp /trunk/libs/fusion/test/sequence/adapt_assoc_tpl_struct.cpp /trunk/libs/fusion/test/sequence/adapt_class.cpp /trunk/libs/fusion/test/sequence/adapt_class_named.cpp /trunk/libs/fusion/test/sequence/adapt_struct.cpp /trunk/libs/fusion/test/sequence/adapt_struct_named.cpp /trunk/libs/fusion/test/sequence/adapt_tpl_class.cpp /trunk/libs/fusion/test/sequence/adapt_tpl_struct.cpp /trunk/libs/fusion/test/sequence/cons.cpp /trunk/libs/fusion/test/sequence/define_assoc_struct.cpp /trunk/libs/fusion/test/sequence/define_assoc_tpl_struct.cpp /trunk/libs/fusion/test/sequence/define_struct.cpp /trunk/libs/fusion/test/sequence/define_tpl_struct.cpp /trunk/libs/fusion/test/sequence/filter_view.cpp /trunk/libs/fusion/test/sequence/iterator_range.cpp /trunk/libs/fusion/test/sequence/joint_view.cpp /trunk/libs/fusion/test/sequence/map.cpp /trunk/libs/fusion/test/sequence/misc.hpp /trunk/libs/fusion/test/sequence/nview.cpp /trunk/libs/fusion/test/sequence/set.cpp /trunk/libs/fusion/test/sequence/tr1_tuple_auto_conv.cpp /trunk/libs/fusion/todo.txt ======================================= --- /dev/null +++ /trunk/libs/detail/utf8_codecvt_facet.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,285 @@ +/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 +// utf8_codecvt_facet.cpp + +// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia@xxxxxxxxxx) +// Andrew Lumsdaine, Indiana University (lums@xxxxxxxxxx). +// Use, modification and distribution is 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) + +// Please see the comments in <boost/detail/utf8_codecvt_facet.hpp> to +// learn how this file should be used. + +#include <boost/detail/utf8_codecvt_facet.hpp> + +#include <cstdlib> // for multi-byte converson routines +#include <cassert> + +#include <boost/limits.hpp> +#include <boost/config.hpp> + +// If we don't have wstring, then Unicode support +// is not available anyway, so we don't need to even +// compiler this file. This also fixes the problem +// with mingw, which can compile this file, but will +// generate link error when building DLL. +#ifndef BOOST_NO_STD_WSTRING + +BOOST_UTF8_BEGIN_NAMESPACE + +/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 +// implementation for wchar_t + +// Translate incoming UTF-8 into UCS-4 +std::codecvt_base::result utf8_codecvt_facet::do_in( + std::mbstate_t& /*state*/, + const char * from, + const char * from_end, + const char * & from_next, + wchar_t * to, + wchar_t * to_end, + wchar_t * & to_next +) const { + // Basic algorithm: The first octet determines how many + // octets total make up the UCS-4 character. The remaining + // "continuing octets" all begin with "10". To convert, subtract + // the amount that specifies the number of octets from the first + // octet. Subtract 0x80 (1000 0000) from each continuing octet, + // then mash the whole lot together. Note that each continuing + // octet only uses 6 bits as unique values, so only shift by + // multiples of 6 to combine. + while (from != from_end && to != to_end) { + + // Error checking on the first octet + if (invalid_leading_octet(*from)){ + from_next = from; + to_next = to; + return std::codecvt_base::error; + } + + // The first octet is adjusted by a value dependent upon + // the number of "continuing octets" encoding the character + const int cont_octet_count = get_cont_octet_count(*from); + const wchar_t octet1_modifier_table[] = { + 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc + }; + + // The unsigned char conversion is necessary in case char is + // signed (I learned this the hard way) + wchar_t ucs_result =+ (unsigned char)(*from++) - octet1_modifier_table[cont_octet_count];
+ + // Invariants :+ // 1) At the start of the loop, 'i' continuing characters have been
+ // processed+ // 2) *from points to the next continuing character to be processed.
+ int i = 0; + while(i != cont_octet_count && from != from_end) { + + // Error checking on continuing characters + if (invalid_continuing_octet(*from)) { + from_next = from; + to_next = to; + return std::codecvt_base::error; + } + + ucs_result *= (1 << 6); ++ // each continuing character has an extra (10xxxxxx)b attached to
+ // it that must be removed. + ucs_result += (unsigned char)(*from++) - 0x80; + ++i; + } + + // If the buffer ends with an incomplete unicode character... + if (from == from_end && i != cont_octet_count) { + // rewind "from" to before the current character translation + from_next = from - (i+1); + to_next = to; + return std::codecvt_base::partial; + } + *to++ = ucs_result; + } + from_next = from; + to_next = to; + + // Were we done converting or did we run out of destination space? + if(from == from_end) return std::codecvt_base::ok; + else return std::codecvt_base::partial; +} + +std::codecvt_base::result utf8_codecvt_facet::do_out( + std::mbstate_t& /*state*/, + const wchar_t * from, + const wchar_t * from_end, + const wchar_t * & from_next, + char * to, + char * to_end, + char * & to_next +) const +{ + // RG - consider merging this table with the other one + const wchar_t octet1_modifier_table[] = { + 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc + }; + + wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)(); + while (from != from_end && to != to_end) { + + // Check for invalid UCS-4 character + if (*from > max_wchar) { + from_next = from; + to_next = to; + return std::codecvt_base::error; + } + + int cont_octet_count = get_cont_octet_out_count(*from); + + // RG - comment this formula better + int shift_exponent = (cont_octet_count) * 6; + + // Process the first character + *to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] + + (unsigned char)(*from / (1 << shift_exponent))); + + // Process the continuation characters + // Invariants: At the start of the loop: + // 1) 'i' continuing octets have been generated + // 2) '*to' points to the next location to place an octet + // 3) shift_exponent is 6 more than needed for the next octet + int i = 0; + while (i != cont_octet_count && to != to_end) { + shift_exponent -= 6;+ *to++ = static_cast<char>(0x80 + ((*from / (1 << shift_exponent)) % (1 << 6)));
+ ++i; + } + // If we filled up the out buffer before encoding the character + if(to == to_end && i != cont_octet_count) { + from_next = from; + to_next = to - (i+1); + return std::codecvt_base::partial; + } + ++from; + } + from_next = from; + to_next = to; + // Were we done or did we run out of destination space + if(from == from_end) return std::codecvt_base::ok; + else return std::codecvt_base::partial; +} + +// How many char objects can I process to get <= max_limit +// wchar_t objects? +int utf8_codecvt_facet::do_length( + BOOST_CODECVT_DO_LENGTH_CONST std::mbstate_t &, + const char * from, + const char * from_end, + std::size_t max_limit +#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) +) const throw() +#else +) const +#endif +{ + // RG - this code is confusing! I need a better way to express it. + // and test cases. + + // Invariants: + // 1) last_octet_count has the size of the last measured character + // 2) char_count holds the number of characters shown to fit + // within the bounds so far (no greater than max_limit) + // 3) from_next points to the octet 'last_octet_count' before the + // last measured character. + int last_octet_count=0; + std::size_t char_count = 0; + const char* from_next = from; + // Use "<" because the buffer may represent incomplete characters+ while (from_next+last_octet_count <= from_end && char_count <= max_limit) {
+ from_next += last_octet_count; + last_octet_count = (get_octet_count(*from_next)); + ++char_count; + } + return static_cast<int>(from_next-from_end); +} + +unsigned int utf8_codecvt_facet::get_octet_count( + unsigned char lead_octet +){ + // if the 0-bit (MSB) is 0, then 1 character + if (lead_octet <= 0x7f) return 1; + + // Otherwise the count number of consecutive 1 bits starting at MSB +// assert(0xc0 <= lead_octet && lead_octet <= 0xfd); + + if (0xc0 <= lead_octet && lead_octet <= 0xdf) return 2; + else if (0xe0 <= lead_octet && lead_octet <= 0xef) return 3; + else if (0xf0 <= lead_octet && lead_octet <= 0xf7) return 4; + else if (0xf8 <= lead_octet && lead_octet <= 0xfb) return 5; + else return 6; +} +BOOST_UTF8_END_NAMESPACE + +namespace { +template<std::size_t s> +int get_cont_octet_out_count_impl(wchar_t word){ + if (word < 0x80) { + return 0; + } + if (word < 0x800) { + return 1; + } + return 2; +} + +template<> +int get_cont_octet_out_count_impl<4>(wchar_t word){ + if (word < 0x80) { + return 0; + } + if (word < 0x800) { + return 1; + } ++ // Note that the following code will generate warnings on some platforms + // where wchar_t is defined as UCS2. The warnings are superfluous as the
+ // specialization is never instantitiated with such compilers, but this+ // can cause problems if warnings are being treated as errors, so we guard + // against that. Including <boost/detail/utf8_codecvt_facet.hpp> as we do
+ // should be enough to get WCHAR_MAX defined. +#if !defined(WCHAR_MAX) +# error WCHAR_MAX not defined! +#endif + // cope with VC++ 7.1 or earlier having invalid WCHAR_MAX +#if defined(_MSC_VER) && _MSC_VER <= 1310 // 7.1 or earlier + return 2; +#elif WCHAR_MAX > 0x10000 + + if (word < 0x10000) { + return 2; + } + if (word < 0x200000) { + return 3; + } + if (word < 0x4000000) { + return 4; + } + return 5; + +#else + return 2; +#endif +} + +} // namespace anonymous + +BOOST_UTF8_BEGIN_NAMESPACE +// How many "continuing octets" will be needed for this word +// == total octets - 1. +int utf8_codecvt_facet::get_cont_octet_out_count( + wchar_t word +) const { + return get_cont_octet_out_count_impl<sizeof(wchar_t)>(word); +} +BOOST_UTF8_END_NAMESPACE + +#endif ======================================= --- /dev/null +++ /trunk/libs/filesystem/v2/build/Jamfile.v2 Sun Aug 22 23:21:17 2010 @@ -0,0 +1,31 @@ +# Boost Filesystem Library Build Jamfile + +# (C) Copyright Beman Dawes 2002-2006 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or www.boost.org/LICENSE_1_0.txt) + +# See library home page at http://www.boost.org/libs/filesystem + +project boost/filesystem + : source-location ../src+ : usage-requirements # pass these requirement to dependents (i.e. users)
+ <link>shared:<define>BOOST_FILESYSTEM_DYN_LINK=1 + ; + +SOURCES = + operations path portability utf8_codecvt_facet ; + +lib boost_filesystem + : $(SOURCES).cpp ../../system/build//boost_system+ : <link>shared:<define>BOOST_FILESYSTEM_DYN_LINK=1 # tell source we're building dll's
+ :+ : # Boost.Filesystem uses some of Boost.System functions in inlined/templated + # functions, so clients that use Boost.Filesystem will have direct references + # to Boost.System symbols. On Windows, Darwin, and some other platforms, this + # means those clients have to be directly linked to Boost.System. For static + # linking this happens anyway, but for shared we need to make it happen. Since + # doing so is harmless even when not needed, we do it for all platforms.
+ <link>shared:<library>../../system/build//boost_system + ; + +boost-install boost_filesystem ; ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/build/Jamfile.v2 Sun Aug 22 23:21:17 2010 @@ -0,0 +1,32 @@ +# Boost Filesystem Library Build Jamfile + +# (C) Copyright Beman Dawes 2002-2006 +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or www.boost.org/LICENSE_1_0.txt) + + +# See library home page at http://www.boost.org/libs/filesystem + +project boost/filesystem + : source-location ../src+ : usage-requirements # pass these requirement to dependents (i.e. users)
+ <link>shared:<define>BOOST_FILESYSTEM_DYN_LINK=1 + ; + +SOURCES =+ operations path path_traits portability unique_path utf8_codecvt_facet windows_file_codecvt codecvt_error_category ;
+ +lib boost_filesystem + : $(SOURCES).cpp ../../system/build//boost_system+ : <link>shared:<define>BOOST_FILESYSTEM_DYN_LINK=1 # tell source we're building dll's
+ :+ : # Boost.Filesystem uses some of Boost.System functions in inlined/templated + # functions, so clients that use Boost.Filesystem will have direct references + # to Boost.System symbols. On Windows, Darwin, and some other platforms, this + # means those clients have to be directly linked to Boost.System. For static + # linking this happens anyway, but for shared we need to make it happen. Since + # doing so is harmless even when not needed, we do it for all platforms.
+ <link>shared:<library>../../system/build//boost_system + ; + +boost-install boost_filesystem ; ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/Jamfile.v2 Sun Aug 22 23:21:17 2010 @@ -0,0 +1,19 @@ +# Boost Filesystem Library Example Jamfile + +# Copyright Beman Dawes 2010 + +# Distributed under the Boost Software License, Version 1.0. +# See www.boost.org/LICENSE_1_0.txt + +# Library home page: http://www.boost.org/libs/filesystem + +project + : requirements + <library>/boost/filesystem//boost_filesystem + <library>/boost/system//boost_system + <toolset>msvc:<asynch-exceptions>on + <link>static + ; + +exe path_table : path_table.cpp ; +install path_table-copy : path_table : <location>. ; ======================================= --- /dev/null+++ /trunk/libs/filesystem/v3/doc/POSIX_filename_encoding.txt Sun Aug 22 23:21:17 2010
@@ -0,0 +1,55 @@ +http://www.linuxfromscratch.org/blfs/view/svn/introduction/locale-issues.html ++"The POSIX standard mandates that the filename encoding is the encoding implied by the current LC_CTYPE locale category."
+ +------- + +http://mail.nl.linux.org/linux-utf8/2001-02/msg00103.html + +From: Markus Kuhn + +Tom Tromey wrote on 2001-02-05 00:36 UTC: +> Kai> IMAO, a *real* filesystem should use some encoding of ISO 10646 - +> Kai> UTF-8, UTF-16, or UTF-32 are all viable options. The same should +> Kai> be true for the kernel filename interfaces. +> +> I like this, but what should I do right now? + +The POSIX kernel file system interface is engraved into stone and +extremely unlikely to change. File names are arbitrary binary strings, +with only the '/' and '\0' bytes having any special semantics. You can +use arbitrary coded character sets on it as long as they do not +introduce '/' and '\0' bytes spuriously. Writers and readers have to +somehow agree on what encoding to use and the only really practical way +is to use the same encoding on all systems that share files. Eventually, +everyone will be using UTF-8 for file names on POSIX systems. Right now, +I would recommend users to use only ASCII for filenames, as this is +already UTF-8 and therefore simplifies migration. Using the ISO 8859, +JIS, etc. filenames should soon be considered deprecated practice. + +> I work on libgcj, the runtime component of gcj, the Java front end to +> GCC. In libgcj of course we use UCS-2 everywhere, since that is what +> Java does. Currently, for Unixy systems, we assume that all file +> names are UTF-8. + +The best solution is to assume that the file names are in the +locale-specific multi-byte encoding. Simply use mbrtowc and wcrtomb to +convert between Unicode and the locale-dependent multi-byte encoding +used in file names and text files if the ISO C 99 symbol +__STDC_ISO_10646__ is defined (which guarantees that wchar_t = UCS). On +Linux, this has been the case since glibc 2.2. + +> (Actually, we do something notably worse, which is +> assume that file names are Java-style UTF-8, with the weird encoding +> for \u0000.) + +\u0000 = NUL was never a character allowed in filenames under POSIX. +Raise an exception if someone tries to use it in a filename. Problem +solved. + +I never understood, why Java found it necessary to introduce two +distinct ASCII NUL characters. + +------ + +Interesting idea. Use iconv to create shift-jis or other mbcs test cases. ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/deprecated.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,385 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem Deprecated Features</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td width="277"> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+ <td align="middle"> + <font size="7">Filesystem Deprecated Features</font> + </td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> +</table> + +<h2><a name="Deprecated-names">Deprecated names</a> and features</h2>+<p style="font-size: 10pt">As the library evolves over time, names sometimes +change or old features are removed to make way for new features. To ease transition, Boost.Filesystem deprecates +the old names and features, but by default continues to provide many of them. +The deprecated names and other workarounds can be suppressed by defining macro <code> +BOOST_FILESYSTEM_NO_DEPRECATED</code>, and this is recommended for all new code.</p> +<p style="font-size: 10pt">In the table, ✔ indicates a synonym or other
+workaround is provided unless <code> +BOOST_FILESYSTEM_NO_DEPRECATED</code> is defined.</p>+<table border="1" cellpadding="5" cellspacing="1" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td style="font-size: 10pt" valign="top"> + <b><i>Component or location</i></b></td> + <td style="font-size: 10pt" valign="top"> + <p style="font-size: 10pt"><b><i>Old name, now deprecated</i></b></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <p style="font-size: 10pt"><b><i>New name</i></b></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>branch_path()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td>+ <td style="font-size: 10pt" valign="top"><code>parent_path()</code></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>canonize()</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>default_name_check()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>default_name_check(name_check)</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>default_name_check_writable()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>directory_string()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td> + <td style="font-size: 10pt" valign="top"><code>string</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>external_directory_string()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td> + <td style="font-size: 10pt" valign="top"><code>native()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>external_file_string()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td> + <td style="font-size: 10pt" valign="top"><code>native()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>file_string()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td> + <td style="font-size: 10pt" valign="top"><code>string()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>has_branch_path()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td>+ <td style="font-size: 10pt" valign="top"><code>has_parent_path()</code></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td> + <td style="font-size: 10pt" valign="top"><code>has_leaf()</code></td> + <td style="font-size: 10pt" valign="top">✔</td>+ <td style="font-size: 10pt" valign="top"><code>has_filename()</code></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td>+ <td style="font-size: 10pt" valign="top"><code>is_complere()</code></td>
+ <td style="font-size: 10pt" valign="top">✔</td>+ <td style="font-size: 10pt" valign="top"><code>is_absolute()</code></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"><code>class path</code></td> + <td style="font-size: 10pt" valign="top"><code>leaf()</code></td> + <td style="font-size: 10pt" valign="top">✔</td> + <td style="font-size: 10pt" valign="top"><code>filename()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>native_directory_string()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <code>string()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>native_file_string()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <code>string()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>normalize()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <code>path(const string_type& str, name_check)</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed. Workaround ignores </i><code>name_check</code><i> + argument.</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top">+ <code>path(const string_type::value_type* s, name_check)</code></td>
+ <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed. Workaround ignores </i><code>name_check</code><i> + argument.</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + <td style="font-size: 10pt" valign="top"> + <p style="font-size: 10pt"><code>remove_leaf()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <p style="font-size: 10pt"><code>remove_filename()</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>path.hpp</code></td> + <td style="font-size: 10pt" valign="top"> + <code>template<class String, class Traits><br> + class basic_path;</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top">+ Class template <code>basic_path</code> is replaced by <code>class path</code>. + No workaround for an explicitly coded <code>basic_path</code> is provided,
+ but see the next row - <code>path</code>.</td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>path.hpp</code></td> + <td style="font-size: 10pt" valign="top">+ <code>typedef basic_path<std::string, path_traits> path</code></td>
+ <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <code>class path</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>path.hpp</code></td> + <td style="font-size: 10pt" valign="top">+ <code>typedef basic_path<std::wstring, wpath_traits> wpath</code></td>
+ <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top">+ <i>Removed; use </i><code>class path</code><i> instead. Workaround provides
+ </i><code>typedef path wpath</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>operations.hpp</code></td> + <td style="font-size: 10pt" valign="top"> + <code>initial_path()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>operations.hpp</code></td> + <td style="font-size: 10pt" valign="top"> + <p dir="ltr"><code>template <class Path><br> + Path complete(const Path& p,<br> + const Path& base=<br> + initial_path<Path>())</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top">+ <p dir="ltr"><code>path absolute(const path& p, const path& base=<br>
+ current_path())</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>operations.hpp</code></td> + <td style="font-size: 10pt" valign="top"> + <code>is_regular(file_status f)</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top"> + <p dir="ltr"> + <code>is_regular_file(file_status f)</code></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>operations.hpp</code></td> + <td style="font-size: 10pt" valign="top"> + <code>symbolic_link_exists(const path& ph)</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top"> + <i>Function removed</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class directory_entry</code></td> + <td style="font-size: 10pt" valign="top"> + <code>filename()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top">+ <i>Function removed, use </i><code>path().filename()</code><i> instead.</i></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class directory_entry</code></td> + <td style="font-size: 10pt" valign="top"> + <code>leaf()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top">+ <i>Function removed, use </i><code>path().filename()</code><i> instead.</i></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + <code>class directory_entry</code></td> + <td style="font-size: 10pt" valign="top"> + <code>string()</code></td> + <td style="font-size: 10pt" valign="top"> + ✔</td> + <td style="font-size: 10pt" valign="top">+ <i>Function removed, use </i><code>path().string()</code><i> instead.</i></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + Macro definitions</td> + <td style="font-size: 10pt" valign="top"> + <code>BOOST_WINDOW_API</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top"> + <i>No longer supported; API selection is always automatic.</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + Macro definitions</td> + <td style="font-size: 10pt" valign="top"> + <code>BOOST_POSIX_API</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top"> + <i>No longer supported; API selection is always automatic.</i></td> + </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + Macro definitions</td> + <td style="font-size: 10pt" valign="top"> + <code>BOOST_WINDOW_PATH</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top">+ <i>No longer supported; native path format selection is always automatic.</i></td>
+ </tr> + <tr> + <td style="font-size: 10pt" valign="top"> + Macro definitions</td> + <td style="font-size: 10pt" valign="top"> + <code>BOOST_POSIX_PATH</code></td> + <td style="font-size: 10pt" valign="top"> + </td> + <td style="font-size: 10pt" valign="top">+ <i>No longer supported; native path format selection is always automatic.</i></td>
+ </tr> +</table> + +<h2>Deprecation rationale</h2> +<h3><code>initial_path</code> function</h3>+<p dir="ltr">Full implementation of <code>initial_path()</code> would require
+support from the C++ runtime startup code, and that doesn't seem likely to +happen. Depending on the user to call <code>initial_path()</code> at the +beginning of <code>main()</code> is too error prone. An equivalent +function can trivially be provided by a user.</p> + +<hr> +<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->02 July, 2010<!--webbot bot="Timestamp" endspan i-checksum="21056" --></p>
+ +<p>© Copyright Beman Dawes, 2002-2005, 2010</p> +<p> Use, modification, and distribution are subject to the Boost Software +License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt";> +www.boost.org/LICENSE_1_0.txt</a></p> + +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/design.htm Sun Aug 22 23:21:17 2010 @@ -0,0 +1,353 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Boost Filesystem Library Design</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body bgcolor="#FFFFFF"> + +<h1>+<img border="0" src="../../../../boost.png" align="center" width="277" height="86">Filesystem
+Library Design</h1> + +<p><a href="#Introduction">Introduction</a><br> +<a href="#Requirements">Requirements</a><br> +<a href="#Realities">Realities</a><br> +<a href="#Rationale">Rationale</a><br> +<a href="#Abandoned_Designs">Abandoned_Designs</a><br> +<a href="#References">References</a></p> + +<h2><a name="Introduction">Introduction</a></h2> + +<p>The primary motivation for beginning work on the Filesystem Library was +frustration with Boost administrative tools. Scripts were written in+Python, Perl, Bash, and Windows command languages. There was no single +scripting language familiar and acceptable to all Boost administrators. Yet they +were all skilled C++ programmers - why couldn't C++ be used as the scripting
+language?</p> ++<p>The key feature C++ lacked for script-like applications was the ability to +perform portable filesystem operations on directories and their contents. The
+Filesystem Library was developed to fill that void.</p> ++<p>The intent is not to compete with traditional scripting languages, but to
+provide a solution for situations where C++ is already the language +of choice..</p> + +<h2><a name="Requirements">Requirements</a></h2> +<ul>+ <li>Be able to write portable script-style filesystem operations in modern
+ C++.<br> + <br> + Rationale: This is a common programming need. It is both an+ embarrassment and a hardship that this is not possible with either the current
+ C++ or Boost libraries. The need is particularly acute + when C++ is the only toolset allowed in the tool chain. File system+ operations are provided by many languages used on multiple platforms,
+ such as Perl and Python, as well as by many platform specific scripting + languages. All operating systems provide some form of API for filesystem + operations, and the POSIX bindings are increasingly available even on+ operating systems not normally associated with POSIX, such as the Mac, z/OS,
+ or OS/390.<br> + </li>+ <li>Work within the <a href="#Realities">realities</a> described below.<br>
+ <br>+ Rationale: This isn't a research project. The need is for something that works on
+ today's platforms, including some of the embedded operating systems + with limited file systems. Because of the emphasis on portability, such a+ library would be much more useful if standardized. That means being able to + work with a much wider range of platforms that just Unix or Windows and their
+ clones.<br> + </li>+ <li>Avoid dangerous programming practices. Particularly, all-too-easy-to-ignore error notifications + and use of global variables. If a dangerous feature is provided, identify it as such.<br>
+ <br>+ Rationale: Normally this would be covered by "the usual Boost requirements...",
+ but it is mentioned explicitly because the equivalent native platform and+ scripting language interfaces often depend on all-too-easy-to-ignore error
+ notifications and global variables like "current + working directory".<br> + </li>+ <li>Structure the library so that it is still useful even if some functionality + does not map well onto a given platform or directory tree. Particularly, much
+ useful functionality should be portable even to flat +(non-hierarchical) filesystems.<br> + <br> + Rationale: Much functionality which does not+ require a hierarchical directory structure is still useful on flat-structure
+ filesystems. There are many systems, particularly embedded systems, + where even very limited functionality is still useful.</li> +</ul> +<ul> + <li>Interface smoothly with current C++ Standard Library input/output + facilities. For example, paths should be + easy to use in std::basic_fstream constructors.<br> + <br> + Rationale: One of the most common uses of file system functionality is to + manipulate paths for eventual use in input/output operations. + Thus the need to interface smoothly with standard library I/O.<br> + </li>+ <li>Suitable for eventual standardization. The implication of this requirement
+ is that the interface be close to minimal, and that great care be take + regarding portability.<br> + <br> + Rationale: The lack of file system operations is a serious hole+ in the current standard, with no other known candidates to fill that hole. + Libraries with elaborate interfaces and difficult to port specifications are much less likely to be accepted for
+ standardization.<br> + </li>+ <li>The usual Boost <a href="http://www.boost.org/more/lib_guide.htm";>requirements and
+ guidelines</a> apply.<br> + </li> + <li>Encourage, but do not require, portability in path names.<br> + <br>+ Rationale: For paths which originate from user input it is unreasonable to
+ require portable path syntax.<br> + </li>+ <li>Avoid giving the illusion of portability where portability in fact does not
+ exist.<br> + <br>+ Rationale: Leaving important behavior unspecified or "implementation defined" does a + great disservice to programmers using a library because it makes it appear + that code relying on the behavior is portable, when in fact there is nothing + portable about it. The only case where such under-specification is acceptable is when both users and implementors know from + other sources exactly what behavior is required, yet for some reason it isn't
+ possible to specify it exactly.</li> +</ul> +<h2><a name="Realities">Realities</a></h2> +<ul> + <li>Some operating systems have a single directory tree root, others have + multiple roots.<br> + </li>+ <li>Some file systems provide both a long and short form of filenames.<br>
+ </li> + <li>Some file systems have different syntax for file paths and directory + paths.<br> + </li> + <li>Some file systems have different rules for valid file names and valid + directory names.<br> + </li>+ <li>Some file systems (ISO-9660, level 1, for example) use very restricted
+ (so-called 8.3) file names.<br> + </li> + <li>Some operating systems allow file systems with different+ characteristics to be "mounted" within a directory tree. Thus a
+ ISO-9660 or Windows + file system may end up as a sub-tree of a POSIX directory tree.<br> + </li>+ <li>Wide-character versions of directory and file operations are available on some operating
+ systems, and not available on others.<br> + </li>+ <li>There is no law that says directory hierarchies have to be specified in
+ terms of left-to-right decent from the root.<br> + </li>+ <li>Some file systems have a concept of file "version number" or "generation
+ number". Some don't.<br> + </li>+ <li>Not all operating systems use single character separators in path names. Some use
+ paired notations. A typical fully-specified OpenVMS filename + might look something like this:<br> + <br>+ <code> DISK$SCRATCH:[GEORGE.PROJECT1.DAT]BIG_DATA_FILE.NTP;5<br>
+ </code><br> + The general OpenVMS format is:<br> + <br> + + <i>Device:[directories.dot.separated]filename.extension;version_number</i><br>
+ </li> + <li>For common file systems, determining if two descriptors are for same+ entity is extremely difficult or impossible. For example, the concept of + equality can be different for each portion of a path - some portions may be + case or locale sensitive, others not. Case sensitivity is a property of the + pathname itself, and not the platform. Determining collating sequence is even
+ worse.<br> + </li>+ <li>Race-conditions may occur. Directory trees, directories, files, and file attributes are in effect shared between all threads, processes, and computers which have access to the + filesystem. That may well include computers on the other side of the + world or in orbit around the world. This implies that file system operations
+ may fail in unexpected ways. For example:<br> + <br>+ <code> assert( exists("foo") == exists("foo") );
+ // may fail!<br>+ assert( is_directory("foo") == is_directory("foo");
+ // may fail!<br> + </code><br> + In the first example, the file may have been deleted between calls to+ exists(). In the second example, the file may have been deleted and then + replaced by a directory of the same name between the calls to is_directory().<br>
+ </li>+ <li>Even though an application may be portable, it still will have to traffic
+ in system specific paths occasionally; user provided input is a common + example.<br> + </li>+ <li><a name="symbolic-link-use-case">Symbolic</a> links cause canonical and + normal form of some paths to represent different files or directories. For + example, given the directory hierarchy <code>/a/b/c</code>, with a symbolic + link in <code>/a</code> named <code>x</code> pointing to <code>b/c</code>, + then under POSIX Pathname Resolution rules a path of <code>"/a/x/.."</code> + should resolve to <code>"/a/b"</code>. If <code>"/a/x/.."</code> were first + normalized to <code>"/a"</code>, it would resolve incorrectly. (Case supplied
+ by Walter Landry.)</li> +</ul> + +<h2><a name="Rationale">Rationale</a></h2> + +<p>The <a href="#Requirements">Requirements</a> and <a href="#Realities">+Realities</a> above drove much of the C++ interface design. In particular,
+the desire to make script-like code straightforward caused a great deal of+effort to go into ensuring that apparently simple expressions like <i>exists( "foo"
+)</i> work as expected.</p> + +<p>See the <a href="faq.htm">FAQ</a> for the rationale behind many detailed +design decisions.</p> + +<p>Several key insights went into the <i>path</i> class design:</p> +<ul>+ <li>Decoupling of the input formats, internal conceptual (<i>vector<string></i>
+ or other sequence) + model, and output formats.</li> + <li>Providing two input formats (generic and O/S specific) broke a major + design deadlock.</li> + <li>Providing several output formats solved another set of previously + intractable problems.</li>+ <li>Several non-obvious functions (particularly decomposition and composition)
+ are required to support portable code. (Peter Dimov, Thomas Witt, Glen + Knowles, others.)</li> +</ul> ++<p>Error checking was a particularly difficult area. One key insight was that
+with file and directory names, portability isn't a universal truth. +Rather, the programmer must think out the question "What operating systems do I +want this path to be portable to?" By providing support for several +answers to that question, the Filesystem Library alerts programmers of the need
+to ask it in the first place.</p> +<h2><a name="Abandoned_Designs">Abandoned Designs</a></h2> +<h3>operations.hpp</h3> +<p>Dietmar Kühl's original dir_it design and implementation supported +wide-character file and directory names. It was abandoned after extensive +discussions among Library Working Group members failed to identify portable+semantics for wide-character names on systems not providing native support. See
+<a href="faq.htm#wide-character_names">FAQ</a>.</p>+<p>Previous iterations of the interface design used explicitly named functions providing a
+large number of convenience operations, with no compile-time or run-time+options. There were so many function names that they were very confusing to use, +and the interface was much larger. Any benefits seemed theoretical rather than
+real. </p>+<p>Designs based on compile time (rather than runtime) flag and option selection +(via policy, enum, or int template parameters) became so complicated that they +were abandoned, often after investing quite a bit of time and effort. The need +to qualify attribute or option names with namespaces, even aliases, made use in +template parameters ugly; that wasn't fully appreciated until actually writing
+real code.</p>+<p>Yet another set of convenience functions ( for example, <i>remove</i> with
+permissive, prune, recurse, and other options, plus predicate, and possibly +other, filtering features) were abandoned because the details became both +complex and contentious.</p> ++<p>What is left is a toolkit of low-level operations from which the user can
+create more complex convenience operations, plus a very small number of+convenience functions which were found to be useful enough to justify inclusion.</p>
+ +<h3>path.hpp</h3> + +<p>There were so many abandoned path designs, I've lost track. Policy-based +class templates in several flavors, constructor supplied runtime policies, +operation specific runtime policies, they were all considered, often +implemented, and ultimately abandoned as far too complicated for any small +benefits observed.</p> ++<p>Additional design considerations apply to <a href="v3_design.html">Internationalization</a>. </p>
+ +<h3>error checking</h3> ++<p>A number of designs for the error checking machinery were abandoned, some +after experiments with implementations. Totally automatic error checking was +attempted in particular. But automatic error checking tended to make the overall
+library design much more complicated.</p> ++<p>Some designs associated error checking mechanisms with paths. Some with +operations functions. A policy-based error checking template design was
+partially implemented, then abandoned as too complicated for everyday +script-like programs.</p> ++<p>The final design, which depends partially on explicit error checking function +calls, is much simpler and straightforward, although it does depend to +some extent on programmer discipline. But it should allow programmers who +are concerned about portability to be reasonably sure that their programs will
+work correctly on their choice of target systems.</p> + +<h2><a name="References">References</a></h2> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
+ <tr> + <td width="13%" valign="top">[<a name="IBM-01">IBM-01</a>]</td> + <td width="87%">IBM Corporation, <i>z/OS V1R3.0 C/C++ Run-Time +Library Reference</i>, SA22-7821-02, 2001, +<a href="http://www-1.ibm.com/servers/eserver/zseries/zos/bkserv/";> + www-1.ibm.com/servers/eserver/zseries/zos/bkserv/</a></td> + </tr> + <tr> + <td width="13%" valign="top">[<a name="ISO-9660">ISO-9660</a>]</td> + <td width="87%">International Standards Organization, 1988</td> + </tr> + <tr> + <td width="13%" valign="top">[<a name="Kuhn">Kuhn</a>]</td> + <td width="87%">UTF-8 and Unicode FAQ for Unix/Linux, +<a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html";> + www.cl.cam.ac.uk/~mgk25/unicode.html</a></td> + </tr> + <tr> + <td width="13%" valign="top">[<a name="MSDN">MSDN</a>] </td> + <td width="87%">Microsoft Platform SDK for Windows, Storage Start +Page,+<a href="http://msdn.microsoft.com/library/en-us/fileio/base/storage_start_page.asp";> + msdn.microsoft.com/library/en-us/fileio/base/storage_start_page.asp</a></td>
+ </tr> + <tr> + <td width="13%" valign="top">[<a name="POSIX-01">POSIX-01</a>]</td>+ <td width="87%">IEEE Std 1003.1-2001, ISO/IEC 9945:2002, and The Open Group Base Specifications, Issue 6. Also known as The
+ Single Unix<font face="Times New Roman">® Specification, Version 3. + Available from each of the organizations involved in its creation. For + example, read online or download from + <a href="http://www.unix.org/single_unix_specification/";>+ www.unix.org/single_unix_specification/</a>.</font> The ISO JTC1/SC22/WG15 - POSIX
+homepage is <a href="http://www.open-std.org/jtc1/sc22/WG15/";> + www.open-std.org/jtc1/sc22/WG15/</a></td> + </tr> + <tr> + <td width="13%" valign="top">[<a name="URI">URI</a>]</td> + <td width="87%">RFC-2396, Uniform Resource Identifiers (URI): Generic +Syntax, <a href="http://www.ietf.org/rfc/rfc2396.txt";> + www.ietf.org/rfc/rfc2396.txt</a></td> + </tr> + <tr> + <td width="13%" valign="top">[<a name="UTF-16">UTF-16</a>]</td> + <td width="87%">Wikipedia, UTF-16, +<a href="http://en.wikipedia.org/wiki/UTF-16";> + en.wikipedia.org/wiki/UTF-16</a></td> + </tr> + <tr>+ <td width="13%" valign="top">[<a name="Wulf-Shaw-73">Wulf-Shaw-73</a>]</td>
+ <td width="87%">William Wulf, Mary Shaw, <i>Global+Variable Considered Harmful</i>, ACM SIGPLAN Notices, 8, 2, 1973, pp. 23-34</td>
+ </tr> +</table> + +<hr> +<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->18 February, 2010<!--webbot bot="Timestamp" endspan i-checksum="40538" --></p>
+ +<p>© Copyright Beman Dawes, 2002</p> +<p> Use, modification, and distribution are subject to the Boost Software+License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt"> +LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt";>
+www.boost.org/LICENSE_1_0.txt</a>)</p> + +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/do_list.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,146 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Do List</title> +<style type="text/css"> + body { font-family: sans-serif; margin: 1em; } + p, td, li, blockquote { font-size: 10pt; } + pre { font-size: 9pt; } +</style> +</head> + +<body> + +<h1>Boost Filesystem Do List<br>+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->24 June 2010<!--webbot bot="Timestamp" endspan i-checksum="17552" --></h1>
+ +<h2>Beta 1 comments</h2> +<ul> + <li dir="ltr"> + +<p dir="ltr">Zach Laine:</li> +</ul> +<blockquote>+ <pre dir="ltr">The descriptions for portable_name() and portable_directory_name()
+appear to be at odds. ++portable_name() : ... && (name is "." or "..", and the first character
+not a period or hyphen) ++portable_directory_name(): ... && (name is "." or ".." or contains no periods)
++Should portable_name() be "... && (name is "." or "..", or contains no +periods) && (first character not a hyphen)"? Maybe I'm missing
+something?</pre> +</blockquote> +<ul> + <li dir="ltr"> +<p dir="ltr">Scott McMurray - treat as Wish List:</li> +</ul> +<blockquote> + <pre dir="ltr">- uncomplete(p, base) + +My pet request. It may be useful to simplify other functions as well, +since there's no current way to go from an absolute path to a relative +one, meaning that most functions need to handle relative ones even +when that might not be natural. With this functionality, +preconditions requiring absolute paths would be less onerous. + + Precondition: p.is_absolute() && base.is_absolute() ++ Effects: Extracts a path, rp, from p relative to base such that +canonical(p) == complete(rp, base). Any ".." path elements in rp form
+a prefix. + + Returns: The extracted path. + + Postconditions: For the returned path, rp, rp.is_relative() == +(p.root_name() == b.root_name()). + +[Notes: This function simplifies paths by omitting context. It is +particularly useful for serializing paths such that it can be usefully +moved between hosts where the context may be different, such as inside +source control trees. It can also be helpful for display to users, +such as in shells where paths are often shown relative to $HOME. + +In the presence of symlinks, the result of this function may differ +between implementations, as some may expand symlinks that others may +not. The simplest implementation uses canonical to expand both p and+base, then removes the common prefix and prepends the requisite ".."
+elements. Smarter implementations will avoid expanding symlinks +unnecessarily. No implementation is expected to discover new symlinks +to return paths with fewer elements.]</pre> +</blockquote> +<h2 dir="ltr">Docs</h2> +<ul> + <li>Reorganize files - delete examples that no longer apply.</li> + <li>Should minimal.css be changed to used relative font sizes? See+ <a href="http://www.w3schools.com/CSS/pr_font_font-size.asp/";>http://www.w3schools.com/CSS/pr_font_font-size.asp\</a></li> + <li>Document behavior of path::replace_extension has change WRT argument w/o a
+ dot.</li>+ <li style="font-size: 10pt">Document leading //: no longer treated specially.
+ But is that really correct?</li>+ <li style="font-size: 10pt">Behavior of root_path() has been changed. Change
+ needs to be propagated to trunk?</li> + <li style="font-size: 10pt">Regenerate path decomposition table.</li> +</ul> + +<h2>Code</h2> +<h3>All</h3> +<ul> + <li style="font-size: 10pt">Move semantics.</li> + <li style="font-size: 10pt">Use BOOST_DELETED, BOOST_DEFAULTED, where + appropriate.</li> + <li style="font-size: 10pt">Other C++0x features.</li> +</ul> +<h3>Class path</h3> +<ul>+ <li>Windows, POSIX, conversions for char16_t, char32_t for C++0x compilers.</li> + <li>Add Windows Alternate Data Stream test cases. See http://en.wikipedia.org/wiki/NTFS
+ Features.</li>+ <li>Add test case: relational operators on paths differing only in trailing
+ separator. Rationale?</li>+ <li>Provide the name check functions for more character types? Templatize?
+ take a path argument?</li> + <li style="font-size: 10pt">Add codepage 936/950/etc test cases.</li> + <li style="font-size: 10pt">Should UDT's be supported?</li>+ <li style="font-size: 10pt">Should path iteration to a separator result in:<br>
+ -- the actual separator used<br> + -- the preferred separator<br>+ -- the generic separator <-- makes it easier to write portable code<br>
+ -- a dot</li> +</ul> +<h3>Operations</h3> +<ul> + <li>Would complete(), system_complete() be clearer if renamed absolute(), + absolute_system() (or absolute_native())?</li>+ <li>Review all operations.cpp code for race conditions similar to #2925. Fix
+ or document.</li> + <li>Enable all BOOST_FILESYSTEM_NO_DEPRECATED code.</li> + <li>rename and remove names are problems. If users says "using + namespace boost::filesystem"<br>+ and some header included stdio, there is just too much chance of silent error.</li>
+ <li>create_directories error handling needs work.</li> + <li>Fold convenience.hpp into operations.hpp</li>+ <li>Two argument recursive_directory_iterator ctor isn't recognizing throws(). + Would it be better to fold into a single two argument ctor with default?</li> + <li>Add the push_directory class from tools/release/required_files.cpp</li>
+</ul> + +<h3>Miscellaneous</h3> +<ul>+ <li style="font-size: 10pt"><i>Regular</i> classes need hash functions.</li>
+</ul> + +<hr> +<p>© Copyright Beman Dawes, 2010</p> +<p>Distributed under the Boost Software License, Version 1.0. See+<a href="http://www.boost.org/LICENSE_1_0.txt";>www.boost.org/LICENSE_1_0.txt</a></p>
+ +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/faq.htm Sun Aug 22 23:21:17 2010 @@ -0,0 +1,147 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem FAQ</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td width="277"> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+ <td align="middle"> + <font size="7">Filesystem FAQ</font> + </td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </tr> +</table> + +<h1 dir="ltr"> +Frequently Asked Questions</h1> +<h2>General questions</h2>+<p><b>Why not support a concept of specific kinds of file systems, such as posix_file_system or windows_file_system.</b></p>
+<p>Portability is one of the most important requirements for the+library. Features specific to a particular operating system or file system
+can always be accessed by using the operating system's API.</p> + +<h2 dir="ltr"> +Class <code><font size="6">path</font></code> questions </h2> +<p><b>Why base the generic pathname format on POSIX?</b></p>+<p><a href="design.htm#POSIX-01">POSIX</a> is an ISO Standard. It is the basis for the most familiar
+pathname formats, +not just for POSIX-based operating systems but also for Windows and the +URL portion of URI's. It is ubiquitous and +familiar. On many systems, it is very easy to implement because it is +either the native operating system format (Unix and Windows) or via a +operating system supplied +POSIX library (z/OS, OS/390, and many more.)</p>+<p><b>Why not use a full URI (Universal Resource Identifier) based path?</b></p> +<p><a href="design.htm#URI">URI's</a> would promise more than the Filesystem Library can actually deliver, +since URI's extend far beyond what most operating systems consider a file or a +directory. Thus for the primary "portable script-style file system +operations" requirement of the Filesystem Library, full URI's appear to be over-specification.</p> +<p><b>Why isn't <i>path</i> a base class with derived <i>directory_path</i> and
+<i>file_path</i> classes?</b></p>+<p>Why bother? The behavior of all three classes is essentially identical.
+Several early versions did require users to identify each path as a file or +directory path, and this seemed to increase coding errors and decrease code +readability. There was no apparent upside benefit.</p>+<p><b>Why do path decomposition functions yielding a single element return a
+path rather than a string?</b></p>+<p>Interface simplicity. If they returned strings, flavors would be needed for
+<code>string</code>, <code>wstring</code>, <code>u16string</code>, <code> +u32string</code>, and generic strings.</p>+<p><b>Why don't path member functions have overloads with error_code& arguments?</b></p>
+<p>They have not been requested by users; the need for error reporting via+error_code seems limited to operations failures rather than path failures.</p>
+<h2>Operations function questions</h2>+<p><b>Why not supply a 'handle' type, and let the file and directory operations
+traffic in it?</b></p>+<p>It isn't clear there is any feasible way to meet the "portable script-style +file system operations" requirement with such a system. File systems exist where operations are usually performed on + some non-string handle type. The classic Mac OS has been mentioned explicitly as a case where
+trafficking in paths isn't always natural. </p>+<p>The case for the "handle" (opaque data type to identify a file) +style may be strongest for directory iterator value type. (See Jesse Jones' Jan 28, +2002, Boost postings). However, as class path has evolved, it seems sufficient
+even as the directory iterator value type.</p> +<p><b>Why are the operations functions so low-level?</b></p>+<p>To provide a toolkit from which higher-level functionality can be created.</p>
+<p>An+extended attempt to add convenience functions on top of, or as a replacement +for, the low-level functionality failed because there is no widely acceptable
+set of simple semantics for most convenience functions considered. +Attempts to provide alternate semantics via either run-time options or +compile-time polices became overly complicated in relation to the value+delivered, or became contentious. OTOH, the specific functionality needed for several trial
+applications was very easy for the user to construct from the lower-level +toolkit functions. See <a href="design.htm#Abandoned_Designs">Failed +Attempts</a>.</p>+<p><b>Isn't it inconsistent then to provide a few convenience functions?</b></p> +<p>Yes, but experience with both this library, POSIX, and Windows, indicates +the utility of certain convenience functions, and that it is possible to provide +simple, yet widely acceptable, semantics for them. For example, <code>remove_all()</code>.</p>
+<p><b>Why are there directory_iterator overloads for operations.hpp+predicate functions? Isn't two ways to do the same thing poor design?</b></p> +<p>Yes, two ways to do the same thing is often a poor design practice. But the
+iterator versions are often much more efficient. Calling status() during+iteration over a directory containing 15,000 files took 6 seconds for the path +overload, and 1 second for the iterator overload, for tests on a freshly booted +machine. Times were .90 seconds and .30 seconds, for tests after prior use of +the directory. This performance gain is large enough to justify deviating from
+preferred design practices. Neither overload alone meets all needs.</p> +<p><b>Why are the operations functions so picky about errors?</b></p>+<p>Safety. The default is to be safe rather than sorry. This is particularly +important given the reality that on many computer systems files and directories
+are globally shared resources, and thus subject to +race conditions.</p>+<p><b>Why are attributes accessed via named functions rather than property maps?</b></p>
+<p>For commonly used attributes (existence, directory or file, emptiness),+simple syntax and guaranteed presence outweigh other considerations. Because
+access to many other attributes is inherently system dependent,+property maps are viewed as the best hope for access and modification, but it is +better design to provide such functionality in a separate library. (Historical +note: even the apparently simple attribute "read-only" turned out to be so +system depend as to be disqualified as a "guaranteed presence" operation.)</p> +<p><b>Why isn't automatic name portability error detection provided?</b></p>
+<p>A number (at least six) of designs for name validity error+detection were evaluated, including at least four complete implementations. +While the details for rejection differed, all of the more powerful name validity checking
+designs distorted other+otherwise simple aspects of the library. Even the simple name checking provided +in prior library versions was a constant source of user complaints. While name checking can be helpful, it
+isn't important enough to justify added a lot of additional complexity.</p>+<p><b>Why are paths sometimes manipulated by member functions and sometimes by
+non-member functions?</b></p>+<p>The design rule is that purely lexical operations are supplied as <i>class
+path</i> member+functions, while operations performed by the operating system are provided as
+free functions.</p> +<hr> +<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->17 February, 2010<!--webbot bot="Timestamp" endspan i-checksum="40536" --></p>
+<p>© Copyright Beman Dawes, 2002</p> +<p> Use, modification, and distribution are subject to the Boost Software +License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt";> +www.boost.org/LICENSE_1_0.txt</a></p> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/index.htm Sun Aug 22 23:21:17 2010 @@ -0,0 +1,472 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem Home</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td width="277"> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+ <td align="middle"> + <font size="7">Filesystem Library<br> + Version 3</font> + </td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </tr> +</table> ++<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" align="right">
+ <tr> + <td width="100%" bgcolor="#D7EEFF" align="center"> + <i><b>Contents</b></i></td> + </tr> + <tr> + <td width="100%" bgcolor="#E8F5FF"> + <a href="#Introduction">Introduction</a><br> + <a href="#Documentation">Documentation</a><br> + <a href="#Using">Using the library</a><br> + <a href="#Coding-guidelines">Coding guidelines</a><br> + <a href="#Cautions">Cautions</a><br> + <a href="#Headers">Headers</a><br> + <a href="#Examples">Example programs</a><br> + <a href="#Implementation">Implementation</a><br> + <a href="#Macros">Macros</a><br> + <a href="#Building">Building the object-library</a><br> + <a href="#Cgywin">Notes for Cygwin users</a><br> + <a href="#Change-history">Version history<br> + with acknowledgements</a></td> + </tr> + </table> + +<div align="center"> + <center>+ <table border="1" cellpadding="10" cellspacing="1" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td>+ <p align="center"><b>This is Version 3 of the Filesystem library.</b></p> + <p align="center">Version 3 is a major revision with many new and improved
+ features. It breaks some Version 2 code.</p>+ <p align="center"><a href="../../v2/doc/index.htm">Version 2</a> is the default version for Boost release 1.44 + only. Version 3 will become the default starting with release 1.45.</p>
+ <p align="center"><b>For this release only, you must define macro + BOOST_FILESYSTEM_VERSION as 3 to use Version 3. You may do this via a+ compiler argument or via <code>#define BOOST_FILESYSTEM_VERSION 3</code></b></p> + <p align="center">Existing code should be moved to Version 3 as soon as
+ convenient. New code should be written for Version 3.</p>+ <p align="center">Version 2 is deprecated, and will be removed from Boost
+ releases at the end of a transition period.</p> + </td> + </tr> + </table> + </center> +</div> + +<h2><a name="Introduction">Introduction</a></h2>+<p>The Boost.Filesystem library provides facilities to manipulate files and directories,
+and the paths that identify them.</p> + +<p>The features of the library include:</p> + +<ul> + <li><b>A modern C++ interface, highly compatible with the C++ standard + library.</b></li> +</ul> +<blockquote> + <blockquote> + +<p>Many users say the interface is their primary motivation for using+Boost.Filesystem. They like its use of familiar idioms based on standard library
+containers, iterators, and algorithms. They like having errors reported by +throwing exceptions.</p> + + </blockquote> +</blockquote> +<ul> + <li><b>Portability between operating systems.</b><br> + <ul>+ <li>At the C++ syntax level, it is convenient to learn and use one interface
+ regardless of the operating system.</li>+ <li>At the semantic level, behavior of code is reasonably portable across
+ operating systems.</li> + <li>Dual generic or native path format support encourages program+ portability, yet still allows communication with users in system specific
+ formats.<br> + </li> + </ul> + </li>+ <li><b>Error handling and reporting via C++ exceptions (the default) or error
+ codes.</b><br> + <ul> + <li>C++ exceptions are the preferred error reporting mechanism for most + applications. The exception thrown includes the detailed error code+ information important for diagnosing the exact cause of file system errors.</li> + <li>Error reporting via error code allows user code that provides detailed + error recovery to avoid becoming so littered with try-catch blocks as to be
+ unmaintainable. <br> + </li> + </ul> + </li> + <li><b>Suitable for a broad spectrum of applications, ranging from simple + script-like operations to extremely complex production code.</b><br> + <ul> + <li>At the simple script-like end of the spectrum, the intent is not to + compete with Python, Perl, or shell languages, but rather to provide + filesystem operations when C++ is already the language of choice.</li>+ <li>Finer grained control over operations and error handling is available to + support more complex applications or other cases where throwing exceptions
+ isn't desired.</li> + </ul> + </li> +</ul> + +<p>A proposal,+<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1975.html";> +N1975</a>, to include Boost.Filesystem in Technical Report 2 has been accepted
+by the C++ Standards Committee. That proposal was based on version 2 of+Boost.Filesystem; presumably the final TR2 form will be based on version 3.</p>
+ +<h2><a name="Documentation">Documentation</a></h2> + +<p><b><a href="tutorial.html">Tutorial</a></b> - A gentle introduction to +the library, with example programs provided for you to experiment with.</p> ++<p><b><a href="reference.html">Reference</a></b> - Formal documentation in the
+style of the C++ standard for +every component of the library.</p> + +<p><b><a href="faq.htm">FAQ</a></b> - Frequently asked questions.</p> ++<p><b><a href="portability_guide.htm">Portability Guide</a></b> - Help for those
+concerned with writing code to run on multiple operating systems.</p> + +<p><b><a href="deprecated.html">Deprecated Features</a></b> - Identifies +deprecated features and their replacements.</p> ++<p><b><a href="v3.html">Version 3 Introduction</a></b> - Aimed at users of prior
+Boost.Filesystem versions.</p> ++<p><b><a href="v3_design.html">Version 3 Design</a></b> - Historical document
+from the start of the Version 3 design process.</p> ++<p><b><a href="design.htm">Original Design</a></b> - Historical document from
+the start of the Version 1 design process.</p> ++<p><b><a href="do_list.html">Do List</a></b> - Boost.Filesystem development work
+in the pipeline.</p> + +<h2><a name="Using">Using</a> the library</h2>+<p>Boost.Filesystem is implemented as a separately compiled library, so you must install +binaries in a location that can be found by your linker. If you followed the +<a href="http://www.boost.org/doc/libs/release/more/getting_started/index.html";>Boost Getting Started</a> instructions, that's already been done for you.</p>
+<h2><a name="Coding-guidelines">Coding guidelines</a></h2>+<p>For new code, defining <code>BOOST_FILESYSTEM_NO_DEPRECATED</code> before +including filesystem headers is strongly recommended. This prevents inadvertent +use of old features, particularly legacy function names, that have been replaced
+and are going to go away in the future.</p> +<h2><a name="Cautions">Cautions</a></h2> +<p>After reading the tutorial you can dive right into simple, +script-like programs using the Filesystem Library! Before doing any serious +work, however, there a few cautions to be aware of:</p>+<h4><b>Effects and Postconditions not guaranteed in the presence of race-conditions</b></h4> +<p>Filesystem function specifications follow the C++ Standard Library form, specifying behavior in terms of
+effects and postconditions. If+a <a href="reference.html#Race-condition">race-condition</a> exists, a function's +postconditions may no longer be true by the time the function returns to the
+caller.</p> +<blockquote> +<p><b><i>Explanation: </i></b>The state of files and directories is often +globally shared, and thus may be changed unexpectedly by other threads,+processes, or even other computers having network access to the filesystem. As an
+example of the difficulties this can cause, note that the following asserts +may fail:</p> +<blockquote>+<p><code>assert( exists( "foo" ) == exists( "foo" ) ); //
+(1)<br> +<br> +remove_all( "foo" );<br> +assert( !exists( "foo" ) ); // (2)<br> +<br>+assert( is_directory( "foo" ) == is_directory( "foo" ) ); //
+(3)</code></p> +</blockquote>+<p>(1) will fail if a non-existent "foo" comes into existence, or an +existent "foo" is removed, between the first and second call to <i>exists()</i>. +This could happen if, during the execution of the example code, another thread, +process, or computer is also performing operations in the same directory.</p>
+<p>(2) will fail if between the call to <i>remove_all()</i> and the call to+<i>exists()</i> a new file or directory named "foo" is created by another
+thread, process, or computer.</p> +<p>(3) will fail if another thread, process, or computer removes an+existing file "foo" and then creates a directory named "foo", between the
+example code's two calls to <i>is_directory()</i>.</p> +</blockquote> +<h4><b>May throw exceptions</b></h4> +<p>Unless otherwise specified, Boost.Filesystem functions throw <i>+<a href="reference.html#basic_filesystem_error-constructors">basic_filesystem_error</a></i>
+exceptions if they cannot successfully complete their operational+specifications. Also, implementations may use C++ Standard Library functions,
+which may throw <i>std::bad_alloc</i>. These exceptions may be thrown even+though the error condition leading to the exception is not explicitly specified
+in the function's "Throws" paragraph.</p> +<p>All exceptions thrown by the Filesystem+Library are implemented by calling <a href="../../utility/throw_exception.html">
+boost::throw_exception()</a>. Thus exact behavior may differ depending on+BOOST_NO_EXCEPTIONS at the time the filesystem source files are compiled.</p> +<p>Non-throwing versions are provided of several functions that are often used +in contexts where error codes may be the preferred way to report an error.</p>
+ +<h2><a name="Headers">Headers</a></h2> + +<p>The Boost.Filesystem library provides several headers:</p> + +<ul>+ <li>Header <<a href="../../../boost/filesystem.hpp">boost/filesystem.hpp</a>>
+ provides access to all features of the library, except file streams.<br> + </li>+ <li>Header <<a href="../../../boost/filesystem/fstream.hpp">boost/filesystem<i>/</i>fstream.hpp</a>>
+ inherits the same components as the C++ Standard+ Library's <i>fstream</i> header, but files are identified by <code>const path&</code>
+ arguments rather that <code>const char*</code> arguments.</li> +</ul> +<h2><a name="Examples">Example programs</a></h2> +<p>See the <a href="tutorial.html">tutorial</a> for example programs.</p> +<h3>Other examples</h3>+<p>The programs used to generate the Boost regression test status tables use the
+Filesystem Library extensively. See:</p> +<ul>+ <li><a href="../../../tools/regression/src/process_jam_log.cpp">process_jam_log.cpp</a></li> + <li><a href="../../../tools/regression/src/compiler_status.cpp">compiler_status.cpp</a></li>
+</ul> +<h2><a name="Implementation">Implementation</a></h2> +<p>The current implementation supports operating systems which provide +the POSIX or Windows API's.</p> +<p>The library is in regular use on Apple OS X, HP-UX, IBM AIX, Linux,+Microsoft Windows, SGI IRIX, and Sun Solaris operating systems using a variety
+of compilers.</p> +<h2><a name="Macros">Macros</a></h2> +<p>Users may defined the following macros if desired. Sensible defaults are+provided, so users can ignore these macros unless they have special needs.</p> +<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td><b><i>Macro Name</i></b></td> + <td><b><i>Default</i></b></td> + <td><b><i>Effect if defined</i></b></td> + </tr> + <tr> + <td valign="top"><code>BOOST_FILESYSTEM_NO_DEPRECATED</code></td> + <td valign="top">Not defined.</td> + <td valign="top">Deprecated features are excluded from headers.</td> + </tr> + <tr> + <td valign="top"><code>BOOST_FILESYSTEM_DYN_LINK</code></td> + <td valign="top">Defined if <code>BOOST_ALL_DYN_LINK</code> is defined, + otherwise not defined.</td>+ <td valign="top">The Boost.Filesystem library is dynamically linked. If not defined,
+ static linking is assumed.</td> + </tr> + <tr> + <td valign="top"><code>BOOST_FILESYSTEM_NO_LIB</code></td> + <td valign="top">Defined if <code>BOOST_ALL_NO_LIB</code> is defined, + otherwise not defined.</td>+ <td valign="top">Boost.Filesystem library does not use the Boost auto-link
+ facility.</td> + </tr> + </table> +<p>User-defined BOOST_POSIX_API and BOOST_WINDOWS_API macros are no longer +supported.</p> +<h2><a name="Building">Building</a> the object-library</h2>+<p>The object-library will be built automatically if you are using the Boost
+build system. See+<a href="../../../more/getting_started.html">Getting Started</a>. It can also be
+built manually using a <a href="../build/Jamfile.v2">Jamfile</a>+supplied in directory libs/filesystem/build, or the user can construct an IDE
+project or make file which includes the object-library source files.</p> +<p>The object-library source files are+supplied in directory <a href="../src">libs/filesystem/src</a>. These source files implement the +library for POSIX or Windows compatible operating systems; no implementation is
+supplied for other operating systems. Note that many operating systems not +normally thought of as POSIX systems, such as mainframe legacy+operating systems or embedded operating systems, support POSIX compatible file
+systems and so will work with the Filesystem Library.</p>+<p>The object-library can be built for static or dynamic (shared/dll) linking.
+This is controlled by the BOOST_ALL_DYN_LINK or BOOST_FILESYSTEM_DYN_LINK+macros. See the <a href="http://www.boost.org/development/separate_compilation.html";>Separate
+Compilation</a> page for a description of the techniques used.</p> +<h3>Note for <a name="Cgywin">Cygwin</a> users</h3> +<p> <a href="http://www.cygwin.com/";>Cygwin</a> version 1.7 or later is+required because only versions of GCC with wide character strings are supported.</p>
++<p> The library's implementation code treats Cygwin as a Windows platform, and
+thus uses the Windows API and uses Windows path syntax as the native path +syntax.</p> + +<h2><a name="Change-history">Version history</a></h2> + +<h3>Version 3</h3> ++<p>Boost <span style="background-color: #FFFF00">1.??.0 - ???, 2010</span> - Internationalization via single class <code>path</code>.
+More uniform error handling.</p> ++<p>Peter Dimov suggested use of a single path class rather than a <code>basic_path</code>
+class template. That idea was the basis for the Version 3 redesign.</p> ++<p>Thanks for comments from Robert Stewart, Zach Laine, Peter Dimov, Gregory
+Peele, Scott McMurray, John Bytheway, Jeff Flinn, Jeffery Bosboom.</p> + +<h3>Version 2</h3> ++<p>Boost 1.34.0 - May, 2007 - Internationalization via <code>basic_path</code>
+template.</p> ++<p>So many people have contributed comments and bug reports that it isn't any +longer possible to acknowledge them individually. That said, Peter Dimov and Rob +Stewart need to be specially thanked for their many constructive criticisms and
+suggestions. Terence +Wilson and Chris Frey contributed timing programs which helped illuminate +performance issues.</p> + +<h3>Version 1</h3> + +<p>Boost 1.30.0 - March, 2003 - Initial official Boost release.</p> + +<p>The Filesystem Library was designed and implemented by Beman Dawes. The +original <i>directory_iterator</i> and <i>filesystem_error</i> classes were+based on prior work from Dietmar Kuehl, as modified by Jan Langer. Thomas Witt +was a particular help in later stages of initial development. Peter Dimov and
+Rob Stewart made many useful suggestions and comments over a long period of +time. Howard Hinnant helped with internationalization issues.</p> + +<p>Key <a href="design.htm#Requirements">design requirements</a> and +<a href="design.htm#Realities">design realities</a> were developed during+extensive discussions on the Boost mailing list, followed by comments on the +initial implementation. Numerous helpful comments were then received during the
+Formal Review.<p>Participants included +Aaron Brashears, +Alan Bellingham, +Aleksey Gurtovoy, +Alex Rosenberg, +Alisdair Meredith, +Andy Glew, +Anthony Williams, +Baptiste Lepilleur, +Beman Dawes, +Bill Kempf, +Bill Seymour, +Carl Daniel, +Chris Little, +Chuck Allison, +Craig Henderson, +Dan Nuffer, +Dan'l Miller, +Daniel Frey, +Darin Adler, +David Abrahams, +David Held, +Davlet Panech, +Dietmar Kuehl, +Douglas Gregor, +Dylan Nicholson, +Ed Brey, +Eric Jensen, +Eric Woodruff, +Fedder Skovgaard, +Gary Powell, +Gennaro Prota, +Geoff Leyland, +George Heintzelman, +Giovanni Bajo, +Glen Knowles, +Hillel Sims, +Howard Hinnant, +Jaap Suter, +James Dennett, +Jan Langer, +Jani Kajala, +Jason Stewart, +Jeff Garland, +Jens Maurer, +Jesse Jones, +Jim Hyslop, +Joel de Guzman, +Joel Young, +John Levon, +John Maddock, +John Williston, +Jonathan Caves, +Jonathan Biggar, +Jurko, +Justus Schwartz, +Keith Burton, +Ken Hagen, +Kostya Altukhov, +Mark Rodgers, +Martin Schuerch, +Matt Austern, +Matthias Troyer, +Mattias Flodin, +Michiel Salters, +Mickael Pointier, +Misha Bergal, +Neal Becker, +Noel Yap, +Parksie, +Patrick Hartling, Pavel Vozenilek, +Pete Becker, +Peter Dimov, +Rainer Deyke, +Rene Rivera, +Rob Lievaart, +Rob Stewart, +Ron Garcia, +Ross Smith, +Sashan, +Steve Robbins, +Thomas Witt, +Tom Harris, +Toon Knapen, +Victor Wagner, +Vincent Finn, +Vladimir Prus, and +Yitzhak Sapir ++<p>A lengthy discussion on the C++ committee's library reflector illuminated the "illusion +of portability" problem, particularly in postings by PJ Plauger and Pete Becker.</p>
++<p>Walter Landry provided much help illuminating symbolic link use cases for
+version 1.31.0. </p> + +<hr> +<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->11 June, 2010<!--webbot bot="Timestamp" endspan i-checksum="19839" --></p>
+ +<p>© Copyright Beman Dawes, 2002-2005</p> +<p> Use, modification, and distribution are subject to the Boost Software +License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt";> +www.boost.org/LICENSE_1_0.txt</a></p> + +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/path_table.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,260 @@+// Generate an HTML table showing path decomposition ---------------------------------//
+ +// Copyright Beman Dawes 2005. + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// See http://www.boost.org/libs/filesystem for documentation. ++// For purposes of generating the table, support both POSIX and Windows paths
+ +#include "boost/filesystem.hpp" +#include <iostream> +#include <fstream> + +using boost::filesystem::path; +using std::string; +using std::cout; + +namespace +{ + std::ifstream infile; + std::ofstream posix_outfile; + std::ifstream posix_infile; + std::ofstream outfile; + + bool posix; + + const string empty_string; + + struct column_base + { + virtual string heading() const = 0; + virtual string cell_value( const path & p ) const = 0; + }; + + struct c0 : public column_base + { + string heading() const { return string("<code>string()</code>"); } + string cell_value( const path & p ) const { return p.string(); } + } o0; + + struct c1 : public column_base + {+ string heading() const { return string("<code>generic_<br>string()</code>"); } + string cell_value( const path & p ) const { return p.generic_string(); }
+ } o1; + + struct c2 : public column_base + {+ string heading() const { return string("Iteration<br>over<br>Elements"); }
+ string cell_value( const path & p ) const + { + string s; + for( path::iterator i(p.begin()); i != p.end(); ++i ) + { + if ( i != p.begin() ) s += ','; + s += (*i).string(); + } + return s; + } + } o2; + + struct c3 : public column_base + {+ string heading() const { return string("<code>root_<br>path()</code>"); } + string cell_value( const path & p ) const { return p.root_path().string(); }
+ } o3; + + struct c4 : public column_base + {+ string heading() const { return string("<code>root_<br>name()</code>"); } + string cell_value( const path & p ) const { return p.root_name().string(); }
+ } o4; + + struct c5 : public column_base + {+ string heading() const { return string("<code>root_<br>directory()</code>"); } + string cell_value( const path & p ) const { return p.root_directory().string(); }
+ } o5; + + struct c6 : public column_base + {+ string heading() const { return string("<code>relative_<br>path()</code>"); } + string cell_value( const path & p ) const { return p.relative_path().string(); }
+ } o6; + + struct c7 : public column_base + {+ string heading() const { return string("<code>parent_<br>path()</code>"); } + string cell_value( const path & p ) const { return p.parent_path().string(); }
+ } o7; + + struct c8 : public column_base + { + string heading() const { return string("<code>filename()</code>"); }+ string cell_value( const path & p ) const { return p.filename().string(); }
+ } o8; ++ const column_base * column[] = { &o2, &o0, &o1, &o3, &o4, &o5, &o6, &o7, &o8 };
++ // do_cell ---------------------------------------------------------------//
+ + void do_cell( const string & test_case, int i ) + { + string temp = column[i]->cell_value(path(test_case)); + string value; + outfile << "<td>"; + if (temp.empty()) + value = "<font size=\"-1\"><i>empty</i></font>"; + else + value = string("<code>") + temp + "</code>"; + + if (posix) + posix_outfile << value << '\n'; + else + { + std::getline(posix_infile, temp); + if (value != temp) // POSIX and Windows differ + { + value.insert(0, "<br>"); + value.insert(0, temp); + value.insert(0, "<span style=\"background-color: #CCFFCC\">"); + value += "</span>"; + } + outfile << value; + } + outfile << "</td>\n"; + } ++// do_row ------------------------------------------------------------------//
+ + void do_row( const string & test_case ) + { + outfile << "<tr>\n"; + + if (test_case.empty()) + outfile << "<td><font size=\"-1\"><i>empty</i></font></td>\n"; + else + outfile << "<td><code>" << test_case << "</code></td>\n"; + + for ( int i = 0; i < sizeof(column)/sizeof(column_base&); ++i ) + { + do_cell( test_case, i ); + } + + outfile << "</tr>\n"; + } ++// do_table ----------------------------------------------------------------//
+ + void do_table() + { + outfile << + "<h1>Path Decomposition Table</h1>\n"+ "<p>Shaded entries indicate cases where <i>POSIX</i> and <i>Windows</i>\n"
+ "implementations yield different results. The top value is the\n"+ "<i>POSIX</i> result and the bottom value is the <i>Windows</i> result.\n"
+ "<table border=\"1\" cellspacing=\"0\" cellpadding=\"5\">\n" + "<p>\n" + ; + + // generate the column headings + + outfile << "<tr><td><b>Constructor<br>argument</b></td>\n"; + + for ( int i = 0; i < sizeof(column)/sizeof(column_base&); ++i ) + { + outfile << "<td><b>" << column[i]->heading() << "</b></td>\n"; + } + + outfile << "</tr>\n"; + + // generate a row for each input line + + string test_case; + while ( std::getline( infile, test_case ) ) + { + if (!test_case.empty() && *--test_case.end() == '\r') + test_case.erase(test_case.size()-1); + if (test_case.empty() || test_case[0] != '#') + do_row( test_case ); + } + + outfile << "</table>\n"; + } + +} // unnamed namespace ++// main ------------------------------------------------------------------------------//
+ +#define BOOST_NO_CPP_MAIN_SUCCESS_MESSAGE +#include <boost/test/included/prg_exec_monitor.hpp> + +int cpp_main( int argc, char * argv[] ) // note name! +{ + if ( argc != 5 ) + { + std::cerr <<+ "Usage: path_table \"POSIX\"|\"Windows\" input-file posix-file output-file\n"
+ "Run on POSIX first, then on Windows\n" + " \"POSIX\" causes POSIX results to be save in posix-file;\n" + " \"Windows\" causes POSIX results read from posix-file\n" + " input-file contains the paths to appear in the table.\n" + " posix-file will be used for POSIX results\n" + " output-file will contain the generated HTML.\n" + ; + return 1; + } + + infile.open( argv[2] ); + if ( !infile ) + { + std::cerr << "Could not open input file: " << argv[2] << std::endl; + return 1; + } + + if (string(argv[1]) == "POSIX") + { + posix = true; + posix_outfile.open( argv[3] ); + if ( !posix_outfile ) + {+ std::cerr << "Could not open POSIX output file: " << argv[3] << std::endl;
+ return 1; + } + } + else + { + posix = false; + posix_infile.open( argv[3] ); + if ( !posix_infile ) + {+ std::cerr << "Could not open POSIX input file: " << argv[3] << std::endl;
+ return 1; + } + } + + outfile.open( argv[4] ); + if ( !outfile ) + { + std::cerr << "Could not open output file: " << argv[2] << std::endl; + return 1; + } + + outfile << "<html>\n" + "<head>\n" + "<title>Path Decomposition Table</title>\n" + "</head>\n" + "<body bgcolor=\"#ffffff\" text=\"#000000\">\n" + ; + + do_table(); + + outfile << "</body>\n" + "</html>\n" + ; + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/path_table.txt Sun Aug 22 23:21:17 2010 @@ -0,0 +1,50 @@ +# Paths for the reference.html Path Decomposition Table +# +# This is the input file for path_table, which generates the actual html +# +# Copyright Beman Dawes 2010 +# +# Distributed under the Boost Software License, Version 1.0. +# See www.boost.org/LICENSE_1_0.txt +# +# Note that an empty line is treated as input rather than as a comment + +. +.. +foo +/ +/foo +foo/ +/foo/ +foo/bar +/foo/bar +//net +//net/foo +///foo/// +///foo///bar +/. +./ +/.. +../ +foo/. +foo/.. +foo/./ +foo/./bar +foo/.. +foo/../ +foo/../bar +c: +c:/ +c:foo +c:/foo +c:foo/ +c:/foo/ +c:/foo/bar +prn: +c:\ +c:foo +c:\foo +c:foo\ +c:\foo\ +c:\foo/ +c:/foo\bar ======================================= --- /dev/null+++ /trunk/libs/filesystem/v3/doc/portability_guide.htm Sun Aug 22 23:21:17 2010
@@ -0,0 +1,241 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Portability Guide</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body bgcolor="#FFFFFF"> + +<h1>+<img border="0" src="../../../../boost.png" align="center" width="300" height="86">Path
+Name Portability +Guide</h1> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </tr> +</table> + +<p> +<a href="#Introduction">Introduction</a><br> +<a href="#name_check_functions">name_check functions</a><br> +<a href="#recommendations">File and directory name recommendations</a></p> +<h2><a name="Introduction">Introduction</a></h2> +<p>Like any other C++ program which performs I/O operations, there is no +guarantee that a program using Boost.Filesystem will be portable between +operating systems. Critical aspects of I/O such as how the operating system +interprets paths are unspecified by the C and C++ Standards.</p> +<p>It is not possible to know if a file or directory name will be+valid (and thus portable) for an unknown operating system. There is always the possibility that an operating system could use
+names which are unusual (numbers less than 4096, for example) or very+limited in size (maximum of six character names, for example). In other words,
+portability is never absolute; it is always relative to specific operating +systems or +file systems.</p>+<p>It is possible, however, to know in advance if a directory or file name is likely to be valid for a particular
+operating system. It is also possible to construct names which are+likely to be portable to a large number of modern and legacy operating systems.</p>
++<p>Almost all modern operating systems support multiple file systems. At the +minimum, they support a native file system plus a CD-ROM file system (Generally
+ISO-9669, often with Juliet extensions).</p> + +<p>Each file system+may have its own naming rules. For example, modern versions of Windows support NTFS, FAT, FAT32, and ISO-9660 file systems, among others, and the naming rules
+for those file systems differ. Each file system may also have+differing rules for overall path validity, such as a maximum length or number of +sub-directories. Some legacy systems have different rules for directory names
+versus regular file names.</p> + +<p>As a result, Boost.Filesystem's <i>name_check</i> functions+cannot guarantee directory and file name portability. Rather, they are intended to +give the programmer a "fighting chance" to achieve portability by early
+detection of common naming problems.</p> + +<h2><a name="name_check_functions">name_check functions</a></h2> + +<p>A <i>name_check</i> function+returns true if its argument is valid as a directory and regular file name for a +particular operating or file system. A number of these functions are provided.</p>
+ +<p>The <a href="#portable_name">portable_name</a> function is of particular +interest because it has been carefully designed to provide wide +portability yet not overly restrict expressiveness.</p> + +<table border="1" cellpadding="5" cellspacing="0"> + <tr>+ <td align="center" colspan="2"><b>Library Supplied name_check Functions</b></td>
+ </tr> + <tr> + <td align="center"><b>Function</b></td> + <td align="center"><b>Description</b></td> + </tr> + <tr>+ <td align="left" valign="top"><code><a name="portable_posix_name">portable_posix_name</a>(const
+ std::string&<i> name</i>)</code></td>+ <td><b>Returns:</b> <i>true</i> if <code>!name.empty() && name</code> contains only the characters + specified in<i> Portable Filename Character Set</i> rules as defined in by + POSIX (<a href="http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap03.html";>www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap03.html</a>).<br> + The allowed characters are <code>0-9</code>, <code>a-z</code>, <code>A-Z</code>,
+ <code>'.'</code>, <code>'_'</code>, and <code>'-'</code>.<p><b>Use:</b> + applications which must be portable to any POSIX system.</td> + </tr> + <tr>+ <td align="left" valign="top"><code><a name="windows_name">windows_name</a>(const
+ std::string&<i> name</i>)</code></td>+ <td><b>Returns:</b> <i>true</i> if <code>!name.empty() && name</code> contains
+ only the characters specified by the Windows platform SDK as valid+ regardless of the file system <code>&& (name</code> is <code>"."</code> or + <code>".."</code> or does not end with a trailing space or period<code>)</code>. + The allowed characters are anything except <code>0x0-0x1F</code>, <code>'<'</code>, + <code>'>'</code>, <code>':'</code>, <code>'"'</code>, <code>'/'</code>,
+ <code>'\'</code>, and <code>'|'</code>.<p> + <b>Use:</b> applications which must be portable to Windows.</p>+ <p><b>Note:</b> Reserved device names are not valid as file names, but are + not being detected because they are still valid as a path. Specifically, + CON, PRN, AUX, CLOCK$, NUL, COM[1-9], LPT[1-9], and these names followed by
+ an extension (for example, NUL.tx7).</td> + </tr> + <tr>+ <td align="left" valign="top"><code><a name="portable_name">portable_name</a>(const
+ std::string&<i> name</i>)</code></td>+ <td><b>Returns:</b> <code> windows_name(name) && portable_posix_name(name) + && (name</code> is <code>"."</code> or <code>".."</code>, and the first character not a period or hyphen<code>)</code>.<p><b>Use:</b> applications which must be portable to a wide variety of + modern operating systems, large and small, and to some legacy O/S's. The
+ first character not a period or hyphen restriction is a requirement of + several older operating systems.</td> + </tr> + <tr> + <td align="left" valign="top"><code><a name="portable_directory_name">+ portable_directory_name</a>(const std::string&<i> name</i>)</code></td> + <td><b>Returns:</b> <code>portable_name(name) && (name</code> is <code>"."</code> + or <code>".."</code> or contains no periods<code>)</code>.<p><b>Use:</b> applications + which must be portable to a wide variety of platforms, including OpenVMS.</td>
+ </tr> + <tr> + <td align="left" valign="top"><code><a name="portable_file_name"> + portable_file_name</a>(const std::string&<i> name</i>)</code></td>+ <td><b>Returns:</b> <code>portable_name(name) && </code>any period is followed by one to three additional
+ non-period characters.<p><b>Use:</b> + applications which must be portable to a wide variety of platforms,+ including OpenVMS and other systems which have a concept of "file extension"
+ but limit its length.</td> + </tr> + <tr> + <td align="left" valign="top"><code><a name="native">native</a>(const + std::string&<i> name</i>)</code></td> + <td><b>Returns:</b> Implementation defined. Returns <i>+ true</i> for names considered valid by the operating system's native file + systems.<p><b>Note:</b> May return <i>true</i> for some names not considered valid + by the operating system under all conditions (particularly on operating systems which support
+ multiple file systems.)</td> + </tr> +</table> ++<h2>File and directory name <a name="recommendations">recommendations</a></h2>
+ +<table border="1" cellpadding="5" cellspacing="0"> + + <tr> + <td align="center" valign="top"><strong>Recommendation</strong></td> + <td align="center" valign="top"><strong>Rationale</strong></td> + </tr> + <tr>+ <td valign="top">Limit file and directory names to the characters A-Z, a-z, 0-9, period, hyphen, and + underscore.<p>Use any of the "portable_" <a href="#name_check_functions">
+ name check functions</a> to enforce this recommendation.</td>+ <td valign="top">These are the characters specified by the POSIX standard for portable directory and + file names, and are also valid for Windows, Mac, and many other modern file systems.</td>
+ </tr> + <tr> + <td valign="top">Do not use a period or hyphen as the first+ character of a name. Do not use period as the last character of a name.<p>
+ Use <a href="#portable_name">portable_name</a>, + <a href="#portable_directory_name">portable_directory_name</a>, or + <a href="#portable_file_name">portable_file_name</a> to enforce this + recommendation.</td>+ <td valign="top">Some operating systems treat have special rules for the + first character of names. POSIX, for example. Windows does not permit period
+ as the last character.</td> + </tr> + <tr> + <td valign="top">Do not use periods in directory names.<p>Use+ <a href="#portable_directory_name">portable_directory_name</a> to enforce
+ this recommendation.</td>+ <td valign="top">Requirement for ISO-9660 without Juliet extensions, OpenVMS filesystem, and other legacy systems.</td>
+ </tr> + <tr>+ <td valign="top">Do not use more that one period in a file name, and limit
+ the portion after the period to three characters.<p>Use + <a href="#portable_file_name">portable_file_name</a> to enforce this + recommendation.</td>+ <td valign="top">Requirement for ISO-9660 level 1, OpenVMS filesystem, and
+ other legacy systems. </td> + </tr> + <tr>+ <td valign="top">Do not assume names are case sensitive. For example, do not expected a directory to be + able to hold separate elements named "Foo" and "foo". </td> + <td valign="top">Some file systems are case insensitive. For example, Windows + NTFS is case preserving in the way it stores names, but case insensitive in + searching for names (unless running under the POSIX sub-system, it which
+ case it does case sensitive searches). </td> + </tr> + <tr>+ <td valign="top">Do not assume names are case insensitive. For example, do not expect a file + created with the name of "Foo" to be opened successfully with the name of "foo".</td> + <td valign="top">Some file systems are case sensitive. For example, POSIX.</td>
+ </tr> + <tr> + <td valign="top">Don't use hyphens in names.</td>+ <td valign="top">ISO-9660 level 1, and possibly some legacy systems, do not permit
+ hyphens.</td> + </tr> + <tr>+ <td valign="top">Limit the length of the string returned by path::string() to
+ 255 characters. + Note that ISO 9660 has an explicit directory tree depth limit of 8, although
+ this depth limit is removed by the Juliet extensions.</td>+ <td valign="top">Some operating systems place limits on the total path length. For example,
+ Windows 2000 limits paths to 260 characters total length.</td> + </tr> + <tr>+ <td valign="top">Limit the length of any one name in a path. Pick the specific limit according to
+ the operating systems and or file systems you wish portability to:<br> + Not a concern:: POSIX, Windows, MAC OS X.<br> + 31 characters: Classic Mac OS<br> + 8 characters + period + 3 characters: ISO 9660 level 1<br> + 32 characters: ISO 9660 level 2 and 3<br>+ 128 characters (64 if Unicode): ISO 9660 with Juliet extensions</td> + <td valign="top">Limiting name length can markedly reduce the expressiveness of file names, yet placing
+ only very high limits on lengths inhibits widest portability.</td> + </tr> +</table> + +<hr> +<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->17 February, 2010<!--webbot bot="Timestamp" endspan i-checksum="40536" --></p>
+ +<p>© Copyright Beman Dawes, 2002, 2003</p> +<p> Use, modification, and distribution are subject to the Boost Software+License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt"> +LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt";>
+www.boost.org/LICENSE_1_0.txt</a>)</p> + +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/reference.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,3059 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem Reference +</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td width="277"> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+ <td align="middle"> + <font size="7">Filesystem Library<br> + </font> + <font size="6">Version 3</font></td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </td> + </tr> +</table> + +<h1>Reference Documentation</h1> + +<h2><a name="TOC">Table of Contents</a></h2> ++<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
+ <tr>+ <td width="33%" valign="top"><a href="#Introduction">Introduction</a><br>
+ <a href="#Definitions">Definitions</a><br> + <a href="#Conformance">Conformance</a><br> + <a href="#Header-filesystem-synopsis"> + Header <filesystem> synopsis</a><br> + <a href="#Error-reporting">Error reporting</a><br> + <a href="#class-path">Class path</a><br>+ <a href="#path-constructors">path constructors</a><br>
+ <a href="#path-assignments">path assignments</a><br> + <a href="#path-appends">path appends</a><br> + <a href="#path-modifiers">path modifiers</a><br> + <a href="#path-native-format-observers">path native + format observers</a><br>+ <a href="#path-generic-format-observers">path generic
+ format observers</a><br> + <a href="#path-decomposition">path decomposition</a><br> + <a href="#path-query">path query</a><br> + <a href="#path-iterators">path iterators</a><br>+ <a href="#path-deprecated-functions">path deprecated functions</a><br> + <a href="#path-non-member-functions">path non-member functions</a><br> + <a href="#path-inserter-extractor">path inserters and extractor</a>s<span style="background-color: #FFFFFF"><br> +</span> <a href="#Class-filesystem_error">Class filesystem_error</a><br>
+ <a href="#filesystem_error-members">filesystem_error + constructors</a><br>+ f<a href="#filesystem_error-path1">ilesystem_error path1</a><br> + <a href="#filesystem_error-path2">filesystem_error path2</a><br> + <a href="#filesystem_error-what">filesystem_error what</a><br>
+<a href="#Class-directory_entry">Class directory_entry</a><br> + +<a href="#directory_entry-constructors">directory_entry constructors</a><br> + <a href="#directory_entry-modifiers">directory_entry modifiers</a><br> + <a href="#directory_entry-observers">directory_entry observers</a><br>
+<a href="#Class-directory_iterator">Class directory_iterator</a><br> + <a href="#directory_iterator-members">directory_iterator + members</a><br>+<a href="#Class-recursive_directory_iterator">Class recursive_directory_iterator</a><br>
+ <a href="#file_status">Class + file_status</a><br> + </td> + <td width="33%" valign="top"> + <a href="#Operational-functions"> + Operational functions</a><br> +   <a href="#absolute">absolute</a><br> + <a href="#copy_file">copy_file</a><br>+   <a href="#create_directories">create_directories</a><br> +   <a href="#create_directory">create_directory</a><br> +   <a href="#create_hard_link">create_hard_link</a><br>
+   <a href="#create_symlink">create_symlink</a><br> +   <a href="#current_path">current_path</a><br> +   <a href="#exists">exists</a><br> +   <a href="#equivalent">equivalent</a><br> +   <a href="#file_size">file_size</a><br> +   i<a href="#is_directory">s_directory</a><br> +   <a href="#is_empty">is_empty</a><br> +   <a href="#is_other">is_other</a><br> +   <a href="#is_regular_file">is_regular_file</a><br> +   <a href="#is_symlink">is_symlink</a><br> +   <a href="#last_write_time">last_write_time</a><br> + <a href="#read_symlink">read_symlink</a><br> +   <a href="#remove">remove</a><br> +   <a href="#remove_all">remove_all</a><br> +   <a href="#rename">rename</a><br> + <a href="#resize_file">resize_file</a><br> +   <a href="#space">space</a><br> +   <a href="#status">status</a><br> +   <a href="#status_known">status_known</a><br> +   <a href="#symlink_status">symlink_status</a><br> +   <a href="#system_complete">system_complete</a><br> + <a href="#unique_path">unique_path</a></td> + <td width="34%" valign="top"> + <a href="#File-streams">File streams</a><br> +<a href="#Path-decomposition-table">Path decomposition table</a><br> +<a href="#Acknowledgements">Acknowledgements</a><br> +<a href="#References">References</a><br> + </td> + </tr> +</table> + +<h2><a name="Introduction">Introduction</a></h2> ++<p>This reference documentation describes components that C++ programs may use +to perform operations involving file systems, including paths, regular files,
+and directories.</p> +<h2><a name="Definitions">Definitions</a></h2>+<p>The following definitions shall apply throughout this reference documentation:</p> +<p><i><b><a name="File">File</a>:</b> </i>An object that can be written to, or read from, or both. A file +has certain attributes, including type. Common types of files include regular files +and directories. Other types of files, such as symbolic links, may be supported by the
+implementation.</p>+<p><b><i><a name="File-system">File system</a>:</i></b> A collection of files and certain of their attributes.</p> +<p><b><i><a name="Filename">Filename</a>:</i></b> The name of a file. Slash and 0
+characters are not permitted. Implementations may define additional+characters or specific names that are not permitted. Filenames <code>.</code>
+and <code>..</code> have special meaning. Implementations may define +additional filenames that have special meaning.</p> +<blockquote>+ <p><i>[Note:</i> Most operating systems prohibit the ANSI control characters
+ (0x00-0x31) in filenames.</p> + <p>Windows prohibits the characters 0x00-0x31, <code>"</code>,<code>+ *</code>,<code> :</code>,<code> <</code>,<code> ></code>,<code> ?</code>,<code>
+ \</code>,<code> /</code>, and<code> |</code> <i>--end note]</i></p> +</blockquote>+<p><b><i><a name="Path">Path</a>:</i></b> A sequence of elements that identify +a location within a filesystem. The elements are the <i>root-name<sub>opt</sub></i>, <i> +root-directory<sub>opt</sub></i>, and an optional sequence of filenames. [<i>Note:</i> +A <a href="#Pathname">pathname</a> is the concrete representation of a path. <i>--end note</i>]</p> +<p><b><i><a name="Absolute-path">Absolute path</a>:</i></b> A path that uniquely
+identifies a file. The format is implementation defined. </p> +<blockquote> + <p><i>[Note:</i> For POSIX-like implementations, including<b> </b>Unix + variants, Linux, and Mac OS X, only paths + that begin with a slash are absolute paths.</p>+ <p>For Windows-like implementations, including <a href="http://www.cygwin.com/";>
+ Cygwin</a> and+ <a href="http://www.mingw.org/";>MinGW</a>, only paths that begin with a drive + specifier followed by a slash, or begin with two slashes, are absolute paths. <i>--end
+ note]</i></p> +</blockquote> +<p><b><a name="Relative-path">Relative path</a>:</b> A path that uniquely+identifies a file only when considered relative to some other path. [<i>Note:</i> +Paths "." and ".." are considered to be relative paths. <i>--end note</i>]</p> +<p><i><b><a name="Pathname">Pathname</a>:</b> </i>A character string that represents a +path. Pathnames are formatted according to the generic pathname format or the
+native pathname format.</p>+<p><b><i><a name="generic-pathname-format">Generic pathname format:</a></i></b></p>
+<blockquote> +<p><i>pathname:<br>+ root-name<sub>opt</sub>
+root-directory<sub>opt</sub> relative-path<sub>opt</sub></i></p> +<p><i>root-name:<br> + +implementation-defined</i></p> +<blockquote> + <blockquote>+<p>[<i>Note:</i> Most POSIX and Windows based operating system define a name
+beginning with two slashes (or backslashes, for Windows) as a root-name+identifying network locations. Windows defines a single letter followed by a +<code>":"</code> as a root-name identifying a disc drive. <i>--end note</i>]</p>
+ </blockquote> +</blockquote> +<p><i>root-directory:<br> + +directory-separator</i></p> +<p><i>relative-path:<br> + +filename<br>+ relative-path
+directory-separator<br>+ relative-path
+directory-separator filename</i></p> +<p><i>filename:<br> + name<br>+ </i><code>"."</code><i><br> + </i><code>
+".."</code></p> +<p><i>directory-separator:<br>+ <code>"/"<br> + "/"</code> directory-separator</i></p> +<p>Multiple successive <i>directory-separator</i> characters are considered to +be the same as one <i>directory-separator</i> character. The <i>filename</i> +<code>"."</code> is considered to be a reference to the current directory. The +<i>filename</i> <code>".."</code> is considered to be a reference to the current +directory. Specific <i>filenames</i> may have special meaning for a particular
+operating system.</p> +</blockquote>+<p><b><i><a name="native-pathname-format">Native pathname format:</a></i></b>
+An implementation defined format. [<i>Note:</i> For POSIX-like operating+systems, the native format is the same as the generic format. For Windows, the
+native format is similar to the generic format, but the directory-separator +characters can be either slashes or backslashes. <i>--end note</i>]</p>+<p><i><b><a name="Link">Link</a>:</b> </i>A directory entry object that associates a
+filename with a file. On some file systems, several directory entries can +associate names with the same file.</p>+<p><b><i><a name="Hard-link">Hard link</a>:</i></b> A link to an existing file. Some +file systems support multiple hard links to a file. If the last hard link to a
+file is removed, the file itself is removed.</p> +<blockquote> +<p>[<i>Note:</i> A hard link can be thought of as a shared-ownership smart +pointer to a file.<i> -- end note</i>]<i> </i></p> +</blockquote>+<p><i><a name="Symbolic-link">S<b>ymbolic link</b></a><b>:</b> </i>A type of file with the +property that when the file is encountered during pathname resolution, a string
+stored by the file is used to modify the pathname resolution.</p> +<blockquote>+<p>[<i>Note:</i> A symbolic link can be thought of as a raw pointer to a file.
+If the file pointed to does not exist, the symbolic link is said to be a +"dangling" symbolic link.<i> -- end note</i>]<i> </i></p> +</blockquote>+<p><b><i><a name="Race-condition">Race condition</a>:</i></b> The condition that occurs
+when multiple threads, processes, or computers interleave access and +modification of +the same object within a file system.</p>+<p><b><i><a name="Dot">Dot</a>, Dot Dot:</i></b> Synonyms for the filenames <code>"."</code> +and <code>".."</code>, respectively. The dot filename names the current
+directory. The dot dot filename names the parent directory.</p> +<h2><a name="Conformance">Conformance</a></h2> +<p>Behavior is sometimes specified by reference to ISO/IEC 9945:2003, <i>+<a href="http://www.unix.org/single_unix_specification/";>POSIX</a></i>. How such behavior is actually implemented is unspecified.</p>
+<blockquote>+<p>[<i>Note:</i> This constitutes an "as if" rule for implementation of +operating system dependent behavior. Presumably implementations will usually call native
+operating system API's. <i>--end note</i>]</p> +</blockquote>+<p>Implementations are encouraged, but not required, to support such behavior
+ +as it is defined by <i>POSIX</i>. Implementations shall document any+behavior that differs from the <i>POSIX</i> defined behavior. Implementations that do not support exact <i>POSIX</i> behavior are +encouraged to provide behavior as close to <i>POSIX</i> behavior as is reasonable given the +limitations of actual operating systems and file systems. If an implementation cannot provide any
+reasonable behavior, the implementation shall report an error in an +implementation-defined manner.</p> +<blockquote>+<p>[<i>Note:</i> Such errors might be reported by an #error directive, a <code>
+static_assert</code>, a <code>filesystem_error</code> exception, a special +return value, or some other manner. <i>--end note</i>]</p> +</blockquote> +<p>Specific operating systems such as <i>OpenMVS</i>,+<i>UNIX</i>, and <i>Windows</i> are mentioned only for purposes of illustration or to +give guidance to implementers. No slight to other operating systems is implied
+or intended.</p>+<p>The <i>Effects</i> and <i>Postconditions</i> of functions described in this
+reference +may not be achieved in+the presence of <a href="#Race-condition">race conditions</a>. No diagnostic is required.</p> +<p>If the possibility of race conditions would make it unreliable for a program to +test for a precondition before calling a function described in this clause, <i>
+Requires</i> is not specified for the condition. Instead, the condition is +specified as a <i>Throws</i> condition.</p> +<blockquote>+<p>[<i>Note:</i> As a design practice, preconditions are not specified when it +is unreasonable for a program to detect them prior to calling the function. <i>
+-- end note</i>]</p> +</blockquote>+<h2><a name="Header-filesystem-synopsis">Header <code><boost/filesystem></code> synopsis</a></h2>
+<pre> namespace boost + { + namespace filesystem + { + class <a href="#class-path">path</a>; + + void swap(path& lhs, path& rhs);+ bool lexicographical_compare(path::iterator first1, path::iterator last1, + path::iterator first2, path::iterator last2);
+ + bool operator==(const path& lhs, const path& rhs); + bool operator!=(const path& lhs, const path& rhs); + bool operator< (const path& lhs, const path& rhs); + bool operator<=(const path& lhs, const path& rhs); + bool operator> (const path& lhs, const path& rhs); + bool operator>=(const path& lhs, const path& rhs); + + path operator/ (const path& lhs, const path& rhs); ++ std::ostream& operator<<( std::ostream& os, const path& p ); + std::wostream& operator<<( std::wostream& os, const path& p ); + std::istream& operator>>( std::istream& is, path& p ); + std::wistream& operator>>( std::wistream& is, path& p )
++ <span style="background-color: #FFFFFF">class <a href="#Class-filesystem_error">filesystem_error</a>;</span><span style="background-color: #FFFF00">
+</span>+ <span style="background-color: #FFFFFF">class <a href="#Class-directory_entry">directory_entry</a>;
++</span> class <a href="#Class-directory_iterator">directory_iterator</a>;
++ class <a href="#Class-recursive_directory_iterator">recursive_directory_iterator</a>;
++ enum <a name="file_type">file_type</a> { status_error, file_not_found, regular_file, directory_file, + symlink_file, block_file, character_file, fifo_file, socket_file,
+ type_unknown + }; + + class <a href="#file_status">file_status</a>; ++ <span style="background-color: #FFFFFF">struct <a name="space_info">space_info</a> // returned by </span><a href="#space" style="text-decoration: none"><span style="background-color: #FFFFFF">space</span></a><span style="background-color: #FFFFFF"> function
+ { + uintmax_t capacity; + uintmax_t free;+ uintmax_t available; // free space available to a non-privileged process
+ }; + + BOOST_SCOPED_ENUM_START(<a name="copy_option">copy_option</a>) + { + fail_if_exists, + overwrite_if_exists + }; + BOOST_SCOPED_ENUM_END + + // <a href="#Operational-functions">operational functions</a> ++</span> path <a href="#absolute">absolute</a>(const path& p, const path& base=current_path());
++ void <a href="#copy_file">copy_file</a>(const path& from, const path& to); + void <a href="#copy_file">copy_file</a>(const path& from, const path& to, system::error_code& ec); + void <a href="#copy_file">copy_file</a>(const path& from, const path& to, BOOST_SCOPED_ENUM(<a href="#copy_option">copy_option</a>) option); + void <a href="#copy_file">copy_file</a>(const path& from, const path& to, BOOST_SCOPED_ENUM(<a href="#copy_option">copy_option</a>) option,
+ system::error_code& ec); ++ bool <a href="#create_directories">create_directories</a>(const path& p); + bool <a href="#create_directories">create_directories</a>(const path& p, system::error_code& ec);
++ bool <a href="#create_directory">create_directory</a>(const path& p); + bool <a href="#create_directory">create_directory</a>(const path& p, system::error_code& ec);
++ void <a href="#create_hard_link">create_hard_link</a>(const path& to, const path& from); + void <a href="#create_hard_link">create_hard_link</a>(const path& to, const path& from, system::error_code& ec);
++<span style="background-color: #FFFFFF"> void <a href="#create_symlink">create_symlink</a>(const path& to, const path& from); + void <a href="#create_symlink">create_symlink</a>(const path& to, const path& from</span>, system::error_code& ec<span style="background-color: #FFFFFF">);
+ +</span> path <a href="#current_path">current_path</a>();+ path <a href="#current_path">current_path</a>(system::error_code& ec); + void <a href="#current_path">current_path</a>(const path& p); + void <a href="#current_path">current_path</a>(const path& p, system::error_code& ec);
+ + bool <a href="#exists">exists</a>(file_status s); + bool <a href="#exists">exists</a>(const path& p);+ bool <a href="#exists">exists</a>(const path& p, system::error_code& ec);
++ bool <a href="#equivalent">equivalent</a>(const path& p1, const path& p2); + bool <a href="#equivalent">equivalent</a>(const path& p1, const path& p2, system::error_code& ec);
++ <span style="background-color: #FFFFFF; ">uintmax_t</span> <a href="#file_size">file_size</a>(const path& p); + <span style="background-color: #FFFFFF; ">uintmax_t</span> <a href="#file_size">file_size</a>(const path& p, system::error_code& ec);
+ + bool <a href="#is_directory">is_directory</a>(file_status s);+ bool <a href="#is_directory2">is_directory</a>(const path& p); + bool <a href="#is_directory2">is_directory</a>(const path& p, system::error_code& ec);
+ + bool <a href="#is_empty">is_empty</a>(const path& p);+ bool <a href="#is_empty">is_empty</a>(const path& p, system::error_code& ec);
+ + bool <a href="#is_other">is_other</a>(file_status s); + bool <a href="#is_other2">is_other</a>(const path& p,);+ bool <a href="#is_other2">is_other</a>(const path& p, system::error_code& ec);
++ bool <a href="#is_regular_file">is_regular_file</a>(file_status s); + bool i<a href="#is_regular_file2">s_regular_file</a>(const path& p); + bool i<a href="#is_regular_file2">s_regular_file</a>(const path& p, system::error_code& ec);
+ + bool <a href="#is_symlink">is_symlink</a>(file_status s);+ bool <a href="#is_symlink2">is_symlink</a>(const path& p); + bool <a href="#is_symlink2">is_symlink</a>(const path& p, system::error_code& ec);
++ std::time_t <a href="#last_write_time">last_write_time</a>(const path& p); + std::time_t <a href="#last_write_time">last_write_time</a>(const path& p, system::error_code& ec); + void <a href="#last_write_time2">last_write_time</a>(const path& p, const std::time_t new_time); + void <a href="#last_write_time2">last_write_time</a>(const path& p, const std::time_t new_time, system::error_code& ec);
++ path <a href="#read_symlink">read_symlink</a>(const path& p); + path <a href="#read_symlink">read_symlink</a>(const path& p, system::error_code& ec);
+ + bool <a href="#remove">remove</a>(const path& p);+ bool <a href="#remove">remove</a>(const path& p, system::error_code& ec);
+ + uintmax_t <a href="#remove_all">remove_all</a>(const path& p);+ uintmax_t <a href="#remove_all">remove_all</a>(const path& p, system::error_code& ec);
++ void <a href="#rename">rename</a>(const path& from, const path& to); + void <a href="#rename">rename</a>(const path& from, const path& to, system::error_code& ec);
++<span style="background-color: #FFFFFF"> <a href="#space_info">space_info</a> <a href="#space">space</a>(const path& p); + <a href="#space_info">space_info</a> <a href="#space">space</a>(const path& p</span>, system::error_code& ec<span style="background-color: #FFFFFF">);
+</span><span style="background-color: #FFFF00">+</span> <a href="#file_status">file_status</a> <a href="#status">status</a>(const path& p); + <a href="#file_status">file_status</a> <a href="#status">status</a>(const path& p, system::error_code& ec);
+ + bool <a href="#status_known">status_known</a>(file_status s); ++ <a href="#file_status">file_status</a> <a href="#symlink_status">symlink_status</a>(const path& p); + <a href="#file_status">file_status</a> <a href="#symlink_status">symlink_status</a>(const path& p, system::error_code& ec);
++ path <a href="#system_complete">system_complete</a>(const path& p); + path <a href="#system_complete">system_complete</a>(const path& p, system::error_code& ec);
++ path <a href="#unique_path">unique_path</a>(const path& model="%%%%-%%%%-%%%%-%%%%"); + path <a href="#unique_path">unique_path</a>(const path& model, system::error_code& ec);
+ + } // namespace filesystem + } // namespace boost</pre> +<h2><a name="Error-reporting">Error reporting</a></h2> +<p>Filesystem library functions often provide two overloads, one that +throws an exception to report file system errors, and another that sets an +<code>error_code</code>.</p> +<blockquote> +<p>[<i>Note:</i> This supports two common use cases:</p> +<ul> + <li>Uses where file system +errors are truly exceptional and indicate a serious failure. Throwing an+ exception is the most appropriate response. This is the preferred default for
+ most everyday programming.<br> + </li>+ <li>Uses where file system system errors are routine and do not necessarily represent + failure. Returning an error code is the most appropriate response. This allows + application specific error handling, including simply ignoring the error.</li>
+</ul> + <p><i>--end note</i>]</p> +</blockquote> +<p>Functions <b>not</b> having an argument of type +<code>system::error_code&</code> +report errors as follows, unless otherwise specified:</p> + <ul> + <li>When a call by the+ implementation to an operating system or other underlying API results in an + error that prevents the function from meeting its specifications, an exception
+ of type +<code>filesystem_error</code> is thrown.<br> + </li>+ <li>Failure to allocate storage is reported by throwing an exception as described in the C++ standard,
+ 17.6.4.10 [res.on.exception.handling].<br> + </li> + <li>Destructors throw nothing.</li> + </ul> + <p>Functions having an argument of type+<code>system::error_code&</code> report errors as follows, unless otherwise
+ specified:</p> +<ul> + <li>If a call by the+ implementation to an operating system or other underlying API results in an
+ error that prevents the function from meeting its specifications, the +<code>system::error_code&</code> argument is set as+ appropriate appropriate for the specific error. Otherwise, <code>clear()</code>
+ is called on the +<code>system::error_code&</code> argument.<br> + </li> + <li>Failure to allocate storage is reported by + throwing an exception as described in the C++ standard, + 17.6.4.10 [res.on.exception.handling].</li> +</ul> +<h2><a name="class-path">Class <code>path</code></a></h2>+<p>An object of class <code>path</code> represents a <a href="#Path">path</a>, +and contains a <a href="#Pathname">pathname</a> Such an object is concerned only with the lexical and syntactic aspects +of a path. The path may not actually exist in external storage, and may contain pathnames which are not even valid for the current operating
+system. </p> +<pre> namespace boost + { + namespace filesystem + { + class path + { + public:+ typedef <b><i><a href="#value_type">see below</a></i></b> value_type; // char for POSIX, wchar_t for Windows + typedef std::basic_string<value_type> string_type; + typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type;
+ + // <a href="#path-constructors">constructors</a> and destructor + path(); + path(const path& p); + + template <class <a href="#Source">Source</a>>+ path(Source const& source, const codecvt_type& cvt=codecvt());
+ + template <class <a href="#InputIterator">InputIterator</a>>+ path(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());
+ + ~path(); + + // <a href="#path-assignments">assignments</a> + path& operator=(const path& p); + + template <class <a href="#Source">Source</a>> + path& operator=(Source const& source); + + template <class <a href="#Source">Source</a>>+ path& assign(Source const& source, const codecvt_type& cvt)
+ + template <class <a href="#InputIterator">InputIterator</a>>+ path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());
+ + // <a href="#path-appends">appends</a> + path& operator/=(const path& p); + + template <class <a href="#Source">Source</a>> + path& operator/=(Source const& source); + + template <class <a href="#Source">Source</a>>+ path& append(Source const& source, const codecvt_type& cvt);
+ + template <class <a href="#InputIterator">InputIterator</a>>+ path& append(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());
+ + // <a href="#path-modifiers">modifiers</a> + void <a href="#path-clear">clear</a>();+ path& <a href="#absolute">make_absolute</a>(const path& base); + path& <a href="#path-make_preferred">make_preferred</a>(); // POSIX: no effect. Windows: convert slashes to backslashes
+ path& <a href="#path-remove_filename">remove_filename</a>();+ path& <a href="#path-replace_extension">replace_extension</a>(const path& new_extension = path());
+ void <a href="#path-swap">swap</a>(path& rhs); ++ // <a href="#path-native-format-observers">native format observers</a>
+ const string_type& native() const; // native format, encoding + const value_type* c_str() const; // native().c_str() + + template <class String>+ String string(const codecvt_type& cvt=codecvt()) const; // native format
++ const string string(const codecvt_type& cvt=codecvt()) const; // native format + const wstring wstring(const codecvt_type& cvt=codecvt()) const; // ditto + const u16string u16string() const; // ditto + const u32string u32string() const; // ditto
++ // <a href="#path-generic-format-observers">generic format observers</a>
+ template <class String> + String generic_string() const; ++ const string generic_string(const codecvt_type& cvt=codecvt()) const; // generic format + const wstring generic_wstring(const codecvt_type& cvt=codecvt()) const; // ditto + const u16string generic_u16string() const; // ditto + const u32string generic_u32string() const; // ditto
+ + // <a href="#path-decomposition">decomposition</a> + path <a href="#path-root_name">root_name</a>() const; + path <a href="#path-root_directory">root_directory</a>() const; + path <a href="#path-root_path">root_path</a>() const; + path <a href="#path-relative_path">relative_path</a>() const; + path <a href="#path-parent_path">parent_path</a>() const; + path <a href="#path-filename">filename</a>() const; + path <a href="#path-stem">stem</a>() const; + path <a href="#path-extension">extension</a>() const; + + // <a href="#path-query">query</a> + bool <a href="#path-query">empty</a>() const; + bool <a href="#path-has_root_name">has_root_name</a>() const;+ bool <a href="#path-has_root_directory">has_root_directory</a>() const;
+ bool <a href="#path-has_root_path">has_root_path</a>() const;+ bool <a href="#path-has_relative_path">has_relative_path</a>() const;
+ bool <a href="#path-has_parent_path">has_parent_path</a>() const; + bool <a href="#path-has_filename">has_filename</a>() const; + bool <a href="#path-has_stem">has_stem</a>() const; + bool <a href="#path-has_extension">has_extension</a>() const; + bool <a href="#path-is_absolute">is_absolute</a>() const; + bool <a href="#path-is_relative">is_relative</a>() const; + + // <a href="#path-iterators">iterators</a> + class iterator; + typedef iterator const_iterator; + + iterator begin() const; + iterator end() const; + + // encoding conversion + static std::locale imbue( const std::locale& loc ); + static const codecvt_type & codecvt(); + + private: + string_type pathname; // <b><i>exposition only</i></b> + }; + + } // namespace filesystem + } // namespace boost</pre>+<p><code><a name="value_type">value_type</a></code> is an implementation-defined typedef for the
+character type used by the implementation to represent pathnames.</p> +<blockquote>+<p><i>[Note:</i> For POSIX-like implementations, including<b> </b>Unixes, Linux,
+and Mac OS X, <code>path::value_type</code> +is <code>char</code> .</p> +<p>For Windows-like implementations, including + <a href="http://www.cygwin.com/";>Cygwin</a> and+<a href="http://www.mingw.org/";>MinGW</a>, <code>path::value_type</code> is <code>
+wchar_t</code>. <i>--end note]</i></p> +</blockquote>+<p>For member functions described as returning <code>const string</code>, <code> +const wstring</code>, <code>const u16string</code>, or <code>const u32string</code>, +implementations are permitted to return <code>const string&</code>, <code>const +wstring&</code>, <code>const u16string&</code>, or <code>const u32string&</code>,
+respectively.</p> +<blockquote>+<p>[<i>Note:</i> This allows implementations to avoid unnecessary copies when no
+conversion is required. +Return-by-value is specified as+<code>const</code> to ensure programs won't break if moved to a return-by-reference
+implementation. <i>-- +end note</i>]</p> +</blockquote>+<p><code><a name="InputIterator">InputIterator</a></code> is required meet the
+requirements for a C++ standard library <code>RandomIterator</code>+compliant iterator. The iterator's value type is required to be <code>char</code>, <code>
+ wchar_t</code>, <code>char16_t</code>, or <code>char32_t</code>.</p> +<p><code><a name="Source">Source</a></code> is required to be one of:</p> +<ul> + <li>A container with a value type of <code>char</code>, <code> + wchar_t</code>, <code>char16_t</code>, or <code>char32_t</code>.</li>+ <li>An iterator for a null terminated byte-string. The value type is required + to be <code>char</code>, <code>wchar_t</code>, <code>char16_t</code>, or <code>
+ char32_t</code>.</li> + <li>A C-array. The value type is required to be <code>char</code>, <code> + wchar_t</code>, <code>char16_t</code>, or <code>char32_t</code>.</li> + <li>A <code>boost::filesystem::directory_entry</code>.</li> +</ul> +<p>The specifications for certain <code>path</code> functions require that+arguments in the generic pathname format be converted to native pathname format
+as they are stored in <code>pathname</code>. If the native format requires +regular file paths and directory paths to be formatted differently, the+implementation shall determine which format to use according to whether or not +the last element of the generic format string is a separator. [<i>Example:</i>
+On <a href="http://en.wikipedia.org/wiki/OpenVMS";>OpenVMS</a>, a path+constructed from <code>"/cats/jane"</code> would considered a regular file +path, and have a native format of <code>"[CATS]JANE"</code>, while a +path constructed from <code>"/cats/jane/"</code> would be considered a +directory path, and have a native format of <code>"[CATS.JANE]"</code>. +<i>--end example</i>] [<i>Note</i>: POSIX and Windows use the same native format +for regular file and directory pathnames, so this paragraph does not apply to
+them. <i>--end note</i>]</p> ++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + Class <code>path</code> does not currently map invalid characters in+ filenames to valid characters. In the future we might add something like
+ this:<blockquote> +<p>When converting filenames to the native operating system format,+implementations are encouraged, but not required, to convert otherwise invalid +characters or character sequences to valid characters or character sequences.
+Such conversions are implementation-defined.</p> +<blockquote> +<p>[<i>Note:</i> Filename conversion allows much wider portability of both +programs and filenames that would otherwise be possible.</p>+<p>Implementations are encouraged to base conversion on existing standards or +practice. Examples include the Uniform Resource Locator escape syntax of a percent sign (<code>'%'</code>)
+followed by two hex digits representing the character value. On+<i>OpenVMS</i>, which does not allow percent signs in filenames, a dollar sign (<code>'$'</code>) +followed by two hex digits is the existing practice, as is converting lowercase
+letters to uppercase.<i> -- end note.</i>]</p> +</blockquote> + </blockquote> + </td> + </tr> +</table> + +<h3> <a name="path-constructors"> <code> +<font size="4">path</font></code> constructors</a></h3> +<pre>path();</pre> +<blockquote> + <p><i>Postconditions:</i> <code>empty()</code>.</p> + </blockquote> +<pre>template <class <a href="#Source">Source</a>>+ path(Source const& source, const codecvt_type& cvt=codecvt());</pre>
+<pre>template <class <a href="#InputIterator">InputIterator</a>>+ path(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());</pre>
+<blockquote>+ <p><i>Effects:</i> Stores the contents [<code>begin</code>,<code>end</code>) + or <code>source</code> in <code>pathname</code>. If the contents are in the + generic format, they are converted to the native format. [<i>Note:</i> For
+ POSIX and Windows based implementations, the generic format is already + acceptable as a native format, so no generic to native conversion is + performed. <i>--end note</i>]</p> + <p>+ <i>Remarks:</i> If the value type of [<code>begin</code>,<code>end</code>) + or <code>source</code> is not <code>value_type</code>, conversion is performed
+ by <code>cvt</code>.</p> +</blockquote> +<h3> <a name="path-assignments"> <code> +<font size="4">path</font></code> assignments</a></h3> +<pre>template <class <a href="#Source">Source</a>> + path& operator=(Source const& source);</pre> +<pre>template <class <a href="#Source">Source</a>>+ path& assign(Source const& source, const codecvt_type& cvt);</pre>
+<pre>template <class <a href="#InputIterator">InputIterator</a>>+ path& assign(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());</pre>
+<blockquote>+ <p><i>Effects:</i> Stores the contents [<code>begin</code>,<code>end</code>) + or <code>source</code> in <code>pathname</code>. If the contents are in the + generic format, they are converted to the native format. [<i>Note:</i> For
+ POSIX and Windows based implementations, the generic format is already + acceptable as a native format, so no generic to native conversion is + performed. <i>--end note</i>]</p> + <p> + <i>Returns: </i><code>*this</code></p> + <p>+ <i>Remarks:</i> If the value type of [<code>begin</code>,<code>end</code>) + or <code>source</code> is not <code>value_type</code>, conversion is performed
+ by <code>cvt</code>.</p> + </blockquote>+<h3> <a name="path-appends"><code><font size="4"> path</font></code> appends</a></h3> + <p>The append operations use <code>operator/=</code> to denote their semantic + effect of appending the platform's preferred directory separator when needed. The
+ preferred + directory separator is implementation-defined.</p> +<blockquote>+ <p align="left">[<i>Note: </i>For POSIX-like implementations, including<b> </b> + Unix variants, Linux, and Mac OS X, the preferred directory separator is a
+ single forward slash.</p> + <p align="left">For Windows-like implementations, including + <a href="http://www.cygwin.com/";>Cygwin</a> and + <a href="http://www.mingw.org/";>MinGW</a>, the preferred directory + separator is a single backslash.<i>--end note</i>]</p> + </blockquote> +<pre>path& operator/=(const path& p);</pre> +<blockquote> + <p><i>Effects:</i></p> + <blockquote>+ Appends the preferred directory separator to the contained pathname, unless:<ul>
+ <li>an added separator + would be redundant, or</li> + <li>would change an relative path to an absolute path, or</li> + <li><code>p.empty()</code>, or</li> + <li><code>*p.native().cbegin()</code> is a directory separator.</li> + </ul> + <p>Appends <code>p.native()</code> to <code>pathname</code>.</p> + </blockquote> + <p><i>Returns: </i><code>*this</code></p> +</blockquote> +<pre>template <class <a href="#Source">Source</a>> + path& operator/=(Source const & source);</pre> +<pre>template <class <a href="#Source">Source</a>>+ path& append(Source const & source, const codecvt_type& cvt);</pre>
+<pre>template <class <a href="#InputIterator">InputIterator</a>>+ path& append(InputIterator begin, InputIterator end, const codecvt_type& cvt=codecvt());</pre>
+<blockquote> + <p><i>Effects:</i></p> + <blockquote>+ <p>Appends a native directory separator to the contained pathname, unless:</p>
+ <ul> + <li>an added separator + would be redundant, or</li> + <li>would change an relative path to an absoute path, or</li> + <li><code>p.empty()</code>, or</li> + <li><code>*p.native().cbegin()</code> is a separator.</li> + </ul> + <p>Appends the contents [<code>begin</code>,<code>end</code>)+ or <code>source</code> to <code>pathname</code>. If the contents are in the + generic format, they are converted to the native format. [<i>Note:</i> For
+ POSIX and Windows based implementations, the generic format is already + acceptable as a native format, so no generic to native conversion is + performed. <i>--end note</i>]</p> + </blockquote>+ <p><i>Remarks:</i> If the value type of [<code>begin</code>,<code>end</code>) + or <code>source</code> is not <code>value_type</code>, conversion is performed
+ by <code>cvt</code>.</p> + <p><i>Returns: </i><code>*this</code></p> + </blockquote> + +<h3> <a name="path-modifiers"> <code> +<font size="4">path</font></code> modifiers</a></h3> +<pre>void <a name="path-clear">clear</a>();</pre> +<blockquote> +<p><i>Postcondition:</i> <code>this->empty()</code> is true.</p> +</blockquote> +<pre>path& <a name="path-make_preferred">make_preferred</a>();</pre> +<blockquote>+ <p><i>Effects:</i> The contained pathname is converted to the preferred native
+ format. [<i>Note:</i> On Windows, the effect is to replace slashes with + backslashes. On POSIX, there is no effect. <i>-- end note</i>]</p> + <p><i>Returns:</i> <code>*this</code></p> +</blockquote> + +<pre>path& <a name="path-remove_filename">remove_filename</a>();</pre> +<blockquote> + <p><i>Returns: </i>As if, <code>*this = parent_path();</code></p> + <p>[<i>Note:</i> This function is needed to efficiently implement <code>+ directory_iterator</code>. It is exposed to allow additional uses. The actual + implementation may be much more efficient than <code>*this = parent_path()</code> <i>-- end
+ note</i>]</p> +</blockquote>+<pre>path& <a name="path-replace_extension">replace_extension</a>(const path& new_extension = path());</pre>
+<blockquote> + <p><i>Postcondition: </i> <code>extension() == <i>replacement</i></code>,+ where <code><i>replacement</i></code> is <code>new_extension</code> if <code>
+ new_extension.empty() || new_extension[0] ==</code> the dot character,+ otherwise <code><i>replacement</i></code> is the dot character followed by
+ <code>new_extension</code>.</p> + <p><i>Returns:</i> <code>*this</code></p> +</blockquote>+<pre><code><span style="background-color: #FFFFFF">void <a name="path-swap">swap</a>(path& rhs);</span></code></pre>
+<blockquote>+ <p><i><span style="background-color: #FFFFFF">Effects:</span></i><span style="background-color: #FFFFFF">
+ Swaps the contents of the two paths.</span></p> + <p><i><span style="background-color: #FFFFFF">Throws: </span></i> + <span style="background-color: #FFFFFF">nothing.</span></p> + <p><i><span style="background-color: #FFFFFF">Complexity: </span></i> + <span style="background-color: #FFFFFF">constant time.</span></p> +</blockquote> ++<h3> <a name="path-native-format-observers"><code><font size="4">path</font></code>
+native format observers</a></h3> +<p>The string returned by all native format observers is in the +<a href="#native-pathname-format">native pathname format</a>.</p> +<pre>const string_type& native() const;</pre> +<blockquote> +<p><i>Returns:</i> <code>pathname</code>.</p> +<p><i>Throws:</i> nothing.</p> +</blockquote> +<pre>const value_type* c_str() const;</pre> +<blockquote> +<p><i>Returns:</i> <code>pathname.c_str()</code>.</p> +<p><i>Throws:</i> nothing.</p> +</blockquote> +<pre>template <class String> +String string(const codecvt_type& cvt=codecvt()) const;</pre> +<blockquote> + <p><i>Returns:</i> <code>pathname</code>.</p>+<p><i>Remarks:</i> If <code>string_type</code> is a different type than <code>
+String</code>, conversion is performed by <code>cvt</code>.</p> +</blockquote> +<pre>const string string(const codecvt_type& cvt=codecvt()) const; +const wstring wstring(const codecvt_type& cvt=codecvt()) const; +const u16string u16string() const; +const u32wstring u32wstring() const; </pre> +<blockquote> +<p><i>Returns:</i> <code>pathname</code>.</p> +<p><i>Remarks:</i> If <code>string_type</code> is a different type than +function's return type, conversion is performed by <code>cvt</code>.</p> +<p>If <code>string_type</code> is the same type as the+function's return type, the function is permitted to return by <code>const&</code> +rather than <code>const</code> value. [<i>Note:</i> For POSIX, this occurs for +<code>string()</code>, for Windows, <code>wstring()</code>. <i>--end note</i>]</p>
+</blockquote> ++<h3> <a name="path-generic-format-observers"><code><font size="4">path</font></code>
+generic format observers</a></h3> +<p>The string returned by all generic format observers is in the +<a href="#generic-pathname-format">generic pathname format</a>.</p>+<p>[<i>Note:</i> For POSIX, no conversion occurs, since the native format and +generic format are the same. For Windows, backslashes are converted to slashes
+<i>--end note</i>]</p> +<pre>template <class String> +String generic_string(const codecvt_type& cvt=codecvt()) const;</pre> +<blockquote> + <p><i>Returns:</i> <code>pathname</code>.</p>+<p><i>Remarks:</i> If <code>string_type</code> is a different type than <code>
+String</code>, conversion is performed by +<code>cvt</code>.</p> +</blockquote>+<pre>const string generic_string(const codecvt_type& cvt=codecvt()) const;
+const wstring generic_wstring(const codecvt_type& cvt=codecvt()) const; +const u16string generic_u16string() const; +const u32wstring generic_u32wstring() const; </pre> +<blockquote> +<p><i>Returns:</i> <code>pathname</code>.</p>+<p><i>Remarks:</i> If <code>string_type</code> is a different type than
+function's return type, conversion is performed by <code>cvt</code>.</p> +<p>If <code>string_type</code> is of the same type as the+function's return type, and the generic format is the same as the native format, +the function is permitted to return by <code>const&</code> rather than <code> +const</code> value. [<i>Note:</i> For POSIX, this occurs for <code>string()</code>. +It never occurs for Windows, because backslashes must be converted to slashes.
+<i>--end note</i>]</p> +</blockquote> + +<h3> <a name="path-decomposition"> <code><font size="4">path</font></code> +decomposition</a></h3> +<p><span style="background-color: #E0E0E0"><i>See the+<a href="#Path-decomposition-table">Path decomposition table</a> for examples
+for values returned by decomposition functions. The +<a href="tutorial.html#Using-path-decomposition">Tutorial</a> may also be +helpful.</i></span></p> +<pre>path <a name="path-root_name">root_name</a>() const;</pre> +<blockquote> +<p><i>Returns:</i> <i>root-name,</i> if <code>pathname</code> includes <i> +root-name</i>, otherwise <code>path()</code>. </p> +</blockquote> +<pre>path <a name="path-root_directory">root_directory</a>() const;</pre> +<blockquote>+<p><i>Returns:</i> <i>root-directory</i>, if <code>pathname</code> includes <i>
+root-directory</i>, otherwise <code>path()</code>.</p>+<p>If <i>root-directory</i> is composed of <i>slash name</i>, <i>slash</i> is
+excluded from the returned string.</p> +</blockquote> +<pre>path <a name="path-root_path">root_path</a>() const;</pre> +<blockquote> + <p><i>Returns:</i> <code>root_name() / root_directory()</code></p> +</blockquote> +<pre>path <a name="path-relative_path">relative_path</a>() const;</pre> +<blockquote>+<p><i>Returns:</i> A <code>path</code> composed from <code>pathname</code>, if <code>
+!empty()</code>, beginning+with the first <i>filename</i> after <i>root-path</i>. Otherwise, <code>path()</code>.</p>
+</blockquote> +<pre>path <a name="path-parent_path">parent_path</a>() const;</pre> +<blockquote>+ <p><i>Returns:</i> <code>(empty() || begin() == --end()) ? path() : <i>pp</i></code>, where
+ <code><i>pp</i></code> is constructed as if by + starting with an empty <code>path</code> and successively applying <code>+ operator/=</code> for each element in the range <code>begin()</code>, <code>
+ --end()</code>.</p> +</blockquote> +<pre>path <a name="path-filename">filename</a>() const;</pre> +<blockquote> + <p><i>Returns:</i> <code>empty() ? path() : *--end()</code></p> + <p>[<i>Example:</i></p> + <blockquote>+ <pre><code>std::cout << path("/foo/bar.txt").filename();</code> // outputs "<code>bar.txt</code>" (without the quotes)</pre>
+ </blockquote> + <p> <i>--end example</i>]</p> +</blockquote> +<pre>path <a name="path-stem">stem</a>(const path& p) const;</pre> +<blockquote>+ <p><i>Returns:</i> if <code>p.filename()</code>contains a dot but does not
+ consist solely of one or to two dots, returns + the substring of <code>p.filename()</code> starting at its beginning and + ending at the last dot (the dot is not included). Otherwise, + returns <code> + p.filename()</code>.</p> + <p>[<i>Example:</i></p> + <blockquote>+ <pre><code>std::cout << path("/foo/bar.txt").stem();</code> // outputs "<code>bar</code>" (without the quotes)</pre>
+ <pre>path p = "foo.bar.baz.tar"; +for (; !p.extension().empty(); p = p.stem()) + std::cout << p.extension() << '\n'; + // outputs: .tar + // .baz + // .bar</pre> + </blockquote> + <p> <i>--end example</i>]</p> +</blockquote>+<pre>path <a name="path-extension">extension</a>(const path& p) const;</pre>
+<blockquote>+ <p><i>Returns:</i> if <code>p.filename()</code> contains a dot but does not
+ consist solely of one or to two dots, returns + the substring of <code>p.filename()</code> starting at the rightmost dot+ and ending at the path's end. Otherwise, returns an empty <code>path</code>
+ object. </p>+ <p><i>Remarks:</i> Implementations are permitted but not required to define additional + behavior for file systems which append additional elements to extensions, such
+ as alternate data streams or partitioned dataset names.</p> + <p>[<i>Example:</i></p> + <blockquote>+ <pre><code>std::cout << path("/foo/bar.txt").extension(); //</code> outputs "<code>.txt</code>" (without the quotes)</pre>
+ </blockquote> + <p> <i>--end example</i>]</p> + <p>[<i>Note:<b> </b></i>The dot is included in the return value so that+ it is possible to distinguish between no extension and an empty extension. See
+ <a href="http://permalink.gmane.org/gmane.comp.lib.boost.devel/199744";> + http://permalink.gmane.org/gmane.comp.lib.boost.devel/199744</a> for more + extensive rationale. <i>-- end note</i>]</p> +</blockquote>+<h3> <a name="path-query"> <code><font size="4">path</font></code> query</a></h3>
+<pre>bool <a name="path-empty">empty</a>() const;</pre> +<blockquote> + <p><i>Returns:</i> <code>m_pathname.empty()</code>.</p> +</blockquote> +<pre>bool <a name="path-has_root_path">has_root_path</a>() const;</pre> +<blockquote>+ <p><i>Returns:</i> <code>!<a href="#path-root_path">root_path</a>().empty()</code></p>
+</blockquote> +<pre>bool <a name="path-has_root_name">has_root_name</a>() const;</pre> +<blockquote>+ <p><i>Returns:</i> <code>!<a href="#path-root_name">root_name</a>().empty()</code></p>
+</blockquote>+<pre>bool <a name="path-has_root_directory">has_root_directory</a>() const;</pre>
+<blockquote>+ <p><i>Returns:</i> <code>!<a href="#path-root_directory">root_directory</a>().empty()</code></p>
+</blockquote>+<pre>bool <a name="path-has_relative_path">has_relative_path</a>() const;</pre>
+<blockquote>+ <p><i>Returns:</i> <code>!<a href="#path-has_relative_path">relative_path</a>().empty()</code></p>
+</blockquote> +<pre>bool <a name="path-has_parent_path">has_parent_path</a>() const;</pre> +<blockquote>+ <p><i>Returns:</i> <code>!<a href="#path-parent_path">parent_path</a>().empty()</code></p>
+</blockquote> ***The diff for this file has been truncated for email.*** ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/tutorial.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,1128 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem Tutorial</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td width="277"> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+ <td align="middle"> + <font size="7">Filesystem Tutorial</font> + </td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </tr> +</table> +<p> + <a href="#Introduction">Introduction</a><br> + <a href="#Preliminaries">Preliminaries</a><br>+ <a href="#Reporting-size">Reporting the size of a file - (tut1.cpp)</a><br> + <a href="#Using-status-queries">Using status queries to determine file existence and type - (tut2.cpp)</a><br>
+ <a href="#Directory-iteration">Directory iteration plus catching + exceptions - (tut3.cpp)</a><br>+ <a href="#Using-path-decomposition">Using path decomposition, plus sorting results - (tut4.cpp)</a><br> + <a href="#Class-path-Constructors">Class path: Constructors, including
+ Unicode - (tut5.cpp)</a><br>+ <a href="#Class-path-formats">Class path: Generic format vs. Native format</a><br> + <a href="#Class path-iterators-etc">Class path: Iterators, observers, composition, decomposition, and query - (path_info.cpp)</a><br>
+ <a href="#Error-reporting">Error reporting</a><br> +</p> +<h2><a name="Introduction">Introduction</a></h2> + +<p>This tutorial develops a little command line program to list information+about files and directories - essentially a much simplified version of the POSIX <code>ls</code> or Windows <code>dir</code> +commands. We'll start with the simplest possible version and progress to more +complex functionality. Along the way we'll digress to cover topics you'll need
+to know about to understand Boost.Filesystem.</p> + +<p>Source code for each of the tutorial programs is available, and you+are encouraged to compile, test, and experiment with it. To conserve space, we won't
+always show boilerplate code here, but the provided source is complete and +ready to build.</p> + +<h2><a name="Preliminaries">Preliminaries</a></h2> + +<p>Install the Boost distribution if you haven't already done so. See the+<a href="http://www.boost.org/more/getting_started/index.html";>Boost Getting
+Started</a> docs.</p> ++<p>This tutorial assumes you are going to compile and test the examples using
+the provided scripts. That's highly recommended.</p> + +<blockquote> + +<p><b>If you are planning to compile and test the examples but not use the +scripts, make sure your build setup knows where to +locate or build the Boost library binaries.</b></p> + +</blockquote>+<p>Fire up your command line interpreter, and type the following commands:</p>
++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt"> + <pre>$ cd <i><b>boost-root</b></i>/libs/filesystem/example/test +$ ./setup +$ ./bld +$ ./tut1 +Usage: tut1 path</pre> + </td> + <td style="font-size: 10pt"> + <pre>>cd <i><b>boost-root</b></i>\libs\filesystem\example\test +>setup +>bld +>tut1 +Usage: tut1 path</pre> + </td> + </tr> + </table> ++<p>If the <code>tut1</code> command outputs "<code>Usage: tut1 path</code>", all +is well. A set of tutorial programs has been copied (by <code>setup</code>) to
+<i><b><code>boost-root</code></b></i><code>/libs/filesystem/example/test</code>+and then built. You are encouraged to modify and experiment with them as the +tutorial progresses. Just invoke the <code>bld</code> script again to rebuild.</p>
++<p>If something didn't work right, here are troubleshooting suggestions:</p>
+ + <ul> + <li>The <code>bjam</code> program executable isn't being found. + Check your path environmental variable if it should have been found, + otherwise see + <a href="http://www.boost.org/more/getting_started/windows.html";>Boost + Getting Started</a>.<br> + </li> + <li>Look at <code>bjam.log</code> to try to spot an indication of the + problem.</li> + </ul> ++<h2><a name="Reporting-size">Reporting the size of a file</a> - (<a href="../example/tut1.cpp">tut1.cpp</a>)</h2>
++<p>Let's get started. One of the simplest things we can do is report the size of
+a file.</p> ++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + <pre><a href="../example/tut1.cpp">tut1.cpp</a></pre> + <blockquote style="font-size: 10pt"> + <pre>#include <iostream> +#include <boost/filesystem.hpp> +using namespace boost::filesystem; + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + std::cout << "Usage: tut1 path\n"; + return 1; + }+ std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
+ return 0; +}</pre> + </blockquote> + </td> + </tr> +</table> ++<p>The Boost.Filesystem <code><a href="reference.html#file_size">file_size</a></code>
+function returns a <code>uintmax_t</code>+containing the size of the file named by the argument. The declaration looks
+like this:</p> + +<blockquote>+ <pre><span style="background-color: #FFFFFF; ">uintmax_t</span> <a name="file_size">file_size</a>(const path& p);</pre>
+</blockquote>+<p>For now, all you need to know is that class path has constructors that take +<code>const char *</code> and many other useful types. (If you can't wait to +find out more, skip ahead to the <a href="#Class-path-Constructors">class path</a> section of
+the tutorial.)</p>+<p>Please take a minute to try out <code>tut1</code> on your system, using a +file that is known to exist, such as <code>tut1.cpp</code>. Here is what the
+results look like on two different operating systems:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt" valign="top"> + <pre>$ ./tut1 tut1.cpp +tut1.cpp 569</pre> + <pre>$ ls -l tut1.cpp +-rwxrwxrwx 1 root root 569 2010-02-01 07:31 tut1.cpp</pre> + </td> + <td style="font-size: 10pt" valign="top"> + <pre>>tut1 tut1.cpp +tut1.cpp 592 +>dir tut1.cpp +... +01/30/2010 10:47 AM 592 tut1.cpp +...</pre> + </td> + </tr> + </table> ++<p>So far, so good. The reported Linux and Windows sizes are different because +the Linux tests used <code>"\n"</code> line endings, while the Windows tests
+used <code>"\r\n"</code> line endings.</p> + <p>Now try again, but give a path that doesn't exist:</p> + + <table align="center" border="1" cellpadding="5" cellspacing="0"+ style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt" valign="top"> + <pre>$ ./tut1 foo +terminate called after throwing an instance of 'boost::exception_detail:: +clone_impl<boost::exception_detail::error_info_injector<boost:: +filesystem::filesystem_error> >'+ what(): boost::filesystem::file_size: No such file or directory: "foo"
+Aborted</pre> + </td> + <td style="font-size: 10pt" valign="top"> + <pre>>tut1 foo</pre>+ <p><b><i>An exception is thrown; the exact form of the response depends on
+ Windows system options.</i></b></td> + </tr> + </table> + + <p>What happens? + There's no file named <code>foo</code> in the current directory, so an +exception is thrown.</p> + <p>Try this:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt"> + <pre>$ ./tut1 . +terminate called after throwing an instance of 'boost::exception_detail:: +clone_impl<boost::exception_detail::error_info_injector<boost:: +filesystem::filesystem_error> >'+ what(): boost::filesystem::file_size: Operation not permitted "."
+Aborted</pre> + </td> + <td style="font-size: 10pt" valign="top"> + <pre>>tut1 .</pre>+ <p><b><i>An exception is thrown; the exact form of the response depends on
+ Windows system options.</i></b></td> + </tr> + </table> ++ <p>The current directory exists, but <code>file_size()</code> works on regular
+ files, not directories, so again, an exception is thrown.</p> + + <p>We'll deal with those situations in <code>tut2.cpp</code>.</p> ++<h2><a name="Using-status-queries">Using status queries to determine file existence and type</a> - (<a href="../example/tut2.cpp">tut2.cpp</a>)</h2>
+ +<p>Boost.Filesystem includes status query functions such as <code> +<a href="reference.html#exists-path">exists</a></code>,+<code><a href="reference.html#is_directory-path">is_directory</a></code>, and <code> +<a href="reference.html#is_regular_file-path">is_regular_file</a></code>. These return
+<code>bool</code>'s, and will return <code>true</code> if the condition +described by their name is met. Otherwise they return <code>false</code>, +including when any element +of the path argument can't be found.</p> ++<p>tut2.cpp uses several of the status query functions to cope with non-existent
+files and with different kinds of files:</p> ++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + <pre><a href="../example/tut2.cpp">tut2.cpp</a></pre> + <blockquote style="font-size: 10pt"> + <pre>int main(int argc, char* argv[]) +{+ <a href="reference.html#class-path">path</a> p (argv[1]); // p reads clearer than argv[1] in the following code
++ if (<a href="reference.html#exists-path">exists</a>(p)) // does p actually exist?
+ {+ if (<a href="reference.html#is_regular_file-path">is_regular_file</a>(p)) // is p a regular file? + cout << p << " size is " << <a href="reference.html#file_size">file_size</a>(p) << '\n';
++ else if (<a href="reference.html#is_directory-path">is_directory</a>(p)) // is p a directory?
+ cout << p << "is a directory\n"; + + else+ cout << p << "exists, but is neither a regular file nor a directory\n";
+ } + else + cout << p << "does not exist\n"; + + return 0; +}</pre> + </blockquote> + </td> + </tr> +</table> + +<p>Give it a try:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt" valign="top"> + <pre>$ ./tut2 tut2.cpp +tut2 size is cpp 1037 +$ ./tut2 foo +foo does not exist +$ ./tut2 . +. is a directory</pre> + </td> + <td style="font-size: 10pt" valign="top"> + <pre>>tut2 tut2.cpp +tut2.cpp size is 1079 + +>tut2 foo +foo does not exist + +>tut2 . +. is a directory</pre> + </td> + </tr> + </table> ++<p>Although tut2 works OK in these tests, the output is less than satisfactory +for a directory. We'd typically like to see a list of the directory's contents. In <code>tut3.cpp</code>
+we will see how to iterate over directories.</p> + +<p>But first, let's try one more test:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt" valign="top"> + <pre>$ ls /home/jane/foo +ls: cannot access /home/jane/foo: Permission denied +$ ./tut2 /home/jane/foo +terminate called after throwing an instance of 'boost::exception_detail:: +clone_impl<boost::exception_detail::error_info_injector<boost:: +filesystem::filesystem_error> >' + what(): boost::filesystem::status: Permission denied: + "/home/jane/foo" +Aborted</pre> + </td> + <td style="font-size: 10pt" valign="top"> + <pre>>dir e:\ +The device is not ready. +>tut2 e:\</pre>+ <p><b><i>An exception is thrown; the exact form of the response depends on
+ Windows system options.</i></b></td> + </tr> + </table> ++<p>On the Linux system, the test was being run from an account that did not have +permission to access <code>/home/jane/foo</code>. On the Windows system, <code>
+e:</code> was a Compact Disc reader/writer that was not ready. End users+shouldn't have to interpret cryptic exceptions reports, so as we move on to <code>tut3.cpp</code>
+we will increase the robustness of the code, too.</p> + +<h2><a name="Directory-iteration">Directory iteration</a> plus catching +exceptions - (<a href="../example/tut3.cpp">tut3.cpp</a>)</h2> + +<p>Boost.Filesystem's <code><a href="reference.html#directory_iterator">+directory_iterator</a></code> class is just what we need here. It follows the +general pattern of the standard library's <code>istream_iterator</code>. Constructed from +a path, it iterates over the contents of the directory. A default constructed <code>directory_iterator</code>
+acts as the end iterator.</p> + +<p>The value type of <code>directory_iterator</code> is <code>+<a href="reference.html#directory_entry">directory_entry</a></code>. A <code> +directory_entry</code> object contains a <code>path</code> and <code><a href="reference.html#file_status">file_status</a></code>
+information. A <code> +directory_entry</code> object+can be used directly, but can also be passed to <code>path</code> arguments in function calls.</p>
+ +<p>The other need is increased robustness in the face of the many kinds of+errors that can affect file system operations. We could do that at the level of +each call to a Boost.Filesystem function (see <a href="#Error-reporting">Error
+reporting</a>), but it is easier to supply an overall try/catch block.</p> ++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + <pre><a href="../example/tut3.cpp">tut3.cpp</a></pre> + <blockquote> + <pre>int main(int argc, char* argv[]) +{+ <a href="reference.html#class-path">path</a> p (argv[1]); // p reads clearer than argv[1] in the following code
+ + try + {+ if (<a href="reference.html#exists-path">exists</a>(p)) // does p actually exist?
+ {+ if (<a href="reference.html#is_regular_file-path">is_regular_file</a>(p)) // is p a regular file? + cout << p << " size is " << <a href="reference.html#file_size">file_size</a>(p) << '\n';
++ else if (<a href="reference.html#is_directory-path">is_directory</a>(p)) // is p a directory?
+ { + cout << p << " is a directory containing:\n"; ++ copy(directory_iterator(p), directory_iterator(), // directory_iterator::value_type + ostream_iterator<directory_entry>(cout, "\n")); // is directory_entry, which is + // converted to a path by the + // path stream inserter
+ } + + else+ cout << p << " exists, but is neither a regular file nor a directory\n";
+ } + else + cout << p << " does not exist\n"; + } + + catch (const filesystem_error& ex) + { + cout << ex.what() << '\n'; + } + + return 0; +}</pre> + </blockquote> + </td> + </tr> +</table> ++<p>Give <code>tut3</code> a try, passing it a path to a directory as a command line argument. +Here is a run on a checkout of the Boost Subversion trunk, followed by a repeat
+of the test cases that caused exceptions on Linux and Windows:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt" valign="top"> + <pre>$ ./tut3 ~/boost/trunk +/home/beman/boost/trunk is a directory containing: + /home/beman/boost/trunk/tools + /home/beman/boost/trunk/boost-build.jam + /home/beman/boost/trunk/dist + /home/beman/boost/trunk/doc + /home/beman/boost/trunk/bootstrap.sh + /home/beman/boost/trunk/index.html + /home/beman/boost/trunk/bootstrap.bat + /home/beman/boost/trunk/boost.css + /home/beman/boost/trunk/INSTALL + /home/beman/boost/trunk/rst.css + /home/beman/boost/trunk/boost + /home/beman/boost/trunk/people + /home/beman/boost/trunk/wiki + /home/beman/boost/trunk/boost.png + /home/beman/boost/trunk/LICENSE_1_0.txt + /home/beman/boost/trunk/more + /home/beman/boost/trunk/Jamroot + /home/beman/boost/trunk/.svn + /home/beman/boost/trunk/libs + /home/beman/boost/trunk/index.htm + /home/beman/boost/trunk/status + /home/beman/boost/trunk/CMakeLists.txt</pre> + </td> + <td style="font-size: 10pt" valign="top"> + <pre>>tut3 c:\boost\trunk +c:\boost\trunk is a directory containing: + c:\boost\trunk\.svn + c:\boost\trunk\boost + c:\boost\trunk\boost-build.jam + c:\boost\trunk\boost.css + c:\boost\trunk\boost.png + c:\boost\trunk\bootstrap.bat + c:\boost\trunk\bootstrap.sh + c:\boost\trunk\CMakeLists.txt + c:\boost\trunk\dist + c:\boost\trunk\doc + c:\boost\trunk\index.htm + c:\boost\trunk\index.html + c:\boost\trunk\INSTALL + c:\boost\trunk\Jamroot + c:\boost\trunk\libs + c:\boost\trunk\LICENSE_1_0.txt + c:\boost\trunk\more + c:\boost\trunk\people + c:\boost\trunk\rst.css + c:\boost\trunk\status + c:\boost\trunk\tools + c:\boost\trunk\wiki + +>tut3 e:\ +boost::filesystem::status: The device is not ready: "e:\"</pre> + </td> + </tr> + </table> + +<p>Not bad, but we can make further improvements:</p> + + <ul> + <li>The listing would be much easier to read if only the filename was + displayed, rather than the full path.<br> + </li> + <li>The Linux listing isn't sorted. That's because the ordering of+ directory iteration is unspecified. Ordering depends on the underlying + operating system API and file system specifics. So we need to sort the
+ results ourselves. </li> + </ul> + +<p>Move on to <code>tut4.cpp</code> to see how those changes play out!</p> ++<h2><a name="Using-path-decomposition">Using path decomposition, plus sorting results</a> - (<a href="../example/tut4.cpp">tut4.cpp</a>)</h2>
++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + <pre><a href="../example/tut4.cpp">tut4.cpp</a></pre> + <blockquote style="font-size: 10pt"> + <pre>int main(int argc, char* argv[]) +{+ <a href="reference.html#class-path">path</a> p (argv[1]); // p reads clearer than argv[1] in the following code
+ + try + {+ if (<a href="reference.html#exists-path">exists</a>(p)) // does p actually exist?
+ {+ if (<a href="reference.html#is_regular_file-path">is_regular_file</a>(p)) // is p a regular file? + cout << p << " size is " << <a href="reference.html#file_size">file_size</a>(p) << '\n';
++ else if (<a href="reference.html#is_directory-path">is_directory</a>(p)) // is p a directory?
+ { + cout << p << " is a directory containing:\n"; + + typedef vector<path> vec; // store paths, + vec v; // so we can sort them later ++ copy(directory_iterator(p), directory_iterator(), back_inserter(v));
++ sort(v.begin(), v.end()); // sort, since directory iteration + // is not ordered on some file systems
+ + for (vec::const_iterator it (v.begin()); it != v.end(); ++it) + { + cout << " " << *it << '\n'; + } + } + + else+ cout << p << " exists, but is neither a regular file nor a directory\n";
+ } + else + cout << p << " does not exist\n"; + } + + catch (const filesystem_error& ex) + { + cout << ex.what() << '\n'; + } + + return 0; +}</pre> + </blockquote> + </td> + </tr> +</table> ++ <p>The key difference between <code>tut3.cpp</code> and <code>tut4.cpp</code> is
+ what happens in the directory iteration loop. We changed:</p> + <blockquote>+ <pre>cout << " " << *it << '\n'; // *it returns a <a href="reference.html#Class-directory_entry">directory_entry</a>,</pre>
+ </blockquote> + <p>to:</p> + <blockquote>+ <pre>path fn = it->path().filename(); // extract the filename from the path +v.push_back(fn); // push into vector for later sorting</pre>
+ </blockquote>+ <p><code><a href="reference.html#directory_entry-observers">path()</a></code>
+ is a <code>directory_entry</code> observer function. <code> + <a href="reference.html#path-filename">filename()</a></code> is one of+ several path decomposition functions. It extracts the filename portion (<code>"index.html"</code>) + from a path (<code>"/home/beman/boost/trunk/index.html"</code>). These decomposition functions are + more fully explored in the <a href="#Class path-iterators-etc">Path iterators, observers,
+ composition, decomposition and query</a> portion of this tutorial.</p>+ <p>The above was written as two lines of code for clarity. It could have
+ been written more concisely as:</p> + <blockquote>+ <pre>v.push_back(it->path().filename()); // we only care about the filename</pre>
+ </blockquote>+ <p>Here is the output from a test of <code><a href="../example/tut4.cpp">tut4.cpp</a></code>:</p>
++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt"> + <pre>$ ./tut4 ~/boost/trunk +/home/beman/boost/trunk is a directory containing: + .svn + CMakeLists.txt + INSTALL + Jamroot + LICENSE_1_0.txt + boost + boost-build.jam + boost.css + boost.png + bootstrap.bat + bootstrap.sh + doc + index.htm + index.html + libs + more + people + rst.css + status + tools + wiki</pre> + </td> + <td style="font-size: 10pt"> + <pre>C:\v3d>tut4 c:\boost\trunk +c:\boost\trunk is a directory containing: + .svn + CMakeLists.txt + INSTALL + Jamroot + LICENSE_1_0.txt + boost + boost-build.jam + boost.css + boost.png + bootstrap.bat + bootstrap.sh + doc + index.htm + index.html + libs + more + people + rst.css + status + tools + wiki</pre> + </td> + </tr> + </table> ++ <p>That completes the main portion of this tutorial. If you haven't already + worked through the <a href="#Class-path-Constructors">Class path</a> sections of this tutorial, dig into them now. + The <a href="#Error-reporting">Error reporting</a> section may also be of + interest, although it can be skipped unless you are deeply concerned about
+ error handling issues.</p> + +<hr> + +<h2> <a name="Class-path-Constructors">Class path: Constructors</a>, +including Unicode - (<a href="../example/tut5.cpp">tut5.cpp</a>)</h2> ++<p>Traditional C interfaces pass paths as <code>const char*</code> arguments. +C++ interfaces may add <code>const std::string&</code> overloads, but adding +overloads becomes untenable if wide characters, containers, and iterator ranges
+need to be supported.</p>+<p>Passing paths as <code>const path&</code> arguments is far simpler, yet far +more flexible because class <code>path</code> itself is far more flexible:</p>
+<ol>+ <li>Class <code>path</code> supports multiple character types and encodings, including Unicode, to
+ ease internationalization.</li>+ <li>Class <code>path</code> supports multiple source types, such as iterators for null terminated + sequences, iterator ranges, containers (including <code>std::basic_string</code>), + and <code><a href="reference.html#Class-directory_entry">directory_entry</a></code>'s,
+ so functions taking paths don't need to provide several overloads.</li>+ <li>Class <code>path</code> supports both native and generic pathname formats, so programs can be + portable between operating systems yet use native formats where desirable.</li> + <li>Class <code>path</code> supplies a full set of iterators, observers, composition,
+ decomposition, and query functions, making pathname manipulations easy, + convenient, reliable, and portable.</li> +</ol> +<p>Here is how (1) and (2) work. Class path constructors,+assignments, and appends have member templates for sources. For example, here
+are the constructors that take sources:</p> + +<blockquote style="font-size: 10pt"> + <pre>template <class <a href="reference.html#Source">Source</a>> + path(Source const& source);</pre> + <pre>template <class InputIterator> + path(InputIterator begin, InputIterator end);</pre> +</blockquote>+<p>Let's look at a little program that shows how comfortable class <code>path</code> is with +both narrow and wide characters in C-style strings, C++ strings, and via C++
+iterators:</p> ++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + <pre><a href="../example/tut4.cpp">tut5.cpp</a></pre> + <blockquote> + <pre>#include <boost/filesystem.hpp> +#include <string> +#include <list> +namespace fs = boost::filesystem; + +int main() +{ + // \u263A is "Unicode WHITE SMILING FACE = have a nice day!" + std::string narrow_string ("smile2"); + std::wstring wide_string (L"smile2\u263A"); + std::list<char> narrow_list; + narrow_list.push_back('s'); + narrow_list.push_back('m'); + narrow_list.push_back('i'); + narrow_list.push_back('l'); + narrow_list.push_back('e'); + narrow_list.push_back('3'); + std::list<wchar_t> wide_list; + wide_list.push_back(L's'); + wide_list.push_back(L'm'); + wide_list.push_back(L'i'); + wide_list.push_back(L'l'); + wide_list.push_back(L'e'); + wide_list.push_back(L'3'); + wide_list.push_back(L'\u263A'); + + { fs::ofstream f("smile"); } + { fs::ofstream f(L"smile\u263A"); } + { fs::ofstream f(narrow_string); } + { fs::ofstream f(wide_string); } + { fs::ofstream f(narrow_list); } + { fs::ofstream f(wide_list); } + narrow_list.pop_back(); + narrow_list.push_back('4'); + wide_list.pop_back(); + wide_list.pop_back(); + wide_list.push_back(L'4'); + wide_list.push_back(L'\u263A'); + { fs::ofstream f(fs::path(narrow_list.begin(), narrow_list.end())); } + { fs::ofstream f(fs::path(wide_list.begin(), wide_list.end())); } + + return 0; +}</pre> + </blockquote> + </td> + </tr> +</table> + +<p>Testing <code>tut5</code>:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt" valign="top"> + <pre>$ ./tut5 +$ ls smile*+smile smile☺ smile2 smile2☺ smile3 smile3☺ smile4 smile4☺</pre>
+ </td> + <td style="font-size: 10pt" valign="top"> + <pre>>tut5 +>dir /b smile* +smile +smile2 +smile2☺ +smile3 +smile3☺ +smile4 +smile4☺ +smile☺</pre> + </td> + </tr> + </table> ++<p>Note that the exact appearance of the smiling face will depend on the font, +font size, and other settings for your command line window. The above tests were +run with out-of-the-box Ubuntu 9.10 and Windows 7, US Edition. If you don't get +the above results, take a look at the <code><i>boost-root</i>/libs/filesystem/example/test</code> +directory with your system's GUI file browser, such as Linux Nautilus, Mac OS X
+Finder, or Windows Explorer. These tend to be more comfortable with +international character sets than command line interpreters.</p> ++ <p>Class <code>path</code> takes care of whatever character type or encoding + conversions are required by the particular operating system. Thus as <code> + tut5</code> demonstrates, it's no problem to pass a wide character string to a + Boost.Filesystem operational function even if the underlying operating system + uses narrow characters, and visa versa. And the same applies to user supplied
+ functions that take <code>const path&</code> arguments.</p> ++ <p>Class <code>path</code> also provides path syntax that is portable across operating systems,
+ element iterators, and observer, composition, decomposition, and query + functions to manipulate the elements of a path. The next section of this + tutorial deals with path syntax.</p> + + <hr> ++<h2><a name="Class-path-formats">Class path: Generic format vs. Native format</a></h2>
+ +<p dir="ltr">Class <code>path</code> deals with two different pathname +formats - generic format and native format. For POSIX-like +file systems, these formats are the same. But for users of Windows and +other non-POSIX file systems, the distinction is important. Even+programmers writing for POSIX-like systems need to understand the distinction if
+they want their code to be portable to non-POSIX systems.</p> ++<p dir="ltr">The <b>generic format</b> is the familiar <code>/my_directory/my_file.txt</code> format used by POSIX-like +operating systems such as the Unix variants, Linux, and Mac OS X. Windows also +recognizes the generic format, and it is the basis for the familiar Internet URL
+format. The directory +separator character is always one or more slash characters.</p> ++<p dir="ltr">The <b>native format</b> is the format as defined by the particular +operating system. For Windows, either the slash or the backslash can be used as +the directory separator character, so <code>/my_directory\my_file.txt</code>
+would work fine. Of course, if you write that in a C++ string literal, it +becomes <code>"/my_directory\\my_file.txt"</code>.</p> + +<p dir="ltr">If a drive specifier or a backslash appears+in a pathname on a Windows system, it is always treated as the native format.</p>
++<p dir="ltr">Class <code>path</code> has observer functions that allow you to +obtain the string representation of a path object in either the native format +or the generic format. See the <a href="#Class path-iterators-etc">next section</a>
+for how that plays out.</p> ++ <p>The distinction between generic format and native format is important when + communicating with native C-style API's and with users. Both tend to expect + paths in the native format and may be confused by the generic format. The generic + format is great, however, for writing portable programs that work regardless
+ of operating system.</p> ++ <p>The next section covers class <code>path</code> observers, composition,
+ decomposition, query, and iteration over the elements of a path.</p> + + <hr> ++<h2><a name="Class path-iterators-etc">Class path: Iterators, observers, composition, decomposition, and query</a>
+- (<a href="../example/path_info.cpp">path_info.cpp</a>)</h2> ++<p>The <code><a href="../example/path_info.cpp">path_info.cpp</a></code> program is handy for learning how class <code>path</code>
+iterators,+observers, composition, decomposition, and query functions work on your system. +If it hasn't already already been built on your system, please build it now. Run +the examples below on your system, and try some different path arguments as we
+go along.</p> ++<p> <code>path_info</code> produces several dozen output lines every time it's +invoked. We will only show the output lines we are interested in at each step.</p>
+ +<p>First we'll look at iteration over the elements of a path, and then use+iteration to illustrate the difference between generic and native format paths.</p>
++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt"> + <pre>$ ./path_info /foo/bar/baa.txt +... +elements: + / + foo + bar + baa.txt</pre> + </td> + <td style="font-size: 10pt"> + <pre>>path_info /foo/bar/baa.txt +... +elements: + / + foo + bar + baa.txt</pre> + </td> + </tr> + </table> ++<p>Thus on both POSIX and Windows based systems the path <code>"/foo/bar/baa.txt"</code>
+is seen as having four elements.</p> + +<p>Here is the code that produced the above listing:</p> ++<table align="center" border="1" cellpadding="3" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr> + <td style="font-size: 10pt"> + <blockquote style="font-size: 10pt"> + <pre>cout << "\nelements:\n"; + +for (path::iterator it = p.begin(); it != p.end(); ++it) + cout << " " << *it << '\n';</pre> + </blockquote> + </td> + </tr> +</table>+<p><code>path::iterator::value_type</code> is <code>path::string_type</code>,
+and iteration treats <code>path</code> as a container of filenames.</p> + +<p dir="ltr">Let's look at some of the output from a slightly different +example:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt"> + <pre>$ ./path_info /foo/bar/baa.txt + +composed path: + cout << -------------: /foo/bar/baa.txt + preferred()----------: /foo/bar/baa.txt +... +observers, native format: + native()-------------: /foo/bar/baa.txt + c_str()--------------: /foo/bar/baa.txt + string()-------------: /foo/bar/baa.txt + wstring()------------: /foo/bar/baa.txt + +observers, generic format: + generic_string()-----: /foo/bar/baa.txt + generic_wstring()----: /foo/bar/baa.txt</pre> + </td> + <td style="font-size: 10pt"> + <pre>>path_info /foo/bar\baa.txt + +composed path: + cout << -------------: /foo/bar/baa.txt + preferred()----------: \foo\bar\baa.txt +... +observers, native format: + native()-------------: /foo/bar\baa.txt + c_str()--------------: /foo/bar\baa.txt + string()-------------: /foo/bar\baa.txt + wstring()------------: /foo/bar\baa.txt + +observers, generic format: + generic_string()-----: /foo/bar/baa.txt + generic_wstring()----: /foo/bar/baa.txt</pre> + </td> + </tr> + </table> ++<p dir="ltr">Native format observers should be used when interacting with the
+operating system or with users; that's what they expect.</p> ++<p dir="ltr">Generic format observers should be used when the results need to be
+portable and uniform regardless of the operating system.</p> + +<p dir="ltr"><code>path</code> objects always hold pathnames in the native +format, but otherwise leave them unchanged from their source. The+<a href="reference.html#preferred">preferred()</a> function will convert to the +preferred form, if the native format has several forms. Thus on Windows, it will
+convert slashes to backslashes.</p> + +<p dir="ltr">Let's move on to decomposition and query functions:</p> ++ <table align="center" border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="90%">
+ <tr>+ <td align="center" width="50%" style="font-size: 10pt"><i><b>Ubuntu Linux </b></i></td> + <td align="center" style="font-size: 10pt"><i><b>Microsoft Windows</b></i></td>
+ </tr> + <tr> + <td width="50%" style="font-size: 10pt"> + <pre>$ ./path_info /foo/bar/baa.txt +... +decomposition: + root_name()----------: + root_directory()-----: / + root_path()----------: / + relative_path()------: foo/bar/baa.txt + parent_path()--------: /foo/bar + filename()-----------: baa.txt + stem()---------------: baa + extension()----------: .txt + +query: + empty()--------------: false+ <span style="background-color: #FFFF00">is_absolute</span><span style="background-color: #FFFF00">()--------: true</span>
+ has_root_name()------: false + has_root_directory()-: true + has_root_path()------: true + has_relative_path()--: true + has_parent_path()----: true + has_filename()-------: true + has_stem()-----------: true + has_extension()------: true</pre> + </td> + <td style="font-size: 10pt"> + <pre>>path_info /foo/bar/baa.txt +... +decomposition: + root_name()----------: + root_directory()-----: / + root_path()----------: / + relative_path()------: foo/bar/baa.txt + parent_path()--------: /foo/bar ***The diff for this file has been truncated for email.*** ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/v3.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,151 @@ +<html> + +<head> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem V3 Intro</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+ +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td width="277"> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" width="300" height="86" border="0"></a></td>
+ <td align="middle"> + <font size="7">Filesystem + Version 3<br> + Introduction</font></td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </tr> +</table> + +<h1>Boost Filesystem Version 3</h1> + +<p>Version 3 is a major revision of the Boost Filesystem library. Important +changes include:</p> + +<ul> + <li>A single class <code>path</code> handles all aspects of+ internationalization, replacing the previous template and its <code>path</code>
+ and <code>wpath</code> instantiations. Character types <code>char</code>,+ <code>wchar_t</code>, <code>char16_t</code>, and <code>char32_t</code> are
+ supported. This is a major simplification of the path abstraction, + particularly for functions that take path arguments.<br> + </li> + <li>New <code>class path</code> members include:<br> + <ul>+ <li><code><a href="reference.html#path-has_stem">has_stem</a>()</code></li> + <li><code><a href="reference.html#path-has_extension">has_extension</a>()</code></li> + <li><code><a href="reference.html#path-is_absolute">is_absolute</a>()</code>. This renames <code>is_complete()</code>, which
+ is now deprecated.</li>+ <li><code><a href="reference.html#path-is_relative">is_relative</a>()</code></li> + <li><code><a href="reference.html#path-make_preferred">make_preferred</a>()<br>
+ </code></li> +</ul> + + </li> + <li>New or improved operations functions include:<br> + <ul>+ <li><code><a href="reference.html#absolute">absolute</a>()</code>. This replaces the operations function <code> + complete()</code>, which is now deprecated. Semantics are now provided for a + Windows corner case where the <code>base</code> argument was not an absolute
+ path. Previously this resulted in an exception being thrown.</li>+ <li><code><a href="reference.html#create_symlink">create_symlink</a>()</code> now supported on both POSIX and Windows.</li> + <li><code><a href="reference.html#read_symlink">read_symlink</a>()</code> function added. Supported on both POSIX and
+ Windows. Used to read the contents of a symlink itself.</li>+ <li><code><a href="reference.html#resize_file">resize_file</a>()</code> function added. Supported on both POSIX and
+ Windows. Used to shrink or grow a regular file.</li>+ <li><code><a href="reference.html#unique_path">unique_path</a>()</code> function added. Supported on both POSIX and
+ Windows. Used to generate a secure temporary pathname.<br> + </li> + </ul> + </li>+ <li>Support for error reporting via <code>error_code</code> is now uniform
+ throughout the operations functions.<br> + </li>+ <li>Documentation has been reworked, including re-writes of major portions.<br>
+ </li> + <li>A new <a href="tutorial.html">Tutorial</a> provides a hopefully much+ gentler and more complete introduction for new users. Current users might want + to review the <a href="tutorial.html">three sections related to class path</a>.</li>
+</ul> + +<h2>Deprecated names and other features</h2> ++<p>See the <a href="deprecated.html">Deprecated Features page</a> for transition +aids that allow much existing code to compile without change using Version 3.</p>
+ +<h2>Breaking changes</h2> ++<p>To ease the transition, Versions 2 and 3 will both be included in the next +several Boost releases. Version 2 will be the default version for one release
+cycle, and then Version 3 will become the default version.</p> +<h3>Class <code>path</code></h3> +<ul> + <li>Class template <code>basic_path</code> and its specializations are + replaced by a single <code>class path</code>. Thus any code, such as+ overloaded functions, that depends on <code>path</code> and <code>wpath</code>
+ being two distinct types will fail to compile and must be restructured. + Restructuring may be as simple as removing one of the overloads, but also + might require more complex redesign.<br> + </li>+ <li>Certain functions now return <code>path</code> objects rather than <code>
+ string or wstring</code> objects:<ul> + <li><code>root_name()</code></li> + <li><code>root_directory()</code></li> + <li><code>filename()</code></li> + <li><code>stem()</code></li> + <li><code>extension()</code></li> + </ul>+ <p>Not all uses will fail; if the function is being called in a context that + accepts a <code>path</code>, all is well. If the result is being used in a + context requiring a <code>std::string</code> or <code>std::wstring</code>, + then <code>.string()</code> or <code>.wstring()</code> respectively must be
+ appended to the function call.<br> + </li> + <li> <code>path::iterator::value_type</code> and <code>+ path::const_iterator::value_type</code> is <code>path</code> rather than <code>
+ basic_string</code>.</li> +</ul> +<h3>Compiler support</h3> +<ul>+ <li>Compilers and standard libraries that do not fully support wide characters
+ and wide character strings (<code>std::wstring</code>) are no longer + supported.<br> + </li>+ <li>Cygwin versions prior to 1.7 are no longer supported because they lack + wide string support. Cygwin now compiles only for the Windows API and path
+ syntax.<br> + </li>+ <li>MinGW versions not supporting wide strings are no longer supported.<br>
+ </li> + <li>Microsoft VC++ 7.1 and earlier are no longer supported.</li> +</ul> + +<hr> +<p>© Copyright Beman Dawes, 2009</p> +<p>Distributed under the Boost Software License, Version 1.0. See+<a href="http://www.boost.org/LICENSE_1_0.txt";>www.boost.org/LICENSE_1_0.txt</a></p>
+<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B %Y" startspan -->02 July 2010<!--webbot bot="Timestamp" endspan i-checksum="18762" --></p>
+ +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/doc/v3_design.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,192 @@ +<html> + +<head> +<meta http-equiv="Content-Language" content="en-us"> +<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> +<meta name="ProgId" content="FrontPage.Editor.Document"> +<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> +<title>Filesystem V3 Design</title>+<link rel="stylesheet" type="text/css" href="../../../../doc/src/minimal.css">
+</head> + +<body> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
+ <tr> + <td> +<a href="../../../../index.htm">+<img src="../../../../boost.png" alt="boost.png (6897 bytes)" align="middle" border="0" width="300" height="86"></a></td>
+ <td align="middle"> + <font size="7">Filesystem Version 3<br> + Design</font></td> + </tr> +</table> ++<table border="0" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" bgcolor="#D7EEFF" width="100%">
+ <tr> + <td><a href="../../../../index.htm">Boost Home</a> + <a href="index.htm">Library Home</a> + <a href="reference.html">Reference</a> + <a href="tutorial.html">Tutorial</a> + <a href="faq.htm">FAQ</a> + <a href="portability_guide.htm">Portability</a> + <a href="v3.html">V3 Intro</a> + <a href="v3_design.html">V3 Design</a> + <a href="deprecated.html">Deprecated</a> + </td> + </tr> +</table> ++<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" align="right">
+ <tr> + <td width="100%" bgcolor="#D7EEFF" align="center"> + <i><b>Contents</b></i></td> + </tr> + <tr> + <td width="100%" bgcolor="#E8F5FF"> + <a href="#Introduction">Introduction</a><br> + <a href="#Problem">Problem</a><br> + <a href="#Solution">Solution</a><br> + <a href="#Details">Details</a><br> + <a href="#Other-changes">Other changes</a><br> + <a href="#Acknowledgements">Acknowledgements</a></td> + </tr> + </table> + +<p><b>Caution:</b> This page documents thinking early in the V3 development +process, and is intended to serve historical purposes. It is not updated to +reflect the current state of the library.</p> + +<h2><a name="Introduction">Introduction</a></h2> ++<p>During the review of Boost.Filesystem.V2 (Internationalization), Peter Dimov +suggested that the<code> basic_path</code> class template was unwieldy, and that a single +path type that accommodated multiple character types and encodings would be more
+flexible. Although I wasn't willing to stop development at that time to+explore how this idea might be implemented, or to break from the pattern for +Internationalization used the C++ standard library, I've often thought about +Peter's suggestion. With the advent of C++0x <code>char16_t</code> and <code>char32_t</code> character +types, the <code>basic_path</code> class template approach becomes even more unwieldy, so it
+is time to revisit the problem in light of Peter's suggestion.</p> + +<h2><b><a name="Problem">Problem</a></b></h2> ++<p>With Filesystem.V2, a path argument to a user defined function that is to
+accommodate multiple character types and encodings must be written as a +template. Do-the-right-thing overloads or template metaprogramming must be+employed to allow arguments to be written as string literals. Here's what it
+looks like:</p> + +<blockquote> + <pre>template<class Path> +void foo( const Path & p );</pre> + <pre>inline void foo( const path & p ) +{ + return foo<path>( p ); +} +inline void foo( const wpath & p ) +{ + return foo<wpath>( p ); +}</pre> +</blockquote>+<p>That's really ugly for such a simple need, and there would be a combinatorial +explosion if the function took multiple Path arguments and each could be either +narrow or wide. It gets even worse if the C++0x <code>char16_t</code> and <code>
+char32_t</code> types are to be supported.</p> + +<h2><a name="Solution">Solution</a></h2> + +<p>Overview:</p> + +<ul> + <li>A single, non-template, <code>class path</code>.</li> + <li>Each member function is a template accommodating the various + applicable character types, including user-defined character types.</li>+ <li>Hold the path internally in a string of the type used by the operating + system API; <code>std::string</code> for POSIX, <code>std::wstring</code> for Windows.</li>
+</ul> + +<p>The signatures presented in <a href="#Problem">Problem</a> collapse to +simply:</p> +<blockquote> + <pre>void foo( const path & p );</pre> +</blockquote> ++<p>That's a signification reduction in code complexity. Specification becomes +simpler, too. I believe it will be far easier to teach, and result in much more
+flexible user code.</p> + +<p>Other benefits:</p> +<ul> + <li>All the polymorphism still occurs at compile time.</li>+ <li>Efficiency is increased, in that conversions of the encoding, if required, + only occur once at the time of creation, not each time the path is used.</li>
+ <li>The size of the implementation code drops approximately in half and + becomes much more readable.</li> +</ul> + <p>Possible problems:</p> +<ul>+ <li>The combination of member function templates and implicit constructors can + result in unclear error messages when the user makes simple commonplace coding + errors. This should be much less of a problem with C++ concepts, but in the + meantime work continues to restrict over aggressive templates via enable_if/disable_if.</li>
+</ul> + <h2><a name="Details">Details</a></h2> ++<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%">
+ <tr> + <td width="33%" colspan="3"> + <p align="center"><b><i>Encoding </i></b><i><b>Conversions</b></i></td> + </tr> + <tr> + <td width="33%"> + <p align="center"><i><b>Host system</b></i></td> + <td width="33%"> + <p align="center"><i><b>char string path arguments</b></i></td> + <td width="34%"> + <p align="center"><i><b>wide string path arguments</b></i></td> + </tr> + <tr>+ <td width="33%">Systems with <code>char</code> as the native API path character type (i.e.
+ POSIX-like systems)</td> + <td width="33%">No conversion.</td>+ <td width="34%">Conversion occurs, performed by the current path locale's
+ <code>codecvt</code> facet.</td> + </tr> + <tr>+ <td width="33%">Systems with <code>wchar_t</code> as the native API path character type
+ (i.e. Windows-like systems).</td>+ <td width="33%">Conversion occurs, performed by the current path locale's
+ <code>codecvt</code> facet.</td> + <td width="34%">No conversion.</td> + </tr> +</table> ++<p>When a class path function argument type matches the the operating system's +API argument type for paths, no conversion is performed rather than conversion
+to a specified encoding such as one of the Unicode encodings. This avoids +unintended consequences, etc.</p> + +<h2><a name="Other-changes">Other changes</a></h2> ++<p><b>Uniform hybrid error handling: </b>The hybrid error handling idiom has
+been consistently applied to all applicable functions.</p> + +<h2><a name="Acknowledgements">Acknowledgements</a></h2> ++<p>Peter Dimov suggested the idea of a single path class that could cope with +multiple character types and encodings. Walter Landry contributed both the design and implementation of the copy_any,
+copy_directory, copy_symlink, and read_symlink functions.</p> + +<hr> +<p>Revised+<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->18 February, 2010<!--webbot bot="Timestamp" endspan i-checksum="40538" --></p>
+ +<p>© Copyright Beman Dawes, 2008</p> +<p> Use, modification, and distribution are subject to the Boost Software +License, Version 1.0. See <a href="http://www.boost.org/LICENSE_1_0.txt";> +www.boost.org/LICENSE_1_0.txt</a></p> + +</body> + +</html> ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/Jamfile.v2 Sun Aug 22 23:21:17 2010 @@ -0,0 +1,24 @@ +# Boost Filesystem Library Example Jamfile + +# (C) Copyright Vladimir Prus 2003 + +# Distributed under the Boost Software License, Version 1.0. +# See www.boost.org/LICENSE_1_0.txt + +# Library home page: http://www.boost.org/libs/filesystem + +project + : requirements + <library>/boost/filesystem//boost_filesystem + <library>/boost/system//boost_system + <toolset>msvc:<asynch-exceptions>on + <link>static + ; + +exe tut0 : tut0.cpp ; +exe tut1 : tut1.cpp ; +exe tut2 : tut2.cpp ; +exe tut3 : tut3.cpp ; +exe tut4 : tut4.cpp ; +exe tut5 : tut5.cpp ; +exe path_info : path_info.cpp ; ======================================= --- /dev/null+++ /trunk/libs/filesystem/v3/example/error_demo.cpp Sun Aug 22 23:21:17 2010
@@ -0,0 +1,185 @@+// error_demo.cpp --------------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +//--------------------------------------------------------------------------------------//+// // +// The purpose of this program is to demonstrate how error reporting works. // +// //
+//--------------------------------------------------------------------------------------// + +#include <boost/filesystem.hpp> +#include <boost/system/system_error.hpp> +#include <iostream> + +using std::cout; +using boost::filesystem::path; +using boost::filesystem::filesystem_error; +using boost::system::error_code; +using boost::system::system_error; +namespace fs = boost::filesystem; + +namespace +{ + void report_system_error(const system_error& ex) + { + cout << " threw system_error:\n" + << " ex.code().value() is " << ex.code().value() << '\n'+ << " ex.code().category().name() is " << ex.code().category().name() << '\n'
+ << " ex.what() is " << ex.what() << '\n' + ; + } + + void report_filesystem_error(const system_error& ex) + { + cout << " threw filesystem_error exception:\n" + << " ex.code().value() is " << ex.code().value() << '\n'+ << " ex.code().category().name() is " << ex.code().category().name() << '\n'
+ << " ex.what() is " << ex.what() << '\n' + ; + } + + void report_status(fs::file_status s) + { + cout << " file_status::type() is "; + switch (s.type()) + { + case fs::status_error: + cout << "status_error\n"; break; + case fs::file_not_found: + cout << "file_not_found\n"; break; + case fs::regular_file: + cout << "regular_file\n"; break; + case fs::directory_file: + cout << "directory_file\n"; break; + case fs::symlink_file: + cout << "symlink_file\n"; break; + case fs::block_file: + cout << "block_file\n"; break; + case fs::character_file: + cout << "character_file\n"; break; + case fs::fifo_file: + cout << "fifo_file\n"; break; + case fs::socket_file: + cout << "socket_file\n"; break; + case fs::type_unknown: + cout << "type_unknown\n"; break; + default: + cout << "not a valid enumeration constant\n"; + } + } + + void report_error_code(const error_code& ec) + { + cout << " ec:\n" + << " value() is " << ec.value() << '\n' + << " category().name() is " << ec.category().name() << '\n' + << " message() is " << ec.message() << '\n' + ; + } + + bool threw_exception; + +} + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + cout << "Usage: error_demo path\n"; + return 1; + } + + error_code ec; + + //// construct path - no error_code + + //try { path p1(argv[1]); } + //catch (const system_error& ex) + //{ + // cout << "construct path without error_code"; + // report_system_error(ex); + //} + + //// construct path - with error_code + + path p (argv[1]); + + fs::file_status s; + bool b (false); + fs::directory_iterator di; + + // get status - no error_code + + cout << "\nstatus(\"" << p.string() << "\");\n"; + threw_exception = false; + + try { s = fs::status(p); } + catch (const system_error& ex) + { + report_filesystem_error(ex); + threw_exception = true; + } + if (!threw_exception) + cout << " Did not throw exception\n"; + report_status(s); + + // get status - with error_code + + cout << "\nstatus(\"" << p.string() << "\", ec);\n"; + s = fs::status(p, ec); + report_status(s); + report_error_code(ec); + + // query existence - no error_code + + cout << "\nexists(\"" << p.string() << "\");\n"; + threw_exception = false; + + try { b = fs::exists(p); } + catch (const system_error& ex) + { + report_filesystem_error(ex); + threw_exception = true; + } + if (!threw_exception) + { + cout << " Did not throw exception\n" + << " Returns: " << (b ? "true" : "false") << '\n'; + } + + // query existence - with error_code + + // directory_iterator - no error_code + + cout << "\ndirectory_iterator(\"" << p.string() << "\");\n"; + threw_exception = false; + + try { di = fs::directory_iterator(p); } + catch (const system_error& ex) + { + report_filesystem_error(ex); + threw_exception = true; + } + if (!threw_exception) + { + cout << " Did not throw exception\n" + << (di == fs::directory_iterator() ? " Equal" : " Not equal") + << " to the end iterator\n"; + } + + // directory_iterator - with error_code + + cout << "\ndirectory_iterator(\"" << p.string() << "\", ec);\n"; + di = fs::directory_iterator(p, ec); + cout << (di == fs::directory_iterator() ? " Equal" : " Not equal") + << " to the end iterator\n"; + report_error_code(ec); + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/file_size.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,44 @@+// file_size program -------------------------------------------------------//
+ +// Copyright Beman Dawes, 2004 + +// Use, modification, and distribution is 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) + +// See http://www.boost.org/libs/filesystem for documentation. + +#include <boost/filesystem/operations.hpp> +#include <iostream> + +namespace fs = boost::filesystem; + +int main( int argc, char* argv[] ) +{ + + if ( argc != 2 ) + { + std::cout << "Usage: file_size path\n"; + return 1; + } + + std::cout << "sizeof(intmax_t) is " << sizeof(boost::intmax_t) << '\n'; + + fs::path p( argv[1] ); + + if ( !fs::exists( p ) ) + { + std::cout << "not found: " << argv[1] << std::endl; + return 1; + } + + if ( !fs::is_regular( p ) ) + { + std::cout << "not a regular file: " << argv[1] << std::endl; + return 1; + } + + std::cout << "size of " << argv[1] << " is " << fs::file_size( p ) + << std::endl; + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/mbcopy.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,90 @@+// Boost.Filesystem mbcopy.cpp ---------------------------------------------//
+ +// Copyright Beman Dawes 2005 + +// Use, modification, and distribution is 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) ++// Copy the files in a directory, using mbpath to represent the new file names
+// See http://../doc/path.htm#mbpath for more information + +// See deprecated_test for tests of deprecated features +#define BOOST_FILESYSTEM_NO_DEPRECATED + +#include <boost/filesystem/config.hpp> +# ifdef BOOST_FILESYSTEM_NARROW_ONLY+# error This compiler or standard library does not support wide-character strings or paths
+# endif + +#include "mbpath.hpp" +#include <iostream> +#include <boost/filesystem/operations.hpp> +#include <boost/filesystem/fstream.hpp> +#include "../src/utf8_codecvt_facet.hpp" + +namespace fs = boost::filesystem; + +namespace +{ + // we can't use boost::filesystem::copy_file() because the argument types + // differ, so provide a not-very-smart replacement. + + void copy_file( const fs::wpath & from, const user::mbpath & to ) + {+ fs::ifstream from_file( from, std::ios_base::in | std::ios_base::binary );
+ if ( !from_file ) { std::cout << "input open failed\n"; return; } + + fs::ofstream to_file( to, std::ios_base::out | std::ios_base::binary ); + if ( !to_file ) { std::cout << "output open failed\n"; return; } + + char c; + while ( from_file.get(c) ) + { + to_file.put(c); + if ( to_file.fail() ) { std::cout << "write error\n"; return; } + } + + if ( !from_file.eof() ) { std::cout << "read error\n"; } + } +} + +int main( int argc, char * argv[] ) +{ + if ( argc != 2 ) + {+ std::cout << "Copy files in the current directory to a target directory\n"
+ << "Usage: mbcopy <target-dir>\n"; + return 1; + } + + // For encoding, use Boost UTF-8 codecvt + std::locale global_loc = std::locale(); + std::locale loc( global_loc, new fs::detail::utf8_codecvt_facet ); + user::mbpath_traits::imbue( loc ); + + std::string target_string( argv[1] );+ user::mbpath target_dir( user::mbpath_traits::to_internal( target_string ) );
+ + if ( !fs::is_directory( target_dir ) ) + { + std::cout << "Error: " << argv[1] << " is not a directory\n"; + return 1; + } + + for ( fs::wdirectory_iterator it( L"." ); + it != fs::wdirectory_iterator(); ++it ) + { + if ( fs::is_regular_file(it->status()) ) + { + copy_file( *it, target_dir / it->path().filename() ); + } + } + + return 0; +} + + + + + ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/mbpath.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,80 @@+// Boost.Filesystem mbpath.cpp ---------------------------------------------//
+ +// (c) Copyright Beman Dawes 2005 + +// Use, modification, and distribution is 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) + +// See Boost.Filesystem home page at http://www.boost.org/libs/filesystem + +#include <boost/filesystem/config.hpp> +# ifdef BOOST_FILESYSTEM_NARROW_ONLY+# error This compiler or standard library does not support wide-character strings or paths
+# endif + +#include "mbpath.hpp" +#include <boost/system/system_error.hpp> +#include <boost/scoped_array.hpp> + +namespace fs = boost::filesystem; + +namespace +{ + // ISO C calls this "the locale-specific native environment": + std::locale loc(""); + + const std::codecvt<wchar_t, char, std::mbstate_t> * + cvt( &std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> > + ( loc ) ); +} + +namespace user +{ + mbpath_traits::external_string_type + mbpath_traits::to_external( const mbpath & ph, + const internal_string_type & src ) + { + std::size_t work_size( cvt->max_length() * (src.size()+1) ); + boost::scoped_array<char> work( new char[ work_size ] ); + std::mbstate_t state; + const internal_string_type::value_type * from_next; + external_string_type::value_type * to_next; + if ( cvt->out( + state, src.c_str(), src.c_str()+src.size(), from_next, work.get(), + work.get()+work_size, to_next ) != std::codecvt_base::ok ) + boost::throw_exception<fs::basic_filesystem_error<mbpath> >( + fs::basic_filesystem_error<mbpath>( + "user::mbpath::to_external conversion error",+ ph, boost::system::error_code( EINVAL, boost::system::errno_ecat ) ) );
+ *to_next = '\0'; + return external_string_type( work.get() ); + } + + mbpath_traits::internal_string_type + mbpath_traits::to_internal( const external_string_type & src ) + { + std::size_t work_size( src.size()+1 ); + boost::scoped_array<wchar_t> work( new wchar_t[ work_size ] ); + std::mbstate_t state; + const external_string_type::value_type * from_next; + internal_string_type::value_type * to_next; + if ( cvt->in( + state, src.c_str(), src.c_str()+src.size(), from_next, work.get(), + work.get()+work_size, to_next ) != std::codecvt_base::ok ) + boost::throw_exception<fs::basic_filesystem_error<mbpath> >( + fs::basic_filesystem_error<mbpath>( + "user::mbpath::to_internal conversion error",+ boost::system::error_code( EINVAL, boost::system::errno_ecat ) ) );
+ *to_next = L'\0'; + return internal_string_type( work.get() ); + } + + void mbpath_traits::imbue( const std::locale & new_loc ) + { + loc = new_loc; + cvt = &std::use_facet + <std::codecvt<wchar_t, char, std::mbstate_t> >( loc ); + } + +} // namespace user ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/mbpath.hpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,44 @@+// Boost.Filesystem mbpath.hpp ---------------------------------------------//
+ +// Copyright Beman Dawes 2005 + +// Use, modification, and distribution is 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) + +// Encodes wide character paths as MBCS +// See http://../doc/path.htm#mbpath for more information + +#include <boost/filesystem/path.hpp> +#include <cwchar> // for std::mbstate_t +#include <string> +#include <locale> + +namespace user +{ + struct mbpath_traits; ++ typedef boost::filesystem::basic_path<std::wstring, mbpath_traits> mbpath;
+ + struct mbpath_traits + { + typedef std::wstring internal_string_type; + typedef std::string external_string_type; + + static external_string_type to_external( const mbpath & ph, + const internal_string_type & src ); ++ static internal_string_type to_internal( const external_string_type & src );
+ + static void imbue( const std::locale & loc ); + }; +} // namespace user + +namespace boost +{ + namespace filesystem + { + template<> struct is_basic_path<user::mbpath> + { static const bool value = true; }; + } +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/path_info.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,83 @@+// path_info.cpp ---------------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <iostream> +#include <boost/filesystem.hpp> +using namespace std; +using namespace boost::filesystem; + +const char * say_what(bool b) { return b ? "true" : "false"; } + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + cout << "Usage: path_info path-portion...\n" + "Example: path_info foo/bar baz\n" +# ifdef BOOST_POSIX_API+ " would report info about the composed path foo/bar/baz\n";
+# else // BOOST_WINDOWS_API+ " would report info about the composed path foo/bar\\baz\n";
+# endif + return 1; + } + + path p; // compose a path from the command line arguments + + for (; argc > 1; --argc, ++argv) + p /= argv[1]; + + cout << "\ncomposed path:\n"; + cout << " cout << -------------: " << p << "\n";+ cout << " make_preferred()----------: " << path(p).make_preferred() << "\n";
+ + cout << "\nelements:\n"; + + for (path::iterator it(p.begin()), it_end(p.end()); it != it_end; ++it) + cout << " " << *it << '\n'; + + cout << "\nobservers, native format:" << endl; +# ifdef BOOST_POSIX_API + cout << " native()-------------: " << p.native() << endl; + cout << " c_str()--------------: " << p.c_str() << endl; +# else // BOOST_WINDOWS_API + wcout << L" native()-------------: " << p.native() << endl; + wcout << L" c_str()--------------: " << p.c_str() << endl; +# endif + cout << " string()-------------: " << p.string() << endl; + wcout << L" wstring()------------: " << p.wstring() << endl; + + cout << "\nobservers, generic format:\n"; + cout << " generic_string()-----: " << p.generic_string() << endl; + wcout << L" generic_wstring()----: " << p.generic_wstring() << endl; + + cout << "\ndecomposition:\n"; + cout << " root_name()----------: " << p.root_name() << '\n'; + cout << " root_directory()-----: " << p.root_directory() << '\n'; + cout << " root_path()----------: " << p.root_path() << '\n'; + cout << " relative_path()------: " << p.relative_path() << '\n'; + cout << " parent_path()--------: " << p.parent_path() << '\n'; + cout << " filename()-----------: " << p.filename() << '\n'; + cout << " stem()---------------: " << p.stem() << '\n'; + cout << " extension()----------: " << p.extension() << '\n'; + + cout << "\nquery:\n"; + cout << " empty()--------------: " << say_what(p.empty()) << '\n';+ cout << " is_absolute()--------: " << say_what(p.is_absolute()) << '\n'; + cout << " has_root_name()------: " << say_what(p.has_root_name()) << '\n'; + cout << " has_root_directory()-: " << say_what(p.has_root_directory()) << '\n'; + cout << " has_root_path()------: " << say_what(p.has_root_path()) << '\n'; + cout << " has_relative_path()--: " << say_what(p.has_relative_path()) << '\n'; + cout << " has_parent_path()----: " << say_what(p.has_parent_path()) << '\n'; + cout << " has_filename()-------: " << say_what(p.has_filename()) << '\n';
+ cout << " has_stem()-----------: " << say_what(p.has_stem()) << '\n';+ cout << " has_extension()------: " << say_what(p.has_extension()) << '\n';
+ + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/simple_ls.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,91 @@+// simple_ls program -------------------------------------------------------//
+ +// Copyright Jeff Garland and Beman Dawes, 2002 + +// Use, modification, and distribution is 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) + +// See http://www.boost.org/libs/filesystem for documentation. + +#define BOOST_FILESYSTEM_VERSION 3 + +// As an example program, we don't want to use any deprecated features +#ifndef BOOST_FILESYSTEM_NO_DEPRECATED +# define BOOST_FILESYSTEM_NO_DEPRECATED +#endif +#ifndef BOOST_SYSTEM_NO_DEPRECATED +# define BOOST_SYSTEM_NO_DEPRECATED +#endif + +#include "boost/filesystem/operations.hpp" +#include "boost/filesystem/path.hpp" +#include "boost/progress.hpp" +#include <iostream> + +namespace fs = boost::filesystem; + +int main(int argc, char* argv[]) +{ + fs::path p(fs::current_path()); + + if (argc > 1) + p = fs::system_complete(argv[1]); + else + std::cout << "\nusage: simple_ls [path]" << std::endl; + + unsigned long file_count = 0; + unsigned long dir_count = 0; + unsigned long other_count = 0; + unsigned long err_count = 0; + + if (!fs::exists(p)) + { + std::cout << "\nNot found: " << p << std::endl; + return 1; + } + + if (fs::is_directory(p)) + { + std::cout << "\nIn directory: " << p << "\n\n"; + fs::directory_iterator end_iter; + for (fs::directory_iterator dir_itr(p); + dir_itr != end_iter; + ++dir_itr) + { + try + { + if (fs::is_directory(dir_itr->status())) + { + ++dir_count; + std::cout << dir_itr->path().filename() << " [directory]\n"; + } + else if (fs::is_regular_file(dir_itr->status())) + { + ++file_count; + std::cout << dir_itr->path().filename() << "\n"; + } + else + { + ++other_count; + std::cout << dir_itr->path().filename() << " [other]\n"; + } + + } + catch (const std::exception & ex) + { + ++err_count;+ std::cout << dir_itr->path().filename() << " " << ex.what() << std::endl;
+ } + } + std::cout << "\n" << file_count << " files\n" + << dir_count << " directories\n" + << other_count << " others\n" + << err_count << " errors\n"; + } + else // must be a file + { + std::cout << "\nFound: " << p << "\n"; + } + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tchar.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,39 @@+// Example use of Microsoft TCHAR ----------------------------------------------------//
+ +// Copyright Beman Dawes 2008 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +#include <boost/filesystem/path.hpp> +#include <boost/filesystem/operations.hpp> +#include <string> +#include <cassert> +#include <windows.h> +#include <winnt.h> + +namespace fs = boost::filesystem; + +typedef std::basic_string<TCHAR> tstring; + +void func( const fs::path & p ) +{ + assert( fs::exists( p ) ); +} + +int main() +{ + // get a path that is known to exist + fs::path cp = fs::current_path(); + + // demo: get tstring from the path + tstring cp_as_tstring = cp.string<tstring>(); + + // demo: pass tstring to filesystem function taking path + assert( fs::exists( cp_as_tstring ) ); + + // demo: pass tstring to user function taking path + func( cp_as_tstring ); + + return 0; +} ======================================= --- /dev/null+++ /trunk/libs/filesystem/v3/example/test/Jamfile.v2 Sun Aug 22 23:21:17 2010
@@ -0,0 +1,31 @@ +# Boost Filesystem Library Tutorial Jamfile + +# (C) Copyright Beman Dawes 2010 +# (C) Copyright Vladimir Prus 2003 + +# Distributed under the Boost Software License, Version 1.0. +# See www.boost.org/LICENSE_1_0.txt + +# Library home page: http://www.boost.org/libs/filesystem + +project + : requirements + <library>/boost/filesystem//boost_filesystem + <library>/boost/system//boost_system + <toolset>msvc:<asynch-exceptions>on + ; + +exe tut1 : tut1.cpp ; +exe tut2 : tut2.cpp ; +exe tut3 : tut3.cpp ; +exe tut4 : tut4.cpp ; +exe tut5 : tut5.cpp ; +exe path_info : path_info.cpp ; + +install tut1-copy : tut1 : <location>. ; +install tut2-copy : tut2 : <location>. ; +install tut3-copy : tut3 : <location>. ; +install tut4-copy : tut4 : <location>. ; +install tut5-copy : tut5 : <location>. ; +install path_info-copy : path_info : <location>. ; + ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/test/bld.bat Sun Aug 22 23:21:17 2010 @@ -0,0 +1,7 @@ +@echo off +rem Copyright Beman Dawes, 2010 +rem Distributed under the Boost Software License, Version 1.0. +rem See www.boost.org/LICENSE_1_0.txt + +bjam %* >bjam.log +find "error" <bjam.log ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/test/bld.sh Sun Aug 22 23:21:17 2010 @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Copyright Beman Dawes, 2010 +# Distributed under the Boost Software License, Version 1.0. +# See www.boost.org/LICENSE_1_0.txt + +bjam $* >bjam.log +grep "error" <bjam.log ======================================= --- /dev/null+++ /trunk/libs/filesystem/v3/example/test/setup.bat Sun Aug 22 23:21:17 2010
@@ -0,0 +1,13 @@ +@echo off +rem Copyright Beman Dawes, 2010 +rem Distributed under the Boost Software License, Version 1.0. +rem See www.boost.org/LICENSE_1_0.txt + +copy /y ..\tut1.cpp >nul +copy /y ..\tut2.cpp >nul +copy /y ..\tut3.cpp >nul +copy /y ..\tut4.cpp >nul +copy /y ..\tut5.cpp >nul +copy /y ..\path_info.cpp >nul +del *.exe 2>nul +del *.pdb 2>nul ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/test/setup.sh Sun Aug 22 23:21:17 2010 @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +# Copyright Beman Dawes, 2010 +# Distributed under the Boost Software License, Version 1.0. +# See www.boost.org/LICENSE_1_0.txt + +cp ../tut1.cpp . +cp ../tut2.cpp . +cp ../tut3.cpp . +cp ../tut4.cpp . +cp ../tut5.cpp . +cp ../path_info.cpp . +rm tut1 2>~/junk +rm tut2 2>~/junk +rm tut3 2>~/junk +rm tut4 2>~/junk +rm tut5 2>~/junk +rm path_info 2>~/junk + ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tut0.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,25 @@+// filesystem tut0.cpp ---------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <iostream> +#include <boost/filesystem.hpp> +namespace fs = boost::filesystem; + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + std::cout << "Usage: tut0 path\n"; + return 1; + } + + std::cout << argv[1] << '\n'; + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tut1.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,23 @@+// filesystem tut1.cpp ---------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <iostream> +#include <boost/filesystem.hpp> +using namespace boost::filesystem; + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + std::cout << "Usage: tut1 path\n"; + return 1; + } + std::cout << argv[1] << " " << file_size(argv[1]) << '\n'; + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tut2.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,40 @@+// filesystem tut2.cpp ---------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <iostream> +#include <boost/filesystem.hpp> +using namespace std; +using namespace boost::filesystem; + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + cout << "Usage: tut2 path\n"; + return 1; + } + + path p (argv[1]); // p reads clearer than argv[1] in the following code + + if (exists(p)) // does p actually exist? + { + if (is_regular_file(p)) // is p a regular file? + cout << p << " size is " << file_size(p) << '\n'; + + else if (is_directory(p)) // is p a directory? + cout << p << " is a directory\n"; + + else+ cout << p << " exists, but is neither a regular file nor a directory\n";
+ } + else + cout << p << " does not exist\n"; + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tut3.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,56 @@+// filesystem tut3.cpp ---------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <iostream> +#include <iterator> +#include <algorithm> +#include <boost/filesystem.hpp> +using namespace std; +using namespace boost::filesystem; + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + cout << "Usage: tut3 path\n"; + return 1; + } + + path p (argv[1]); // p reads clearer than argv[1] in the following code + + try + { + if (exists(p)) // does p actually exist? + { + if (is_regular_file(p)) // is p a regular file? + cout << p << " size is " << file_size(p) << '\n'; + + else if (is_directory(p)) // is p a directory? + { + cout << p << " is a directory containing:\n"; ++ copy(directory_iterator(p), directory_iterator(), // directory_iterator::value_type + ostream_iterator<directory_entry>(cout, "\n")); // is directory_entry, which is + // converted to a path by the + // path stream inserter
+ } + else+ cout << p << " exists, but is neither a regular file nor a directory\n";
+ } + else + cout << p << " does not exist\n"; + } + + catch (const filesystem_error& ex) + { + cout << ex.what() << '\n'; + } + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tut4.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,65 @@+// filesystem tut4.cpp ---------------------------------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <iostream> +#include <iterator> +#include <vector> +#include <algorithm> +#include <boost/filesystem.hpp> +using namespace std; +using namespace boost::filesystem; + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + cout << "Usage: tut4 path\n"; + return 1; + } + + path p (argv[1]); // p reads clearer than argv[1] in the following code + + try + { + if (exists(p)) // does p actually exist? + { + if (is_regular_file(p)) // is p a regular file? + cout << p << " size is " << file_size(p) << '\n'; + + else if (is_directory(p)) // is p a directory? + { + cout << p << " is a directory containing:\n"; + + typedef vector<path> vec; // store paths, + vec v; // so we can sort them later ++ copy(directory_iterator(p), directory_iterator(), back_inserter(v));
++ sort(v.begin(), v.end()); // sort, since directory iteration + // is not ordered on some file systems
++ for (vec::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it)
+ { + cout << " " << *it << '\n'; + } + } + else+ cout << p << " exists, but is neither a regular file nor a directory\n";
+ } + else + cout << p << " does not exist\n"; + } + + catch (const filesystem_error& ex) + { + cout << ex.what() << '\n'; + } + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/example/tut5.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,52 @@+// filesystem tut5.cpp ---------------------------------------------------------------//
+ +// Copyright Beman Dawes 2010 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <boost/filesystem/fstream.hpp> +#include <string> +#include <list> +namespace fs = boost::filesystem; + +int main() +{ + // \u263A is "Unicode WHITE SMILING FACE = have a nice day!" + std::string narrow_string ("smile2"); + std::wstring wide_string (L"smile2\u263A"); + std::list<char> narrow_list; + narrow_list.push_back('s'); + narrow_list.push_back('m'); + narrow_list.push_back('i'); + narrow_list.push_back('l'); + narrow_list.push_back('e'); + narrow_list.push_back('3'); + std::list<wchar_t> wide_list; + wide_list.push_back(L's'); + wide_list.push_back(L'm'); + wide_list.push_back(L'i'); + wide_list.push_back(L'l'); + wide_list.push_back(L'e'); + wide_list.push_back(L'3'); + wide_list.push_back(L'\u263A'); + + { fs::ofstream f("smile"); } + { fs::ofstream f(L"smile\u263A"); } + { fs::ofstream f(narrow_string); } + { fs::ofstream f(wide_string); } + { fs::ofstream f(narrow_list); } + { fs::ofstream f(wide_list); } + narrow_list.pop_back(); + narrow_list.push_back('4'); + wide_list.pop_back(); + wide_list.pop_back(); + wide_list.push_back(L'4'); + wide_list.push_back(L'\u263A'); + { fs::ofstream f(fs::path(narrow_list.begin(), narrow_list.end())); } + { fs::ofstream f(fs::path(wide_list.begin(), wide_list.end())); } + + return 0; +} ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/index.html Sun Aug 22 23:21:17 2010 @@ -0,0 +1,14 @@ +<html> +<head> +<meta http-equiv="refresh" content="0; URL=doc/index.htm"> +</head> +<body> +Automatic redirection failed, please go to +<a href="doc/index.htm">doc/index.htm</a>. +<hr> +<p>© Copyright Beman Dawes, 2003</p> +<p> Distributed under the Boost Software+License, Version 1.0. (See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt";>
+www.boost.org/LICENSE_1_0.txt</a>)</p> +</body> +</html> ======================================= --- /dev/null+++ /trunk/libs/filesystem/v3/src/codecvt_error_category.cpp Sun Aug 22 23:21:17 2010
@@ -0,0 +1,93 @@+// codecvt_error_category implementation file ----------------------------------------//
+ +// Copyright Beman Dawes 2009 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt) + +// Library home page at http://www.boost.org/libs/filesystem + +//--------------------------------------------------------------------------------------// + +#include <boost/config.hpp> +#if !defined( BOOST_NO_STD_WSTRING ) +// Boost.Filesystem V3 and later requires std::wstring support.+// During the transition to V3, libraries are compiled with both V2 and V3 sources. +// On old compilers that don't support V3 anyhow, we just skip everything so the compile
+// will succeed and the library can be built. + +#include <boost/config/warning_disable.hpp> ++// define BOOST_FILESYSTEM_SOURCE so that <boost/filesystem/config.hpp> knows +// the library is being built (possibly exporting rather than importing code)
+#define BOOST_FILESYSTEM_SOURCE + +#ifndef BOOST_SYSTEM_NO_DEPRECATED +# define BOOST_SYSTEM_NO_DEPRECATED +#endif + +#include <boost/filesystem/v3/config.hpp> +#include <boost/filesystem/v3/path_traits.hpp> +#include <boost/system/error_code.hpp> +#include <locale> +#include <vector> +#include <cstdlib> +#include <cassert> + +//--------------------------------------------------------------------------------------// + +namespace +{ + class codecvt_error_cat : public boost::system::error_category + { + public: + codecvt_error_cat(){} + const char* name() const; + std::string message(int ev) const; + }; + + const char* codecvt_error_cat::name() const + { + return "codecvt"; + } + + std::string codecvt_error_cat::message(int ev) const + { + std::string str; + switch (ev) + { + case std::codecvt_base::ok: + str = "ok"; + break; + case std::codecvt_base::partial: + str = "partial"; + break; + case std::codecvt_base::error: + str = "error"; + break; + case std::codecvt_base::noconv: + str = "noconv"; + break; + default: + str = "unknown error"; + } + return str; + } + +} // unnamed namespace + +namespace boost +{ + namespace filesystem3 + { ++ BOOST_FILESYSTEM_DECL const boost::system::error_category& codecvt_error_category()
+ { + static const codecvt_error_cat codecvt_error_cat_const; + return codecvt_error_cat_const; + } + + } // namespace filesystem3 +} // namespace boost + +#endif // no wide character support ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/src/operations.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,1841 @@+// operations.cpp --------------------------------------------------------------------//
+ +// Copyright 2002-2009 Beman Dawes +// Copyright 2001 Dietmar Kuehl + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// See library home page at http://www.boost.org/libs/filesystem + +//--------------------------------------------------------------------------------------// + +#include <boost/config.hpp> +#if !defined( BOOST_NO_STD_WSTRING ) +// Boost.Filesystem V3 and later requires std::wstring support.+// During the transition to V3, libraries are compiled with both V2 and V3 sources. +// On old compilers that don't support V3 anyhow, we just skip everything so the compile
+// will succeed and the library can be built. ++// define BOOST_FILESYSTEM_SOURCE so that <boost/filesystem/config.hpp> knows +// the library is being built (possibly exporting rather than importing code)
+ +#define BOOST_FILESYSTEM_SOURCE + +#ifndef BOOST_SYSTEM_NO_DEPRECATED +# define BOOST_SYSTEM_NO_DEPRECATED +#endif + +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS // Sun readdir_r()needs this +#endif + +#if !(defined(__HP_aCC) && defined(_ILP32) && \ + !defined(_STATVFS_ACPP_PROBLEMS_FIXED)) +#define _FILE_OFFSET_BITS 64 // at worst, these defines may have no effect, +#endif +#define __USE_FILE_OFFSET64 // but that is harmless on Windows and on POSIX + // 64-bit systems or on 32-bit systems which don't have files larger + // than can be represented by a traditional POSIX/UNIX off_t type. + // OTOH, defining them should kick in 64-bit off_t's (and thus + // st_size)on 32-bit systems that provide the Large File + // Support (LFS)interface, such as Linux, Solaris, and IRIX. + // The defines are given before any headers are included to + // ensure that they are available to all included headers. + // That is required at least on Solaris, and possibly on other + // systems as well. + +#include <boost/filesystem/v3/operations.hpp> +#include <boost/scoped_array.hpp> +#include <boost/detail/workaround.hpp> +#include <cstdlib> // for malloc, free + +#ifdef BOOST_FILEYSTEM_INCLUDE_IOSTREAM +# include <iostream> +#endif + +namespace fs = boost::filesystem3; +using boost::filesystem3::path; +using boost::filesystem3::filesystem_error; +using boost::system::error_code; +using boost::system::error_category; +using boost::system::system_category; +using std::string; +using std::wstring; + +# ifdef BOOST_POSIX_API + +# include <sys/types.h> +# if !defined(__APPLE__) && !defined(__OpenBSD__) +# include <sys/statvfs.h> +# define BOOST_STATVFS statvfs +# define BOOST_STATVFS_F_FRSIZE vfs.f_frsize +# else +# ifdef __OpenBSD__ +# include <sys/param.h> +# endif +# include <sys/mount.h> +# define BOOST_STATVFS statfs+# define BOOST_STATVFS_F_FRSIZE static_cast<boost::uintmax_t>(vfs.f_bsize)
+# endif +# include <dirent.h> +# include <unistd.h> +# include <fcntl.h> +# include <utime.h> +# include "limits.h" + +# else // BOOST_WINDOW_API + +# if (defined(__MINGW32__) || defined(__CYGWIN__)) && !defined(WINVER)+ // Versions of MinGW or Cygwin that support Filesystem V3 support at least WINVER 0x501.
+ // See MinGW's windef.h +# define WINVER 0x501 +# endif +# include <windows.h> +# include <winnt.h> +# if !defined(_WIN32_WINNT) +# define _WIN32_WINNT 0x0500 +# endif +# if defined(__BORLANDC__) || defined(__MWERKS__) +# if defined(__BORLANDC__) + using std::time_t; +# endif +# include <utime.h> +# else +# include <sys/utime.h> +# endif ++// REPARSE_DATA_BUFFER related definitions are found in ntifs.h, which is part of the +// Windows Device Driver Kit. Since that's inconvenient, the definitions are provided
+// here. See http://msdn.microsoft.com/en-us/library/ms791514.aspx ++#if !defined(REPARSE_DATA_BUFFER_HEADER_SIZE) // mingw winnt.h does provide the defs
+ +#define SYMLINK_FLAG_RELATIVE 1 + +typedef struct _REPARSE_DATA_BUFFER { + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + union { + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + ULONG Flags; + WCHAR PathBuffer[1]; + /* Example of distinction between substitute and print names: + mklink /d ldrive c:\ + SubstituteName: c:\\??\ + PrintName: c:\ + */ + } SymbolicLinkReparseBuffer; + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + }; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; + +#define REPARSE_DATA_BUFFER_HEADER_SIZE \ + FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) + +#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 ) +#endif + +# endif + +// BOOST_FILESYSTEM_STATUS_CACHE enables file_status cache in +// dir_itr_increment. The config tests are placed here because some of the +// macros being tested come from dirent.h. +//+// TODO: find out what macros indicate dirent::d_type present in more libraries
+# if defined(BOOST_WINDOWS_API)\+ || defined(_DIRENT_HAVE_D_TYPE)// defined by GNU C library if d_type present
+# define BOOST_FILESYSTEM_STATUS_CACHE +# endif + +#include <sys/stat.h> // even on Windows some functions use stat() +#include <string> +#include <cstring> +#include <cstdio> // for remove, rename +#include <cerrno> +#include <cassert>+// #include <iostream> // for debugging only; comment out when not in use
++// POSIX/Windows macros ----------------------------------------------------//
++// Portions of the POSIX and Windows API's are very similar, except for name, +// order of arguments, and meaning of zero/non-zero returns. The macros below +// abstract away those differences. They follow Windows naming and order of +// arguments, and return true to indicate no error occurred. [POSIX naming,
+// order of arguments, and meaning of return were followed initially, but +// found to be less clear and cause more coding errors.] + +# if defined(BOOST_POSIX_API) + +// POSIX uses a 0 return to indicate success +# define BOOST_ERRNO errno +# define BOOST_SET_CURRENT_DIRECTORY(P)(::chdir(P)== 0)+# define BOOST_CREATE_DIRECTORY(P)(::mkdir(P, S_IRWXU|S_IRWXG|S_IRWXO)== 0)
+# define BOOST_CREATE_HARD_LINK(F,T)(::link(T, F)== 0) +# define BOOST_CREATE_SYMBOLIC_LINK(F,T,Flag)(::symlink(T, F)== 0) +# define BOOST_REMOVE_DIRECTORY(P)(::rmdir(P)== 0) +# define BOOST_DELETE_FILE(P)(::unlink(P)== 0)+# define BOOST_COPY_DIRECTORY(F,T)(!(::stat(from.c_str(), &from_stat)!= 0\
+ || ::mkdir(to.c_str(),from_stat.st_mode)!= 0))+# define BOOST_COPY_FILE(F,T,FailIfExistsBool)copy_file_api(F, T, FailIfExistsBool)
+# define BOOST_MOVE_FILE(OLD,NEW)(::rename(OLD, NEW)== 0) +# define BOOST_RESIZE_FILE(P,SZ)(::truncate(P, SZ)== 0) + +# define BOOST_ERROR_NOT_SUPPORTED ENOSYS +# define BOOST_ERROR_ALREADY_EXISTS EEXIST + +# else // BOOST_WINDOWS_API + +// Windows uses a non-0 return to indicate success +# define BOOST_ERRNO ::GetLastError() +# define BOOST_SET_CURRENT_DIRECTORY(P)(::SetCurrentDirectoryW(P)!= 0) +# define BOOST_CREATE_DIRECTORY(P)(::CreateDirectoryW(P, 0)!= 0) +# define BOOST_CREATE_HARD_LINK(F,T)(create_hard_link_api(F, T, 0)!= 0)+# define BOOST_CREATE_SYMBOLIC_LINK(F,T,Flag)(create_symbolic_link_api(F, T, Flag)!= 0)
+# define BOOST_REMOVE_DIRECTORY(P)(::RemoveDirectoryW(P)!= 0) +# define BOOST_DELETE_FILE(P)(::DeleteFileW(P)!= 0) +# define BOOST_COPY_DIRECTORY(F,T)(::CreateDirectoryExW(F, T, 0)!= 0)+# define BOOST_COPY_FILE(F,T,FailIfExistsBool)(::CopyFileW(F, T, FailIfExistsBool)!= 0) +# define BOOST_MOVE_FILE(OLD,NEW)(::MoveFileExW(OLD, NEW, MOVEFILE_REPLACE_EXISTING)!= 0)
+# define BOOST_RESIZE_FILE(P,SZ)(resize_file_api(P, SZ)!= 0) +# define BOOST_READ_SYMLINK(P,T) + +# define BOOST_ERROR_ALREADY_EXISTS ERROR_ALREADY_EXISTS +# define BOOST_ERROR_NOT_SUPPORTED ERROR_NOT_SUPPORTED + +# endif + +//--------------------------------------------------------------------------------------//+// // +// helpers (all operating systems) // +// //
+//--------------------------------------------------------------------------------------// + +namespace +{ + +# ifdef BOOST_POSIX_API + const char dot = '.'; +# else + const wchar_t dot = L'.'; +# endif + + boost::filesystem3::directory_iterator end_dir_itr; + + const std::size_t buf_size(128); + const error_code ok; + + bool error(bool was_error, error_code* ec, const string& message) + { + if (!was_error) + { + if (ec != 0) ec->clear(); + } + else + { // error + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error(message, + error_code(BOOST_ERRNO, system_category()))); + else + ec->assign(BOOST_ERRNO, system_category()); + } + return was_error; + } ++ bool error(bool was_error, const path& p, error_code* ec, const string& message)
+ { + if (!was_error) + { + if (ec != 0) ec->clear(); + } + else + { // error + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error(message, + p, error_code(BOOST_ERRNO, system_category()))); + else + ec->assign(BOOST_ERRNO, system_category()); + } + return was_error; + } ++ bool error(bool was_error, const path& p1, const path& p2, error_code* ec,
+ const string& message) + { + if (!was_error) + { + if (ec != 0) ec->clear(); + } + else + { // error + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error(message, + p1, p2, error_code(BOOST_ERRNO, system_category()))); + else + ec->assign(BOOST_ERRNO, system_category()); + } + return was_error; + } + + bool error(bool was_error, const error_code& result, + const path& p, error_code* ec, const string& message) + // Overwrites ec if there has already been an error + { + if (!was_error) + { + if (ec != 0) ec->clear(); + } + else + { // error + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error(message, p, result)); + else + *ec = result; + } + return was_error; + } + + bool error(bool was_error, const error_code& result, + const path& p1, const path& p2, error_code* ec, const string& message) + // Overwrites ec if there has already been an error + { + if (!was_error) + { + if (ec != 0) ec->clear(); + } + else + { // error + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error(message, p1, p2, result)); + else + *ec = result; + } + return was_error; + } + + bool is_empty_directory(const path& p) + { + return fs::directory_iterator(p)== end_dir_itr; + } + + bool remove_directory(const path& p) // true if succeeds + { return BOOST_REMOVE_DIRECTORY(p.c_str()); } + + bool remove_file(const path& p) // true if succeeds + { return BOOST_DELETE_FILE(p.c_str()); } + + // called by remove and remove_all_aux+ bool remove_file_or_directory(const path& p, fs::file_status sym_stat, error_code* ec)
+ // return true if file removed, false if not removed + { + if (sym_stat.type()== fs::file_not_found) + { + if (ec != 0) ec->clear(); + return false; + } + + if (fs::is_directory(sym_stat)) + { + if (error(!remove_directory(p), p, ec, "boost::filesystem::remove")) + return false; + } + else + { + if (error(!remove_file(p), p, ec, "boost::filesystem::remove")) + return false; + } + return true; + } + + boost::uintmax_t remove_all_aux(const path& p, fs::file_status sym_stat, + error_code* ec) + { + boost::uintmax_t count = 1; + + if (!fs::is_symlink(sym_stat)// don't recurse symbolic links + && fs::is_directory(sym_stat)) + { + for (fs::directory_iterator itr(p); + itr != end_dir_itr; ++itr) + {+ fs::file_status tmp_sym_stat = fs::symlink_status(itr->path(), *ec);
+ if (ec != 0 && ec) + return count; + count += remove_all_aux(itr->path(), tmp_sym_stat, ec); + } + } + remove_file_or_directory(p, sym_stat, ec); + return count; + } + +#ifdef BOOST_POSIX_API + +//--------------------------------------------------------------------------------------//+// // +// POSIX-specific helpers // +// //
+//--------------------------------------------------------------------------------------// + + bool not_found_error(int errval) + { + return errno == ENOENT || errno == ENOTDIR; + } + + bool // true if ok + copy_file_api(const std::string& from_p, + const std::string& to_p, bool fail_if_exists) + { + const std::size_t buf_sz = 32768; + boost::scoped_array<char> buf(new char [buf_sz]); + int infile=-1, outfile=-1; // -1 means not open ++ // bug fixed: code previously did a stat()on the from_file first, but that + // introduced a gratuitous race condition; the stat()is now done after the open()
+ + if ((infile = ::open(from_p.c_str(), O_RDONLY))< 0) + { return false; } + + struct stat from_stat; + if (::stat(from_p.c_str(), &from_stat)!= 0) + { return false; } + + int oflag = O_CREAT | O_WRONLY; + if (fail_if_exists)oflag |= O_EXCL; + if ((outfile = ::open(to_p.c_str(), oflag, from_stat.st_mode))< 0) + { + int open_errno = errno; + BOOST_ASSERT(infile >= 0); + ::close(infile); + errno = open_errno; + return false; + } + + ssize_t sz, sz_read=1, sz_write; + while (sz_read > 0 + && (sz_read = ::read(infile, buf.get(), buf_sz))> 0) + {+ // Allow for partial writes - see Advanced Unix Programming (2nd Ed.),
+ // Marc Rochkind, Addison-Wesley, 2004, page 94 + sz_write = 0; + do + { + if ((sz = ::write(outfile, buf.get() + sz_write, + sz_read - sz_write))< 0) + { + sz_read = sz; // cause read loop termination + break; // and error to be thrown after closes + } + sz_write += sz; + } while (sz_write < sz_read); + } + + if (::close(infile)< 0)sz_read = -1; + if (::close(outfile)< 0)sz_read = -1; + + return sz_read >= 0; + } + +# else + +//--------------------------------------------------------------------------------------//+// // +// Windows-specific helpers // +// //
+//--------------------------------------------------------------------------------------// + + bool not_found_error(int errval) + { + return errval == ERROR_FILE_NOT_FOUND + || errval == ERROR_PATH_NOT_FOUND+ || errval == ERROR_INVALID_NAME // "tools/jam/src/:sys:stat.h", "//foo" + || errval == ERROR_INVALID_DRIVE // USB card reader with no card inserted
+ || errval == ERROR_NOT_READY // CD/DVD drive with no disc inserted + || errval == ERROR_INVALID_PARAMETER // ":sys:stat.h" + || errval == ERROR_BAD_PATHNAME // "//nosuch" on Win64 + || errval == ERROR_BAD_NETPATH; // "//nosuch" on Win32 + } + + // these constants come from inspecting some Microsoft sample code + std::time_t to_time_t(const FILETIME & ft) + { + __int64 t = (static_cast<__int64>(ft.dwHighDateTime)<< 32) + + ft.dwLowDateTime; +# if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // > VC++ 7.0 + t -= 116444736000000000LL; +# else + t -= 116444736000000000; +# endif + t /= 10000000; + return static_cast<std::time_t>(t); + } + + void to_FILETIME(std::time_t t, FILETIME & ft) + { + __int64 temp = t; + temp *= 10000000; +# if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // > VC++ 7.0 + temp += 116444736000000000LL; +# else + temp += 116444736000000000; +# endif + ft.dwLowDateTime = static_cast<DWORD>(temp); + ft.dwHighDateTime = static_cast<DWORD>(temp >> 32); + } + + // Thanks to Jeremy Maitin-Shepard for much help and for permission to + // base the equivalent()implementation on portions of his + // file-equivalence-win32.cpp experimental code. + + struct handle_wrapper + { + HANDLE handle; + handle_wrapper(HANDLE h) + : handle(h){} + ~handle_wrapper() + { + if (handle != INVALID_HANDLE_VALUE) + ::CloseHandle(handle); + } + }; + + HANDLE create_file_handle(path p, DWORD dwDesiredAccess, + DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, + DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, + HANDLE hTemplateFile) + { + return ::CreateFileW(p.c_str(), dwDesiredAccess, dwShareMode, + lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, + hTemplateFile); + } + + inline std::size_t get_full_path_name( + const path& src, std::size_t len, wchar_t* buf, wchar_t** p) + { + return static_cast<std::size_t>( + ::GetFullPathNameW(src.c_str(), static_cast<DWORD>(len), buf, p)); + } + + BOOL resize_file_api(const wchar_t* p, boost::uintmax_t size) + { + HANDLE handle = CreateFileW(p, GENERIC_WRITE, 0, 0, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, 0); + LARGE_INTEGER sz; + sz.QuadPart = size; + return handle != INVALID_HANDLE_VALUE + && ::SetFilePointerEx(handle, sz, 0, FILE_BEGIN) + && ::SetEndOfFile(handle) + && ::CloseHandle(handle); + } + + // Windows kernel32.dll functions that may or may not be present + // must be accessed through pointers + + typedef BOOL (WINAPI *PtrCreateHardLinkW)( + /*__in*/ LPCWSTR lpFileName, + /*__in*/ LPCWSTR lpExistingFileName, + /*__reserved*/ LPSECURITY_ATTRIBUTES lpSecurityAttributes + ); + + PtrCreateHardLinkW create_hard_link_api = PtrCreateHardLinkW( + ::GetProcAddress( + ::GetModuleHandle(TEXT("kernel32.dll")), "CreateHardLinkW")); + + typedef BOOLEAN (WINAPI *PtrCreateSymbolicLinkW)( + /*__in*/ LPCWSTR lpSymlinkFileName, + /*__in*/ LPCWSTR lpTargetFileName, + /*__in*/ DWORD dwFlags + ); + + PtrCreateSymbolicLinkW create_symbolic_link_api = PtrCreateSymbolicLinkW( + ::GetProcAddress( + ::GetModuleHandle(TEXT("kernel32.dll")), "CreateSymbolicLinkW")); +#endif + +//#ifdef BOOST_WINDOWS_API +// +// +// inline bool get_free_disk_space(const std::wstring& ph, +// PULARGE_INTEGER avail, PULARGE_INTEGER total, PULARGE_INTEGER free) +// { return ::GetDiskFreeSpaceExW(ph.c_str(), avail, total, free)!= 0; } +// +//#endif + +} // unnamed namespace + +//--------------------------------------------------------------------------------------//+// // +// operations functions declared in operations.hpp // +// in alphabetic order // +// //
+//--------------------------------------------------------------------------------------// + +namespace boost +{ +namespace filesystem3 +{ + + BOOST_FILESYSTEM_DECL + path absolute(const path& p, const path& base) + { +// if ( p.empty() || p.is_absolute() ) +// return p; +// // recursively calling absolute is sub-optimal, but is simple +// path abs_base(base.is_absolute() ? base : absolute(base)); +//# ifdef BOOST_WINDOWS_API +// if (p.has_root_directory()) +// return abs_base.root_name() / p; +// // !p.has_root_directory +// if (p.has_root_name()) +// return p.root_name()+// / abs_base.root_directory() / abs_base.relative_path() / p.relative_path();
+// // !p.has_root_name() +//# endif +// return abs_base / p; + + // recursively calling absolute is sub-optimal, but is sure and simple + path abs_base(base.is_absolute() ? base : absolute(base)); + + // store expensive to compute values that are needed multiple times + path p_root_name (p.root_name()); + path base_root_name (abs_base.root_name()); + path p_root_directory (p.root_directory()); + + if (p.empty()) + return abs_base; + + if (!p_root_name.empty()) // p.has_root_name() + { + if (p_root_directory.empty()) // !p.has_root_directory() + return p_root_name / abs_base.root_directory() + / abs_base.relative_path() / p.relative_path(); + // p is absolute, so fall through to return p at end of block + } + + else if (!p_root_directory.empty()) // p.has_root_directory() + { +# ifdef BOOST_POSIX_API + // POSIX can have root name it it is a network path + if (base_root_name.empty()) // !abs_base.has_root_name() + return p; +# endif + return base_root_name / p; + } + + else + { + return abs_base / p; + } + + return p; // p.is_absolute() is true + } + +namespace detail +{ + BOOST_FILESYSTEM_DECL bool possible_large_file_size_support() + { +# ifdef BOOST_POSIX_API + struct stat lcl_stat; + return sizeof(lcl_stat.st_size)> 4; +# else + return true; +# endif + } + + BOOST_FILESYSTEM_DECL + void copy(const path& from, const path& to, system::error_code* ec) + { + file_status s(symlink_status(from, *ec)); + if (ec != 0 && ec)return; + + if(is_symlink(s)) + { + copy_symlink(from, to, *ec); + } + else if(is_directory(s)) + { + copy_directory(from, to, *ec); + } + else if(is_regular_file(s)) + { + copy_file(from, to, copy_option::fail_if_exists, *ec); + } + else + { + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::copy",+ from, to, error_code(BOOST_ERROR_NOT_SUPPORTED, system_category())));
+ ec->assign(BOOST_ERROR_NOT_SUPPORTED, system_category()); + } + } + + BOOST_FILESYSTEM_DECL+ void copy_directory(const path& from, const path& to, system::error_code* ec)
+ { +# ifdef BOOST_POSIX_API + struct stat from_stat; +# endif + error(!BOOST_COPY_DIRECTORY(from.c_str(), to.c_str()), + from, to, ec, "boost::filesystem::copy_directory"); + } + + BOOST_FILESYSTEM_DECL + void copy_file(const path& from, const path& to, + BOOST_SCOPED_ENUM(copy_option)option, + error_code* ec) + { + error(!BOOST_COPY_FILE(from.c_str(), to.c_str(), + option == copy_option::fail_if_exists), + from, to, ec, "boost::filesystem::copy_file"); + } + + BOOST_FILESYSTEM_DECL+ void copy_symlink(const path& from, const path& to, system::error_code* ec)
+ { +# ifdef BOOST_POSIX_API + path p(read_symlink(from, ec)); + if (ec != 0 && ec) return; + create_symlink(p, to, ec); + +# elif _WIN32_WINNT < 0x0600 // SDK earlier than Vista and Server 2008+ error(true, error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), to, from, ec,
+ "boost::filesystem::copy_symlink"); + +# else // modern Windows + + // see if actually supported by Windows runtime dll + if (error(!create_symbolic_link_api, + error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), + to, from, ec, + "boost::filesystem3::copy_symlink")) + return; + + // preconditions met, so attempt the copy + error(!::CopyFileExW(from.c_str(), to.c_str(), 0, 0, 0, + COPY_FILE_COPY_SYMLINK | COPY_FILE_FAIL_IF_EXISTS), to, from, ec, + "boost::filesystem3::copy_symlink"); +# endif + + } + + BOOST_FILESYSTEM_DECL + bool create_directories(const path& p, system::error_code* ec) + { + if (p.empty() || exists(p)) + { + if (!p.empty() && !is_directory(p)) + { + if (ec == 0) + BOOST_FILESYSTEM_THROW(filesystem_error( + "boost::filesystem::create_directories", p,+ error_code(system::errc::file_exists, system::generic_category()))); + else ec->assign(system::errc::file_exists, system::generic_category());
+ } + return false; + } + + // First create branch, by calling ourself recursively + create_directories(p.parent_path(), ec); + // Now that parent's path exists, create the directory + create_directory(p, ec); + return true; + } + + BOOST_FILESYSTEM_DECL + bool create_directory(const path& p, error_code* ec) + { + if (BOOST_CREATE_DIRECTORY(p.c_str())) + { + if (ec != 0) ec->clear(); + return true; + } + + // attempt to create directory failed + int errval(BOOST_ERRNO); // save reason for failure + error_code dummy; + if (errval == BOOST_ERROR_ALREADY_EXISTS && is_directory(p, dummy)) + { + if (ec != 0) ec->clear(); + return false; + } + + // attempt to create directory failed && it doesn't already exist + if (ec == 0)+ BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::create_directory",
+ p, error_code(errval, system_category()))); + else + ec->assign(errval, system_category()); + return false; + } + + BOOST_FILESYSTEM_DECL + void create_directory_symlink(const path& to, const path& from, + system::error_code* ec) + {+# if defined(BOOST_WINDOWS_API) && _WIN32_WINNT < 0x0600 // SDK earlier than Vista and Server 2008
++ error(true, error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), to, from, ec,
+ "boost::filesystem::create_directory_symlink"); +# else + +# if defined(BOOST_WINDOWS_API) && _WIN32_WINNT >= 0x0600 + // see if actually supported by Windows runtime dll + if (error(!create_symbolic_link_api, + error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), + to, from, ec, + "boost::filesystem::create_directory_symlink")) + return; +# endif ++ error(!BOOST_CREATE_SYMBOLIC_LINK(from.c_str(), to.c_str(), SYMBOLIC_LINK_FLAG_DIRECTORY),
+ to, from, ec, "boost::filesystem::create_directory_symlink"); +# endif + } + + BOOST_FILESYSTEM_DECL + void create_hard_link(const path& to, const path& from, error_code* ec) + { ++# if defined(BOOST_WINDOWS_API) && _WIN32_WINNT < 0x0500 // SDK earlier than Win 2K
++ error(true, error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), to, from, ec,
+ "boost::filesystem::create_hard_link"); +# else + +# if defined(BOOST_WINDOWS_API) && _WIN32_WINNT >= 0x0500 + // see if actually supported by Windows runtime dll + if (error(!create_hard_link_api, + error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), + to, from, ec, + "boost::filesystem::create_hard_link")) + return; +# endif + + error(!BOOST_CREATE_HARD_LINK(from.c_str(), to.c_str()), to, from, ec, + "boost::filesystem::create_hard_link"); +# endif + } + + BOOST_FILESYSTEM_DECL + void create_symlink(const path& to, const path& from, error_code* ec) + {+# if defined(BOOST_WINDOWS_API) && _WIN32_WINNT < 0x0600 // SDK earlier than Vista and Server 2008 + error(true, error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), to, from, ec,
+ "boost::filesystem::create_directory_symlink"); +# else + +# if defined(BOOST_WINDOWS_API) && _WIN32_WINNT >= 0x0600 + // see if actually supported by Windows runtime dll + if (error(!create_symbolic_link_api, + error_code(BOOST_ERROR_NOT_SUPPORTED, system_category()), + to, from, ec, + "boost::filesystem::create_directory_symlink")) + return; +# endif + + error(!BOOST_CREATE_SYMBOLIC_LINK(from.c_str(), to.c_str(), 0), + to, from, ec, "boost::filesystem::create_directory_symlink"); +# endif + } + + BOOST_FILESYSTEM_DECL + path current_path(error_code* ec) + { +# ifdef BOOST_POSIX_API + path cur;+ for (long path_max = 128;; path_max *=2)// loop 'til buffer large enough
+ { + boost::scoped_array<char> + buf(new char[static_cast<std::size_t>(path_max)]); + if (::getcwd(buf.get(), static_cast<std::size_t>(path_max))== 0) + { + if (error(errno != ERANGE+ // bug in some versions of the Metrowerks C lib on the Mac: wrong errno set +# if defined(__MSL__) && (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
+ && errno != 0 +# endif + , ec, "boost::filesystem::current_path")) + { + break; + } + } + else + { + cur = buf.get(); + if (ec != 0) ec->clear(); + break; + } + } + return cur; + +# else + DWORD sz; + if ((sz = ::GetCurrentDirectoryW(0, NULL))== 0)sz = 1; + boost::scoped_array<path::value_type> buf(new path::value_type[sz]); + error(::GetCurrentDirectoryW(sz, buf.get())== 0, ec, + "boost::filesystem::current_path"); + return path(buf.get()); +# endif + } + + + BOOST_FILESYSTEM_DECL + void current_path(const path& p, system::error_code* ec) + { + error(!BOOST_SET_CURRENT_DIRECTORY(p.c_str()), + p, ec, "boost::filesystem::current_path"); + } + + BOOST_FILESYSTEM_DECL + bool equivalent(const path& p1, const path& p2, system::error_code* ec) + { +# ifdef BOOST_POSIX_API + struct stat s2; + int e2(::stat(p2.c_str(), &s2)); + struct stat s1; + int e1(::stat(p1.c_str(), &s1)); + + if (e1 != 0 || e2 != 0) + { + // if one is invalid and the other isn't then they aren't equivalent, + // but if both are invalid then it is an error+ error (e1 != 0 && e2 != 0, p1, p2, ec, "boost::filesystem::equivalent");
+ return false; + } + + // both stats now known to be valid + return s1.st_dev == s2.st_dev && s1.st_ino == s2.st_ino + // According to the POSIX stat specs, "The st_ino and st_dev fields + // taken together uniquely identify the file within the system." + // Just to be sure, size and mod time are also checked. + && s1.st_size == s2.st_size && s1.st_mtime == s2.st_mtime; + +# else // Windows + + // Note well: Physical location on external media is part of the+ // equivalence criteria. If there are no open handles, physical location
+ // can change due to defragmentation or other relocations. Thus handles + // must be held open until location information for both paths has + // been retrieved. + + // p2 is done first, so any error reported is for p1 + handle_wrapper h2( + create_file_handle( + p2.c_str(), + 0, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + 0)); + + handle_wrapper h1( + create_file_handle( + p1.c_str(), + 0, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + 0)); + + if (h1.handle == INVALID_HANDLE_VALUE + || h2.handle == INVALID_HANDLE_VALUE) + {+ // if one is invalid and the other isn't, then they aren't equivalent,
+ // but if both are invalid then it is an error + error(h1.handle == INVALID_HANDLE_VALUE + && h2.handle == INVALID_HANDLE_VALUE, p1, p2, ec, + "boost::filesystem::equivalent"); + return false; + } + + // at this point, both handles are known to be valid + + BY_HANDLE_FILE_INFORMATION info1, info2; + + if (error(!::GetFileInformationByHandle(h1.handle, &info1), + p1, p2, ec, "boost::filesystem::equivalent")) + return false; + + if (error(!::GetFileInformationByHandle(h2.handle, &info2), + p1, p2, ec, "boost::filesystem::equivalent")) + return false; ++ // In theory, volume serial numbers are sufficient to distinguish between + // devices, but in practice VSN's are sometimes duplicated, so last write
+ // time and file size are also checked. + return + info1.dwVolumeSerialNumber == info2.dwVolumeSerialNumber + && info1.nFileIndexHigh == info2.nFileIndexHigh + && info1.nFileIndexLow == info2.nFileIndexLow + && info1.nFileSizeHigh == info2.nFileSizeHigh + && info1.nFileSizeLow == info2.nFileSizeLow + && info1.ftLastWriteTime.dwLowDateTime + == info2.ftLastWriteTime.dwLowDateTime + && info1.ftLastWriteTime.dwHighDateTime + == info2.ftLastWriteTime.dwHighDateTime; + +# endif + } + + BOOST_FILESYSTEM_DECL + boost::uintmax_t file_size(const path& p, error_code* ec) + { +# ifdef BOOST_POSIX_API ***The diff for this file has been truncated for email.*** ======================================= --- /dev/null +++ /trunk/libs/filesystem/v3/src/path.cpp Sun Aug 22 23:21:17 2010 @@ -0,0 +1,807 @@+// filesystem path.cpp ------------------------------------------------------------- //
+ +// Copyright Beman Dawes 2008 + +// Distributed under the Boost Software License, Version 1.0. +// See http://www.boost.org/LICENSE_1_0.txt + +// Library home page: http://www.boost.org/libs/filesystem + +#include <boost/config.hpp> +#if !defined( BOOST_NO_STD_WSTRING ) +// Boost.Filesystem V3 and later requires std::wstring support.+// During the transition to V3, libraries are compiled with both V2 and V3 sources. +// On old compilers that don't support V3 anyhow, we just skip everything so the compile
+// will succeed and the library can be built. + +// define BOOST_FILESYSTEM_SOURCE so that <boost/system/config.hpp> knows+// the library is being built (possibly exporting rather than importing code)
+#define BOOST_FILESYSTEM_SOURCE + +#ifndef BOOST_SYSTEM_NO_DEPRECATED +# define BOOST_SYSTEM_NO_DEPRECATED +#endif + +#include <boost/filesystem/v3/config.hpp> +#include <boost/filesystem/v3/path.hpp> +#include <boost/scoped_array.hpp> +#include <boost/system/error_code.hpp> +#include <boost/assert.hpp> +#include <cstddef> +#include <cstring> +#include <cassert> + +#ifdef BOOST_WINDOWS_API +# include "windows_file_codecvt.hpp" +# include <windows.h> +#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +# include <boost/filesystem/detail/utf8_codecvt_facet.hpp> +#endif + +#ifdef BOOST_FILESYSTEM_DEBUG +# include <iostream> +# include <iomanip> +#endif + +namespace fs = boost::filesystem3; + +using boost::filesystem3::path; + +using std::string; +using std::wstring; + +using boost::system::error_code; + +#ifndef BOOST_FILESYSTEM_CODECVT_BUF_SIZE +# define BOOST_FILESYSTEM_CODECVT_BUF_SIZE 256 +#endif + +//--------------------------------------------------------------------------------------//+// // +// class path helpers // +// //
+//--------------------------------------------------------------------------------------// + +namespace +{+ //------------------------------------------------------------------------------------// + // miscellaneous class path helpers // + //------------------------------------------------------------------------------------//
+ + typedef path::value_type value_type; + typedef path::string_type string_type; + typedef string_type::size_type size_type; ++ const std::size_t default_codecvt_buf_size = BOOST_FILESYSTEM_CODECVT_BUF_SIZE;
+ +# ifdef BOOST_WINDOWS_API + + const wchar_t separator = L'/'; + const wchar_t preferred_separator = L'\\'; + const wchar_t* const separators = L"/\\"; + const wchar_t* separator_string = L"/"; + const wchar_t* preferred_separator_string = L"\\"; + const wchar_t colon = L':'; + const wchar_t dot = L'.'; + const fs::path dot_path(L"."); + const fs::path dot_dot_path(L".."); + +# else + + const char separator = '/'; + const char preferred_separator = '/'; + const char* const separators = "/"; + const char* separator_string = "/"; + const char* preferred_separator_string = "/"; + const char colon = ':'; + const char dot = '.'; + const fs::path dot_path("."); + const fs::path dot_dot_path(".."); + +# endif + + inline bool is_separator(fs::path::value_type c) + { + return c == separator +# ifdef BOOST_WINDOWS_API + || c == preferred_separator +# endif + ; + } + + bool is_non_root_separator(const string_type& str, size_type pos); + // pos is position of the separator + + size_type filename_pos(const string_type& str,+ size_type end_pos); // end_pos is past-the-end position
+ // Returns: 0 if str itself is filename (or empty) + + size_type root_directory_start(const string_type& path, size_type size); + // Returns: npos if no root_directory found + + void first_element( + const string_type& src, + size_type& element_pos, + size_type& element_size, +# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1310) // VC++ 7.1 + size_type size = string_type::npos +# else + size_type size = -1 +# endif + ); + +} // unnamed namespace + +//--------------------------------------------------------------------------------------//+// // +// class path implementation // +// //
+//--------------------------------------------------------------------------------------// + +namespace boost +{ +namespace filesystem3 +{ + + path & path::operator/=(const path & p) + { + if (p.empty()) + return *this; + if (!is_separator(*p.m_pathname.begin())) + m_append_separator_if_needed(); + m_pathname += p.m_pathname; + return *this; + } + +# ifdef BOOST_WINDOWS_API + + void path::m_portable() + { + for (string_type::iterator it = m_pathname.begin(); + it != m_pathname.end(); ++it) + { + if (*it == L'\\') + *it = L'/'; + } + } + + const std::string path::generic_string(const codecvt_type& cvt) const + { + path tmp(*this); + tmp.m_portable(); + return tmp.string(cvt); + } + + const std::wstring path::generic_wstring() const + { + path tmp(*this); + tmp.m_portable(); + return tmp.wstring(); + } + +# endif // BOOST_WINDOWS_API ++ // m_append_separator_if_needed ----------------------------------------------------//
+ + path::string_type::size_type path::m_append_separator_if_needed() + { + if (!m_pathname.empty() && +# ifdef BOOST_WINDOWS_API + *(m_pathname.end()-1) != colon && +# endif + !is_separator(*(m_pathname.end()-1))) + { + string_type::size_type tmp(m_pathname.size()); + m_pathname += preferred_separator; + return tmp; + } + return 0; + } ++ // m_erase_redundant_separator -----------------------------------------------------//
+ + void path::m_erase_redundant_separator(string_type::size_type sep_pos) + { + if (sep_pos // a separator was added + && sep_pos < m_pathname.size() // and something was appended + && (m_pathname[sep_pos+1] == separator // and it was also separator +# ifdef BOOST_WINDOWS_API+ || m_pathname[sep_pos+1] == preferred_separator // or preferred_separator
+# endif +)) { m_pathname.erase(sep_pos, 1); } // erase the added separator + } ++ // modifiers -----------------------------------------------------------------------//
+ +# ifdef BOOST_WINDOWS_API + path & path::make_preferred() + { + for (string_type::iterator it = m_pathname.begin(); + it != m_pathname.end(); ++it) + { + if (*it == L'/') + *it = L'\\'; + } + return *this; + } +# endif + + path& path::remove_filename() + { + m_pathname.erase(m_parent_path_end()); + return *this; + } + + path & path::replace_extension(const path & source) + { + // erase existing extension if any + size_type pos(m_pathname.rfind(dot)); + if (pos != string_type::npos) + m_pathname.erase(pos); + + // append source extension if any + pos = source.m_pathname.rfind(dot); + if (pos != string_type::npos) + m_pathname += source.c_str() + pos; + + return *this; + } ++ // decomposition -------------------------------------------------------------------//
+ + path path::root_path() const + { + path temp(root_name());+ if (!root_directory().empty()) temp.m_pathname += root_directory().c_str();
+ return temp; + } + + path path::root_name() const + { + iterator itr(begin()); + + return (itr.m_pos != m_pathname.size() + && ( + (itr.m_element.m_pathname.size() > 1 + && is_separator(itr.m_element.m_pathname[0]) + && is_separator(itr.m_element.m_pathname[1]) + ) +# ifdef BOOST_WINDOWS_API+ || itr.m_element.m_pathname[itr.m_element.m_pathname.size()-1] == colon
+# endif + )) + ? itr.m_element + : path(); + } + + path path::root_directory() const + { + size_type pos(root_directory_start(m_pathname, m_pathname.size())); + + return pos == string_type::npos + ? path() + : path(m_pathname.c_str() + pos, m_pathname.c_str() + pos + 1); + } + + path path::relative_path() const + { + iterator itr(begin()); + + for (; itr.m_pos != m_pathname.size() + && (is_separator(itr.m_element.m_pathname[0]) +# ifdef BOOST_WINDOWS_API+ || itr.m_element.m_pathname[itr.m_element.m_pathname.size()-1] == colon
+# endif + ); ++itr) {} + + return path(m_pathname.c_str() + itr.m_pos); + } + + string_type::size_type path::m_parent_path_end() const + { + size_type end_pos(filename_pos(m_pathname, m_pathname.size())); + + bool filename_was_separator(m_pathname.size() + && is_separator(m_pathname[end_pos])); + + // skip separators unless root directory + size_type root_dir_pos(root_directory_start(m_pathname, end_pos)); + for (; + end_pos > 0 + && (end_pos-1) != root_dir_pos + && is_separator(m_pathname[end_pos-1]) + ; + --end_pos) {} + + return (end_pos == 1 && root_dir_pos == 0 && filename_was_separator) + ? string_type::npos + : end_pos; + } + + path path::parent_path() const + { + size_type end_pos(m_parent_path_end()); + return end_pos == string_type::npos + ? path() + : path(m_pathname.c_str(), m_pathname.c_str() + end_pos); + } + + path path::filename() const + { + size_type pos(filename_pos(m_pathname, m_pathname.size())); + return (m_pathname.size() + && pos + && is_separator(m_pathname[pos]) + && is_non_root_separator(m_pathname, pos)) + ? dot_path + : path(m_pathname.c_str() + pos); + } + + path path::stem() const + { + path name(filename()); + if (name == dot_path || name == dot_dot_path) return name; + size_type pos(name.m_pathname.rfind(dot)); + return pos == string_type::npos + ? name + : path(name.m_pathname.c_str(), name.m_pathname.c_str() + pos); + } + + path path::extension() const + { + path name(filename()); + if (name == dot_path || name == dot_dot_path) return path(); + size_type pos(name.m_pathname.rfind(dot)); + return pos == string_type::npos + ? path() + : path(name.m_pathname.c_str() + pos); + } ++ // m_normalize ----------------------------------------------------------------------//
+ + path& path::m_normalize() + { + if (m_pathname.empty()) return *this; + + path temp; + iterator start(begin()); + iterator last(end()); + iterator stop(last--); + for (iterator itr(start); itr != stop; ++itr) + { + // ignore "." except at start and last + if (itr->native().size() == 1 + && (itr->native())[0] == dot + && itr != start + && itr != last) continue; + + // ignore a name and following ".." + if (!temp.empty() + && itr->native().size() == 2 + && (itr->native())[0] == dot + && (itr->native())[1] == dot) // dot dot + { + string_type lf(temp.filename().native()); + if (lf.size() > 0 + && (lf.size() != 1 + || (lf[0] != dot + && lf[0] != separator)) + && (lf.size() != 2 + || (lf[0] != dot + && lf[1] != dot +# ifdef BOOST_WINDOWS_API + && lf[1] != colon +# endif + ) + ) + ) + { + temp.remove_filename(); + // if not root directory, must also remove "/" if any + if (temp.m_pathname.size() > 0 + && temp.m_pathname[temp.m_pathname.size()-1] + == separator) + { + string_type::size_type rds(+ root_directory_start(temp.m_pathname, temp.m_pathname.size()));
+ if (rds == string_type::npos + || rds != temp.m_pathname.size()-1) + { temp.m_pathname.erase(temp.m_pathname.size()-1); } + } + + iterator next(itr); + if (temp.empty() && ++next != stop + && next == last && *last == dot_path) temp /= dot_path; + continue; + } + } + + temp /= *itr; + }; + + if (temp.empty()) temp /= dot_path; + m_pathname = temp.m_pathname; + return *this; + } + +} // namespace filesystem3 +} // namespace boost + +//--------------------------------------------------------------------------------------//+// // +// class path helpers implementation // +// //
+//--------------------------------------------------------------------------------------// + +namespace +{ ++ // is_non_root_separator -------------------------------------------------//
+ + bool is_non_root_separator(const string_type & str, size_type pos) + // pos is position of the separator + { + BOOST_ASSERT(!str.empty() && is_separator(str[pos]) + && "precondition violation"); + + // subsequent logic expects pos to be for leftmost slash of a set + while (pos > 0 && is_separator(str[pos-1])) + --pos; + + return pos != 0 + && (pos <= 2 || !is_separator(str[1]) + || str.find_first_of(separators, 2) != pos) +# ifdef BOOST_WINDOWS_API + && (pos !=2 || str[1] != colon) +# endif + ; + } ++ // filename_pos --------------------------------------------------------------------//
+ + size_type filename_pos(const string_type & str,+ size_type end_pos) // end_pos is past-the-end position
+ // return 0 if str itself is filename (or empty) + { + // case: "//" + if (end_pos == 2 + && is_separator(str[0]) + && is_separator(str[1])) return 0; + + // case: ends in "/" + if (end_pos && is_separator(str[end_pos-1])) + return end_pos-1; + + // set pos to start of last element + size_type pos(str.find_last_of(separators, end_pos-1)); + +# ifdef BOOST_WINDOWS_API + if (pos == string_type::npos) + pos = str.find_last_of(colon, end_pos-2); +# endif ++ return (pos == string_type::npos // path itself must be a filename (or empty)
+ || (pos == 1 && is_separator(str[0]))) // or net + ? 0 // so filename is entire string + : pos + 1; // or starts after delimiter + } ++ // root_directory_start ------------------------------------------------------------//
+ + size_type root_directory_start(const string_type & path, size_type size) + // return npos if no root_directory found + { + +# ifdef BOOST_WINDOWS_API + // case "c:/" + if (size > 2 + && path[1] == colon + && is_separator(path[2])) return 2; +# endif + + // case "//" + if (size == 2 + && is_separator(path[0]) + && is_separator(path[1])) return string_type::npos; + + // case "//net {/}" + if (size > 3 + && is_separator(path[0]) + && is_separator(path[1]) + && !is_separator(path[2])) + { + string_type::size_type pos(path.find_first_of(separators, 2)); + return pos < size ? pos : string_type::npos; + } + + // case "/" + if (size > 0 && is_separator(path[0])) return 0; + + return string_type::npos; + } ++ // first_element --------------------------------------------------------------------//
+ // sets pos and len of first element, excluding extra separators + // if src.empty(), sets pos,len, to 0,0. + + void first_element( + const string_type & src, + size_type & element_pos, + size_type & element_size, + size_type size +) + { + if (size == string_type::npos) size = src.size(); + element_pos = 0; + element_size = 0; + if (src.empty()) return; + + string_type::size_type cur(0); + + // deal with // [network] + if (size >= 2 && is_separator(src[0]) + && is_separator(src[1]) + && (size == 2 + || !is_separator(src[2]))) + { + cur += 2; + element_size += 2; + } + + // leading (not non-network) separator + else if (is_separator(src[0])) + { + ++element_size; + // bypass extra leading separators + while (cur+1 < size + && is_separator(src[cur+1])) + { + ++cur; + ++element_pos; + } + return; + } + + // at this point, we have either a plain name, a network name, + // or (on Windows only) a device name + + // find the end + while (cur < size +# ifdef BOOST_WINDOWS_API + && src[cur] != colon +# endif + && !is_separator(src[cur])) + { + ++cur; + ++element_size; + } + +# ifdef BOOST_WINDOWS_API + if (cur == size) return; + // include device delimiter + if (src[cur] == colon) + { ++element_size; } +# endif + + return; + } + +} // unnammed namespace + +//--------------------------------------------------------------------------------------//+// // +// class path::iterator implementation // +// //
+//--------------------------------------------------------------------------------------// + +namespace boost +{ +namespace filesystem3 +{ + + path::iterator path::begin() const + { + iterator itr; + itr.m_path_ptr = this; + size_type element_size; + first_element(m_pathname, itr.m_pos, element_size); + itr.m_element = m_pathname.substr(itr.m_pos, element_size); + if (itr.m_element.m_pathname == preferred_separator_string)+ itr.m_element.m_pathname = separator_string; // needed for Windows, harmless on POSIX
+ return itr; + } + + path::iterator path::end() const + { + iterator itr; + itr.m_path_ptr = this; + itr.m_pos = m_pathname.size(); + return itr; + } + + void path::m_path_iterator_increment(path::iterator & it) + {+ BOOST_ASSERT(it.m_pos < it.m_path_ptr->m_pathname.size() && "path::basic_iterator increment past end()");
+ + // increment to position past current element + it.m_pos += it.m_element.m_pathname.size(); + + // if end reached, create end basic_iterator + if (it.m_pos == it.m_path_ptr->m_pathname.size()) + { + it.m_element.clear(); + return; + } ++ // both POSIX and Windows treat paths that begin with exactly two separators specially
+ bool was_net(it.m_element.m_pathname.size() > 2 + && is_separator(it.m_element.m_pathname[0]) + && is_separator(it.m_element.m_pathname[1]) + && !is_separator(it.m_element.m_pathname[2])); + + // process separator (Windows drive spec is only case not a separator) + if (is_separator(it.m_path_ptr->m_pathname[it.m_pos])) + { + // detect root directory + if (was_net +# ifdef BOOST_WINDOWS_API + // case "c:/"+ || it.m_element.m_pathname[it.m_element.m_pathname.size()-1] == colon
+# endif + ) + { + it.m_element.m_pathname = separator; + return; + } + + // bypass separators + while (it.m_pos != it.m_path_ptr->m_pathname.size() + && is_separator(it.m_path_ptr->m_pathname[it.m_pos])) + { ++it.m_pos; } + + // detect trailing separator, and treat it as ".", per POSIX spec + if (it.m_pos == it.m_path_ptr->m_pathname.size() + && is_non_root_separator(it.m_path_ptr->m_pathname, it.m_pos-1)) + { + --it.m_pos; + it.m_element = dot_path; + return; + } + } + + // get next element+ size_type end_pos(it.m_path_ptr->m_pathname.find_first_of(separators, it.m_pos)); + if (end_pos == string_type::npos) end_pos = it.m_path_ptr->m_pathname.size(); + it.m_element = it.m_path_ptr->m_pathname.substr(it.m_pos, end_pos - it.m_pos);
+ } + + void path::m_path_iterator_decrement(path::iterator & it) + { + BOOST_ASSERT(it.m_pos && "path::iterator decrement past begin()"); + + size_type end_pos(it.m_pos); + + // if at end and there was a trailing non-root '/', return "." + if (it.m_pos == it.m_path_ptr->m_pathname.size() + && it.m_path_ptr->m_pathname.size() > 1 + && is_separator(it.m_path_ptr->m_pathname[it.m_pos-1]) + && is_non_root_separator(it.m_path_ptr->m_pathname, it.m_pos-1) + ) + { + --it.m_pos; + it.m_element = dot_path; + return; + } ++ size_type root_dir_pos(root_directory_start(it.m_path_ptr->m_pathname, end_pos));
+ + // skip separators unless root directory + for ( + ; + end_pos > 0 + && (end_pos-1) != root_dir_pos + && is_separator(it.m_path_ptr->m_pathname[end_pos-1]) + ; + --end_pos) {} + + it.m_pos = filename_pos(it.m_path_ptr->m_pathname, end_pos);+ it.m_element = it.m_path_ptr->m_pathname.substr(it.m_pos, end_pos - it.m_pos);
+ if (it.m_element.m_pathname == preferred_separator_string)+ it.m_element.m_pathname = separator_string; // needed for Windows, harmless on POSIX
+ } + +} // namespace filesystem3 +} // namespace boost + +//--------------------------------------------------------------------------------------//+// // +// detail helpers // +// //
+//--------------------------------------------------------------------------------------// + +namespace +{ ++ //------------------------------------------------------------------------------------// + // locale helpers // + //------------------------------------------------------------------------------------//
++ // std::locale construction can throw (if LC_MESSAGES is wrong, for example),
+ // so a static at function scope is used to ensure that exceptions can be + // caught. (A previous version was at namespace scope, so initialization + // occurred before main(), preventing exceptions from being caught.) + + std::locale default_locale() + { +# ifdef BOOST_WINDOWS_API + std::locale global_loc = std::locale(); + std::locale loc(global_loc, new windows_file_codecvt); + return loc; + +# elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)+ // "All BSD system functions expect their string parameters to be in UTF-8 encoding + // and nothing else." http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/FileEncodings.html
+ //+ // "The kernel will reject any filename that is not a valid UTF-8 string, and it will + // even be normalized (to Unicode NFD) before stored on disk, at least when using HFS. + // The right way to deal with it would be to always convert the filename to UTF-8 + // before trying to open/create a file." http://lists.apple.com/archives/unix-porting/2007/Sep/msg00023.html
+ //+ // "How a file name looks at the API level depends on the API. Current Carbon APIs + // handle file names as an array of UTF-16 characters; POSIX ones handle them as an + // array of UTF-8, which is why UTF-8 works well in Terminal. How it's stored on disk + // depends on the disk format; HFS+ uses UTF-16, but that's not important in most + // cases." http://lists.apple.com/archives/applescript-users/2002/Sep/msg00319.html
+ // + // Many thanks to Peter Dimov for digging out the above references! + std::locale global_loc = std::locale();+ std::locale loc(global_loc, new boost::filesystem::detail::utf8_codecvt_facet);
+ return loc; + +# else + // ISO C calls this "the locale-specific native environment": + return std::locale(""); + +# endif + } + + std::locale & path_locale() + { + static std::locale loc(default_locale()); + return loc; + } + +} // unnamed namespace + +//--------------------------------------------------------------------------------------//+// path::imbue implementation //
+//--------------------------------------------------------------------------------------// + +namespace boost +{ +namespace filesystem3 +{ + + const path::codecvt_type *& + path::wchar_t_codecvt_facet() + { + static const std::codecvt<wchar_t, char, std::mbstate_t> * + facet( + &std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> > + (path_locale())); + return facet; + } + + std::locale path::imbue(const std::locale & loc) + { + std::locale temp(path_locale()); + path_locale() = loc; + wchar_t_codecvt_facet() = &std::use_facet + <std::codecvt<wchar_t, char, std::mbstate_t> >(path_locale()); + return temp; + } + +} // namespace filesystem3 +} // namespace boost + +#endif // no wide character support ======================================= ***Additional files exist in this changeset.***