• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  Boost Filesystem recurse_dir_iter_test.cpp  ----------------------------------------//
2 
3 //  Copyright Beman Dawes 2014.
4 
5 //  Distributed under the Boost Software License, Version 1.0.
6 //  See http://www.boost.org/LICENSE_1_0.txt
7 
8 //  Library home page: http://www.boost.org/libs/filesystem
9 
10 #include <boost/config/warning_disable.hpp>
11 
12 //  See deprecated_test for tests of deprecated features
13 #ifndef BOOST_FILESYSTEM_NO_DEPRECATED
14 #  define BOOST_FILESYSTEM_NO_DEPRECATED
15 #endif
16 #ifndef BOOST_SYSTEM_NO_DEPRECATED
17 #  define BOOST_SYSTEM_NO_DEPRECATED
18 #endif
19 
20 #include <boost/filesystem/operations.hpp>
21 
22 #include <boost/config.hpp>
23 # if defined( BOOST_NO_STD_WSTRING )
24 #   error Configuration not supported: Boost.Filesystem V3 and later requires std::wstring support
25 # endif
26 
27 #include <boost/cerrno.hpp>
28 #include <boost/core/lightweight_test.hpp>
29 #include <boost/detail/lightweight_main.hpp>
30 
31 namespace fs = boost::filesystem;
32 using boost::system::error_code;
33 using boost::system::system_category;
34 using boost::system::system_error;
35 
36 #include <iostream>
37 
38 using std::cout;
39 using std::endl;
40 
41 #ifdef BOOST_WINDOWS_API
42 # include <windows.h>
43 #endif
44 namespace
45 {
46   typedef int errno_t;
47   std::string platform(BOOST_PLATFORM);
48   bool report_throws = false;
49   bool cleanup = true;
50   bool skip_long_windows_tests = false;
51   unsigned short language_id;  // 0 except for Windows
52 
53 } // unnamed namespace
54 
55 //------------------------------------------------------------------------------------//
56 //                                                                                    //
57 //                                    main                                            //
58 //                                                                                    //
59 //------------------------------------------------------------------------------------//
60 
cpp_main(int argc,char * argv[])61 int cpp_main(int argc, char* argv[])
62 {
63   // document state of critical macros
64 #ifdef BOOST_POSIX_API
65   cout << "BOOST_POSIX_API is defined\n";
66 #endif
67 #ifdef BOOST_WINDOWS_API
68   cout << "BOOST_WINDOWS_API is defined\n";
69 #endif
70 
71   for (; argc > 1; --argc, ++argv)
72   {
73     //if (*argv[1]=='-' && *(argv[1]+1)=='t')
74     //  report_throws = true;
75     //else if (*argv[1]=='-' && *(argv[1]+1)=='x')
76     //  cleanup = false;
77     //else if (*argv[1]=='-' && *(argv[1]+1)=='w')
78     //  skip_long_windows_tests = true;
79   }
80 
81   // The choice of platform to test is made at runtime rather than compile-time
82   // so that compile errors for all platforms will be detected even though
83   // only the current platform is runtime tested.
84 # if defined(BOOST_POSIX_API)
85   platform = "POSIX";
86 # elif defined(BOOST_WINDOWS_API)
87   platform = "Windows";
88 #   if !defined(__MINGW32__) && !defined(__CYGWIN__)
89   language_id = ::GetUserDefaultUILanguage();
90 #   else
91   language_id = 0x0409; // Assume US English
92 #   endif
93 # else
94 #   error neither BOOST_POSIX_API nor BOOST_WINDOWS_API is defined. See boost/system/api_config.hpp
95 # endif
96   cout << "API is " << platform << endl;
97   cout << "initial_path() is " << fs::initial_path() << endl;
98   fs::path ip = fs::initial_path();
99 
100   for (fs::path::const_iterator it = ip.begin(); it != ip.end(); ++it)
101   {
102     if (it != ip.begin())
103       cout << ", ";
104     cout << *it;
105   }
106   cout << endl;
107 
108   //  From the root, walk the directory tree looking for a permissions error
109 
110   fs::recursive_directory_iterator it("/");
111   fs::recursive_directory_iterator end_it;
112 
113   //  The increment function has an invarient that it always makes progress,
114   //  so even if an error occurs this loop will eventually terminate.
115 
116   while (it != end_it)
117   {
118     error_code ec;
119     fs::path init_path = it->path();
120     it.increment(ec);
121     if (ec)
122     {
123       cout << "initial path: " << init_path << endl;
124       cout << "error_code: " << ec.value() << " with msg: " << ec.message() << endl;
125       if (it != end_it)
126         cout << "post-increment path: " << it->path() << endl;
127     }
128   }
129 
130   cout << "returning from main()" << endl;
131   return ::boost::report_errors();
132 } // main
133