|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r50639 - in sandbox/filesystem-v3: boost/filesystem libs/filesystem/src libs/filesystem/test
From: bdawes_at_[hidden]
Date: 2009-01-16 13:40:10
Author: bemandawes
Date: 2009-01-16 13:40:10 EST (Fri, 16 Jan 2009)
New Revision: 50639
URL: http://svn.boost.org/trac/boost/changeset/50639
Log:
Filesystem.v2: work-in-progress; POSIX implementation showing signs of life
Text files modified:
sandbox/filesystem-v3/boost/filesystem/path.hpp | 24 +++++-----
sandbox/filesystem-v3/libs/filesystem/src/path.cpp | 43 ++++++++++++--------
sandbox/filesystem-v3/libs/filesystem/src/portability.cpp | 25 ++++++-----
sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp | 84 ++++++++++++++++++++++++++++++++++++++++
sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp | 10 ++--
5 files changed, 140 insertions(+), 46 deletions(-)
Modified: sandbox/filesystem-v3/boost/filesystem/path.hpp
==============================================================================
--- sandbox/filesystem-v3/boost/filesystem/path.hpp (original)
+++ sandbox/filesystem-v3/boost/filesystem/path.hpp 2009-01-16 13:40:10 EST (Fri, 16 Jan 2009)
@@ -161,7 +161,7 @@
inline void append( const charT * begin, // requires: null termination
string_type & target, system::error_code & ec )
{
- path_traits::append<charT>( begin, 0, target, ec );
+ path_traits::append<charT>( begin, static_cast<const charT *>(0), target, ec );
}
template< class charT > // specialization required
@@ -180,20 +180,20 @@
namespace detail
{
#ifdef BOOST_WINDOWS_API
- typedef std::string extern_string_type;
+ typedef std::string interface_string_type;
#else
- typedef std::wstring extern_string_type;
+ typedef std::wstring interface_string_type;
#endif
- typedef extern_string_type::value_type extern_value_type;
+ typedef interface_string_type::value_type interface_value_type;
BOOST_FILESYSTEM_DECL
- void append( const extern_value_type * begin,
- const extern_value_type * end, // 0 for null terminated MBCS
+ void append( const interface_value_type * begin,
+ const interface_value_type * end, // 0 for null terminated MBCS
path_traits::string_type & target, system::error_code & ec );
BOOST_FILESYSTEM_DECL
- extern_string_type convert_to_string( const path_traits::string_type & src,
+ interface_string_type convert_to_string( const path_traits::string_type & src,
system::error_code & ec );
} // namespace detail
@@ -240,22 +240,22 @@
}
template<>
- inline void append<char>( const detail::extern_value_type * begin,
- const detail::extern_value_type * end,
+ inline void append<detail::interface_value_type>( const detail::interface_value_type * begin,
+ const detail::interface_value_type * end,
string_type & target, system::error_code & ec )
{
detail::append( begin, end, target, ec );
}
template<>
- inline void append<char>( const detail::extern_value_type * begin,
+ inline void append<detail::interface_value_type>( const detail::interface_value_type * begin,
string_type & target, system::error_code & ec )
{
detail::append( begin, 0, target, ec );
}
template<>
- inline detail::extern_string_type convert<std::string>( const string_type & s,
+ inline detail::interface_string_type convert<detail::interface_string_type>( const string_type & s,
system::error_code & ec )
{
return detail::convert_to_string( s, ec );
@@ -508,7 +508,7 @@
// return formatted "as input"
operator const string_type&() const { return m_path; }
- operator const detail::extern_string_type() const
+ operator const detail::interface_string_type() const
{
return detail::convert_to_string( m_path, system::throws );
}
Modified: sandbox/filesystem-v3/libs/filesystem/src/path.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/src/path.cpp (original)
+++ sandbox/filesystem-v3/libs/filesystem/src/path.cpp 2009-01-16 13:40:10 EST (Fri, 16 Jan 2009)
@@ -17,7 +17,10 @@
#include <cstddef>
#include <cstring>
#include <cassert>
-#include <windows.h>
+
+#ifdef BOOST_WINDOWS_PATH
+# include <windows.h>
+#endif
namespace fs = boost::filesystem;
@@ -678,7 +681,7 @@
return loc;
# else
// ISO C calls this "the locale-specific native environment":
- return std::locale loc("");
+ return std::locale("");
# endif
}
@@ -757,12 +760,12 @@
// actual append done here to factor it out from messy buffer management code;
// this function just assumes the buffer is large enough.
inline void do_append(
- const extern_value_type * from, const extern_value_type * from_end,
+ const interface_value_type * from, const interface_value_type * from_end,
value_type * to, value_type * to_end,
string_type & target, error_code & ec )
{
std::mbstate_t state = std::mbstate_t(); // perhaps unneeded, but cuts bug reports
- const extern_value_type * from_next;
+ const interface_value_type * from_next;
value_type * to_next;
if ( wchar_t_codecvt_facet()->APPEND_DIRECTION( state, from, from_end, from_next,
@@ -776,11 +779,15 @@
}
BOOST_FILESYSTEM_DECL
- void append( const extern_value_type * begin, const extern_value_type * end,
+ void append( const interface_value_type * begin, const interface_value_type * end,
string_type & target, error_code & ec )
{
- if ( !end )
- end = begin + std::strlen(begin);
+ if ( !end )
+ {
+ // compute strlen by hand since interface_value_type may not be char
+ end = begin;
+ while (*end) ++end;
+ }
if ( begin == end )
{
@@ -793,7 +800,7 @@
// dynamically allocate a buffer only if source is unusually large
if ( buf_size > default_codecvt_buf_size )
{
- boost::scoped_array< wchar_t > buf( new wchar_t [buf_size] );
+ boost::scoped_array< value_type > buf( new value_type [buf_size] );
do_append( begin, end, buf.get(), buf.get()+buf_size, target, ec );
}
else
@@ -809,12 +816,14 @@
// actual convert done here to factor it out from messy buffer management code;
// this function just assumes the buffer is large enough.
- inline string do_convert( const wchar_t * from, const wchar_t * from_end,
- char * to, char * to_end, error_code & ec )
+ inline interface_string_type do_convert(
+ const value_type * from, const value_type * from_end,
+ interface_value_type * to, interface_value_type * to_end,
+ error_code & ec )
{
std::mbstate_t state = std::mbstate_t(); // perhaps unneeded, but cuts bug reports
- const wchar_t * from_next;
- char * to_next;
+ const value_type * from_next;
+ interface_value_type * to_next;
if ( wchar_t_codecvt_facet()->CONVERT_DIRECTION( state, from, from_end,
from_next, to, to_end, to_next ) != std::codecvt_base::ok )
@@ -823,16 +832,16 @@
throw "convert error handling not implemented yet";
}
if ( &ec != &system::throws ) ec.clear();
- return string( to, to_next );
+ return interface_string_type( to, to_next );
}
BOOST_FILESYSTEM_DECL
- extern_string_type convert_to_string( const string_type & src, error_code & ec )
+ interface_string_type convert_to_string( const string_type & src, error_code & ec )
{
if ( src.empty() )
{
if ( &ec != &system::throws ) ec.clear();
- return std::string();
+ return interface_string_type();
}
// The codecvt length functions may not be implemented, and I don't reall
@@ -845,13 +854,13 @@
// dynamically allocate a buffer only if source is unusually large
if ( buf_size > default_codecvt_buf_size )
{
- boost::scoped_array< char > buf( new extern_value_type [buf_size] );
+ boost::scoped_array< interface_value_type > buf( new interface_value_type [buf_size] );
return do_convert( src.c_str(), src.c_str()+src.size(),
buf.get(), buf.get()+buf_size, ec );
}
else
{
- extern_value_type buf[default_codecvt_buf_size];
+ interface_value_type buf[default_codecvt_buf_size];
return do_convert( src.c_str(), src.c_str()+src.size(), buf, buf+buf_size, ec );
}
}
Modified: sandbox/filesystem-v3/libs/filesystem/src/portability.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/src/portability.cpp (original)
+++ sandbox/filesystem-v3/libs/filesystem/src/portability.cpp 2009-01-16 13:40:10 EST (Fri, 16 Jan 2009)
@@ -69,6 +69,7 @@
BOOST_FILESYSTEM_DECL bool windows_name( const std::string & name )
{
return name.size() != 0
+ && name[0] != ' '
&& name.find_first_of( windows_invalid_chars ) == std::string::npos
&& *(name.end()-1) != ' '
&& (*(name.end()-1) != '.'
@@ -78,12 +79,12 @@
BOOST_FILESYSTEM_DECL bool portable_name( const std::string & name )
{
return
- name.size() == 0
- || name == "."
- || name == ".."
- || (windows_name( name )
- && portable_posix_name( name )
- && name[0] != '.' && name[0] != '-');
+ name.size() != 0
+ && ( name == "."
+ || name == ".."
+ || (windows_name( name )
+ && portable_posix_name( name )
+ && name[0] != '.' && name[0] != '-'));
}
BOOST_FILESYSTEM_DECL bool portable_directory_name( const std::string & name )
@@ -99,12 +100,12 @@
{
std::string::size_type pos;
return
- name == "."
- || name == ".."
- || (portable_name( name )
- && ( (pos = name.find( '.' )) == std::string::npos
- || (name.find( '.', pos+1 )== std::string::npos
- && (pos + 5) > name.length() )))
+ portable_name( name )
+ && name != "."
+ && name != ".."
+ && ( (pos = name.find( '.' )) == std::string::npos
+ || (name.find( '.', pos+1 ) == std::string::npos
+ && (pos + 5) > name.length() ))
;
}
Modified: sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp (original)
+++ sandbox/filesystem-v3/libs/filesystem/test/path_test.cpp 2009-01-16 13:40:10 EST (Fri, 16 Jan 2009)
@@ -1188,6 +1188,89 @@
PATH_CHECK( ".././.", ".././." );
}
+ // name_function_tests ---------------------------------------------------//
+
+ void name_function_tests()
+ {
+ std::cout << "name_function_tests..." << std::endl;
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( "x" ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( "x" ) ) );
+ BOOST_CHECK( fs::portable_name( std::string( "x" ) ) );
+ BOOST_CHECK( fs::portable_directory_name( std::string( "x" ) ) );
+ BOOST_CHECK( fs::portable_file_name( std::string( "x" ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( "." ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( "." ) ) );
+ BOOST_CHECK( fs::portable_name( std::string( "." ) ) );
+ BOOST_CHECK( fs::portable_directory_name( std::string( "." ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( "." ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( ".." ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( ".." ) ) );
+ BOOST_CHECK( fs::portable_name( std::string( ".." ) ) );
+ BOOST_CHECK( fs::portable_directory_name( std::string( ".." ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( ".." ) ) );
+
+ BOOST_CHECK( !fs::native( std::string( "" ) ) );
+ BOOST_CHECK( !fs::portable_posix_name( std::string( "" ) ) );
+ BOOST_CHECK( !fs::windows_name( std::string( "" ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( "" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( "" ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( "" ) ) );
+
+ BOOST_CHECK( !fs::native( std::string( " " ) ) );
+ BOOST_CHECK( !fs::portable_posix_name( std::string( " " ) ) );
+ BOOST_CHECK( !fs::windows_name( std::string( " " ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( " " ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( " " ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( " " ) ) );
+
+ BOOST_CHECK( !fs::portable_posix_name( std::string( ":" ) ) );
+ BOOST_CHECK( !fs::windows_name( std::string( ":" ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( ":" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( ":" ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( ":" ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( "-" ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( "-" ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( "-" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( "-" ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( "-" ) ) );
+
+ BOOST_CHECK( !fs::portable_posix_name( std::string( "foo bar" ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( "foo bar" ) ) );
+ BOOST_CHECK( !fs::windows_name( std::string( " bar" ) ) );
+ BOOST_CHECK( !fs::windows_name( std::string( "foo " ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( "foo bar" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( "foo bar" ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( "foo bar" ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( "foo.bar" ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( "foo.bar" ) ) );
+ BOOST_CHECK( fs::portable_name( std::string( "foo.bar" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( "foo.bar" ) ) );
+ BOOST_CHECK( fs::portable_file_name( std::string( "foo.bar" ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( "foo.barf" ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( "foo.barf" ) ) );
+ BOOST_CHECK( fs::portable_name( std::string( "foo.barf" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( "foo.barf" ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( "foo.barf" ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( ".foo" ) ) );
+ BOOST_CHECK( fs::windows_name( std::string( ".foo" ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( ".foo" ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( ".foo" ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( ".foo" ) ) );
+
+ BOOST_CHECK( fs::portable_posix_name( std::string( "foo." ) ) );
+ BOOST_CHECK( !fs::windows_name( std::string( "foo." ) ) );
+ BOOST_CHECK( !fs::portable_name( std::string( "foo." ) ) );
+ BOOST_CHECK( !fs::portable_directory_name( std::string( "foo." ) ) );
+ BOOST_CHECK( !fs::portable_file_name( std::string( "foo." ) ) );
+ }
+
} // unnamed namespace
//------------------------------------------------------------------------------------//
@@ -1221,6 +1304,7 @@
iterator_tests();
non_member_tests();
exception_tests();
+ name_function_tests();
// verify deprecated names still available
Modified: sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp
==============================================================================
--- sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp (original)
+++ sandbox/filesystem-v3/libs/filesystem/test/path_unit_test.cpp 2009-01-16 13:40:10 EST (Fri, 16 Jan 2009)
@@ -604,11 +604,11 @@
user_string::value_type usr_c_str[] = { 'a', 'b', 'c', 0 };
user_string usr( usr_c_str );
- path p1( usr_c_str );
- CHECK( p1 == path("bcd") );
- CHECK( p1 == "bcd" );
- user_string s1( p1.string<user_string>() );
- CHECK( s1 == usr );
+ //path p1( usr_c_str );
+ //CHECK( p1 == path("bcd") );
+ //CHECK( p1 == "bcd" );
+ //user_string s1( p1.string<user_string>() );
+ //CHECK( s1 == usr );
}
} // unnamed namespace
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk