Opened 18 years ago

Closed 17 years ago

#361 closed Patches (Rejected)

patch for boost::filesystem

Reported by: fotzor Owned by: beman_dawes
Milestone: Component: None
Version: None Severity:
Keywords: Cc:

Description

hi,
when you try to get the branch path of this
"c:\\some_dir\\some_file.txt"
under windows the branch path should be "c:\\some_dir".
what is returned instead is "c:" which isn't correct.
so here's the fix:

in path_posix_windows.cpp:

  std::string::size_type leaf_pos( const std::string & str,
    std::string::size_type end_pos ) // end_pos is
past-the-end position
  // return 0 if str itself is leaf (or empty) 
  {
    if ( end_pos && str[end_pos-1] == '/' ) return
end_pos-1;
    
    std::string::size_type pos( str.find_last_of( '/',
end_pos-1 ) );
#   ifdef BOOST_WINDOWS
	if ( pos == std::string::npos ) pos =
str.find_last_of( '\\', end_pos-1 );                 //
ADDED
    if ( pos == std::string::npos ) pos =
str.find_last_of( ':', end_pos-2 );
#   endif

    return ( pos == std::string::npos // path itself
must be a leaf (or empty)
#     ifdef BOOST_WINDOWS
      || (pos == 1 && (str[0] == '/' || str[0] ==
'\\')) // or share    // ADDED
#     endif
      ) ? 0 // so leaf is entire string
        : pos + 1; // or starts after delimiter
  }


mfg steven

Change History (3)

comment:1 by fotzor, 18 years ago

Logged In: YES 
user_id=1124235

i forgot something...
in branch_path() you must also change the condition of the
if to:

if ( end_pos && (m_path[end_pos-1] == '/' ||
m_path[end_pos-1] == '\\')
        && !detail::is_absolute_root( m_path, end_pos ) )
--end_pos;

else it doesn't work proper. perhaps there are other
functions depending on leaf_pos() that must be adjusted as well

comment:2 by biochimia, 17 years ago

Logged In: YES 
user_id=840777

The claim appears to be wrong. The test program below works
with Boost 1.32, the last release at the time of the
original report. Also works with 1.33.1 and the i18n update
in current CVS.

Exploring a bit deeper it seems the OP might be using
no_check for the name check, in which case '\\' is not
necessarily a valid separator character according to the
portable grammar.

The i18n branch fixes the issue even when using no_check.

I'm setting the patch as invalid. I suppose it could be
closed/deleted.

#include <boost/filesystem/path.hpp>
#include <cassert>

namespace fs = boost::filesystem;

int main()
{
    fs::path const
        path1("c:\\some_dir\\some_file.txt", fs::native),
        path2("c:\\some_dir", fs::native),
        path3("c:", fs::native);

    assert(path1.branch_path() == path2);
    assert(path1.branch_path() != path3);
}

comment:3 by beman_dawes, 17 years ago

Status: assignedclosed
Logged In: YES 
user_id=51042

Could not reproduce. Added path regression test cases. They
pass. Closing without action.
Note: See TracTickets for help on using tickets.