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