tools/inspect/long_name_check.cpp
// long_name_check implementation ------------------------------------------//
// Copyright Beman Dawes 2002.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include "long_name_check.hpp"
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/exception.hpp>
#include <boost/bind.hpp>
#include <boost/next_prior.hpp>
#include <locale>
#include <algorithm>
namespace { namespace aux {
bool starts_with_nonalpha( std::string const& x )
{
return !std::isalpha( *x.begin(), std::locale::classic() )
&& *x.begin() != '_'
&& x != ".cvsignore"
;
}
bool contains_dot( std::string const& x )
{
return x.find( '.' ) != std::string::npos;
}
}}
namespace boost
{
namespace inspect
{
long_name_check::long_name_check() : m_long_name_errors(0) {}
void long_name_check::inspect(
const string & library_name,
const path & full_path )
{
std::string const leaf( full_path.leaf() );
if ( leaf.size() > 31 )
{
++m_long_name_errors;
error( library_name, full_path, "filename > 31 chars" );
}
if ( std::count( leaf.begin(), leaf.end(), '.' ) > 1 )
{
++m_long_name_errors;
error( library_name, full_path, "filename contains more than one dot character ('.')" );
}
if ( *leaf.rbegin() == '.' )
{
++m_long_name_errors;
error( library_name, full_path, "filename ends with the dot character ('.')" );
}
path const relative_path( relative_to( full_path, filesystem::initial_path() ), &filesystem::no_check );
if ( std::find_if( relative_path.begin(), relative_path.end(), boost::bind( &aux::starts_with_nonalpha, _1 ) )
!= relative_path.end() )
{
++m_long_name_errors;
error( library_name, full_path, "leading character of one of the path compontents is not alphabetic" );
}
if ( std::find_if( relative_path.begin(), boost::prior( relative_path.end() )
, boost::bind( &aux::contains_dot, _1 ) ) != boost::prior( relative_path.end() ) )
{
++m_long_name_errors;
error( library_name, full_path, "directory name contains the dot character ('.')" );
}
if ( std::distance( relative_path.begin(), boost::prior( relative_path.end() ) ) >= 8 )
{
++m_long_name_errors;
error( library_name, full_path, "file's directory depth will exceed 8 levels if placed on a CD" );
}
if ( relative_path.string().size() > ( 100 - string( "boost_X_XX_X/" ).size() ) )
{
++m_long_name_errors;
error( library_name, full_path, "file path will be > 100 chars if placed on a CD" );
}
if (relative_path.leaf() != ".cvsignore")
{
try
{
path const check_portability( relative_path.string(), &filesystem::portable_name );
}
catch ( filesystem::filesystem_error const& )
{
++m_long_name_errors;
error( library_name, full_path, "nonportable path" );
}
}
}
long_name_check::~long_name_check()
{
std::cout << " " << m_long_name_errors << " " << desc() << '\n';
}
} // namespace inspect
} // namespace boost