From: Glen Knowles (gknowles_at_[hidden])
Date: 2002-11-25 21:14:11


I'm dealing with filesystem paths and urls and the way we ended up
implementing it is with the following functions (we are not currently using
boost::filesystem, these are from an internal library):

current_directory() - returns the current directory (and drive if windows)

make_absolute() - prepends current drive if no drive is defined, inserts
current directory after the drive if it is not an absolute path

is_absolute() - true if the directory (sans drive) starts with a / (c:/, /,
/blah are absolute; c:blah, blah, ../blah are not)

resolve(base, rel) - returns a path that is 'rel' resolved relative to
'base' according to the following table:
base rel result
-----------------------------
base rel base/rel
base /rel /rel
base c:rel ... throws exception
base c:/rel c:/rel
/base rel /base/rel
/base /rel /rel
/base c:rel ... throws exception
/base c:/rel c:/rel
c:base rel c:base/rel
c:base /rel c:/rel
c:base c:rel c:base/rel
c:base c:/rel c:/rel
c:base a:rel ... throws exception
c:base a:/rel a:/rel
c:/base rel c:/base/rel
c:/base /rel c:/rel
c:/base c:rel c:/base/rel
c:/base c:/rel c:/rel
c:/base a:rel ... throws exception
c:/base a:/rel a:/rel

This attempts to follow the same phliosophy as the url resolution rules and
has worked out well so far. During the review I argued for make_absolute to
behave like resolve(current_directory(), rel) but now I believe that two
separate functions is the best way to do this.

Just wanted to get this off before it was too late,
Glen