1 // path_name_check implementation ------------------------------------------// 2 3 // Copyright Beman Dawes 2002. 4 // Copyright Gennaro Prota 2006. 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // (See accompanying file LICENSE_1_0.txt or copy at 8 // http://www.boost.org/LICENSE_1_0.txt) 9 10 #include "path_name_check.hpp" 11 12 #include "boost/filesystem/operations.hpp" 13 #include "boost/lexical_cast.hpp" 14 15 #include <string> 16 #include <algorithm> 17 #include <cctype> 18 #include <cstring> 19 20 using std::string; 21 22 namespace 23 { 24 const char allowable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-."; 25 const char initial_char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"; 26 } 27 28 namespace boost 29 { 30 namespace inspect 31 { 32 33 file_name_check()34 file_name_check::file_name_check() : m_name_errors(0) {} 35 inspect(const string & library_name,const path & full_path)36 void file_name_check::inspect( 37 const string & library_name, 38 const path & full_path ) 39 { 40 string::size_type pos; 41 42 // called for each file and directory, so only the leaf need be tested 43 string const leaf( full_path.leaf().string() ); 44 45 // includes only allowable characters 46 if ( (pos = leaf.find_first_not_of( allowable )) != string::npos ) 47 { 48 ++m_name_errors; 49 error( library_name, full_path, string(name()) 50 + " file or directory name contains unacceptable character '" 51 + leaf[pos] + "'" ); 52 } 53 54 // allowable initial character 55 if ( std::strchr( initial_char, leaf[0] ) == 0 ) 56 { 57 ++m_name_errors; 58 error( library_name, full_path, string(name()) 59 + " file or directory name begins with an unacceptable character" ); 60 } 61 62 // rules for dot characters differ slightly for directories and files 63 if ( filesystem::is_directory( full_path ) ) 64 { 65 if ( std::strchr( leaf.c_str(), '.' ) ) 66 { 67 ++m_name_errors; 68 error( library_name, full_path, string(name()) 69 + " directory name contains a dot character ('.')" ); 70 } 71 } 72 //else // not a directory 73 //{ 74 // // includes at most one dot character 75 // const char * first_dot = std::strchr( leaf.c_str(), '.' ); 76 // if ( first_dot && std::strchr( first_dot+1, '.' ) ) 77 // { 78 // ++m_name_errors; 79 // error( library_name, full_path, string(name()) 80 // + " file name with more than one dot character ('.')" ); 81 // } 82 //} 83 84 // the path, including a presumed root, does not exceed the maximum size 85 path const relative_path( relative_to( full_path, search_root_path() ) ); 86 const unsigned max_relative_path = 207; // ISO 9660:1999 sets this limit 87 const string generic_root( "boost_X_XX_X/" ); 88 if ( relative_path.string().size() > 89 ( max_relative_path - generic_root.size() ) ) 90 { 91 ++m_name_errors; 92 error( library_name, full_path, 93 string(name()) 94 + " path will exceed " 95 + boost::lexical_cast<string>(max_relative_path) 96 + " characters in a directory tree with a root in the form " 97 + generic_root + ", and this exceeds ISO 9660:1999 limit of 207" ) 98 ; 99 } 100 101 } 102 ~file_name_check()103 file_name_check::~file_name_check() 104 { 105 std::cout << " " << m_name_errors << " " << desc() << line_break(); 106 } 107 108 109 } // namespace inspect 110 } // namespace boost 111