@@ -1131,13 +1131,29 @@ namespace path
11311131 // ////////////////////////////////////////////////////////////////////////////////////////////
11321132 // /
11331133 // /
1134- std::string abspath (const std::string & path, const std::string & cwd)
1134+
1135+ std::string abspath_nt (const std::string & path, const std::string & cwd)
1136+ {
1137+ std::string p = path;
1138+ if (!isabs_nt (p)) p = join_nt (cwd, p);
1139+ return normpath_nt (p);
1140+ }
1141+
1142+ std::string abspath_posix (const std::string & path, const std::string & cwd)
11351143 {
11361144 std::string p = path;
1137- if (!isabs (p)) p = join (cwd, p);
1138- return normpath (p);
1145+ if (!isabs_posix (p)) p = join_posix (cwd, p);
1146+ return normpath_posix (p);
11391147 }
11401148
1149+ std::string abspath (const std::string & path, const std::string & cwd)
1150+ {
1151+ #ifdef WINDOWS
1152+ return abspath_nt (path, cwd);
1153+ #else
1154+ return abspath_posix (path, cwd);
1155+ #endif
1156+ }
11411157
11421158
11431159 // ////////////////////////////////////////////////////////////////////////////////////////////
@@ -1372,19 +1388,51 @@ namespace path
13721388 // /
13731389 // /
13741390
1375- std::string basename (const std::string & path)
1391+ std::string basename_nt (const std::string & path)
13761392 {
13771393 std::string head, tail;
1378- split (head, tail, path);
1394+ split_nt (head, tail, path);
13791395 return tail;
13801396 }
13811397
1382- std::string dirname (const std::string & path)
1398+ std::string basename_posix (const std::string & path)
1399+ {
1400+ std::string head, tail;
1401+ split_posix (head, tail, path);
1402+ return tail;
1403+ }
1404+
1405+ std::string basename (const std::string & path)
1406+ {
1407+ #ifdef WINDOWS
1408+ return basename_nt (path);
1409+ #else
1410+ return basename_posix (path);
1411+ #endif
1412+ }
1413+
1414+ std::string dirname_nt (const std::string & path)
1415+ {
1416+ std::string head, tail;
1417+ split_nt (head, tail, path);
1418+ return head;
1419+ }
1420+
1421+ std::string dirname_posix (const std::string & path)
13831422 {
13841423 std::string head, tail;
1385- split (head, tail, path);
1424+ split_posix (head, tail, path);
13861425 return head;
13871426 }
1427+
1428+ std::string dirname (const std::string & path)
1429+ {
1430+ #ifdef WINDOWS
1431+ return dirname_nt (path);
1432+ #else
1433+ return dirname_posix (path);
1434+ #endif
1435+ }
13881436
13891437
13901438 // ////////////////////////////////////////////////////////////////////////////////////////////
@@ -1602,138 +1650,3 @@ namespace path
16021650}// namespace pystring
16031651
16041652
1605- #ifdef PYSTRING_UNITTEST
1606-
1607- #include " unittest.h"
1608-
1609- PYSTRING_ADD_TEST (pystring_os_path, splitdrive)
1610- {
1611- using namespace pystring ::os::path;
1612-
1613- std::string drivespec, pathspec;
1614- splitdrive_posix (drivespec, pathspec, " /Users/test" ); PYSTRING_CHECK_EQUAL (drivespec, " " ); PYSTRING_CHECK_EQUAL (pathspec, " /Users/test" );
1615- splitdrive_nt (drivespec, pathspec, " C:\\ Users\\ test" ); PYSTRING_CHECK_EQUAL (drivespec, " C:" ); PYSTRING_CHECK_EQUAL (pathspec, " \\ Users\\ test" );
1616- splitdrive_nt (drivespec, pathspec, " \\ Users\\ test" ); PYSTRING_CHECK_EQUAL (drivespec, " " ); PYSTRING_CHECK_EQUAL (pathspec, " \\ Users\\ test" );
1617- }
1618-
1619- PYSTRING_ADD_TEST (pystring_os_path, isabs)
1620- {
1621- using namespace pystring ::os::path;
1622-
1623- PYSTRING_CHECK_EQUAL (isabs_posix (" /Users/test" ), true );
1624- PYSTRING_CHECK_EQUAL (isabs_posix (" \\ Users\\ test" ), false );
1625- PYSTRING_CHECK_EQUAL (isabs_posix (" ../Users" ), false );
1626- PYSTRING_CHECK_EQUAL (isabs_posix (" Users" ), false );
1627-
1628- PYSTRING_CHECK_EQUAL (isabs_nt (" C:\\ Users\\ test" ), true );
1629- PYSTRING_CHECK_EQUAL (isabs_nt (" C:/Users" ), true );
1630- PYSTRING_CHECK_EQUAL (isabs_nt (" /Users" ), true );
1631- PYSTRING_CHECK_EQUAL (isabs_nt (" ../Users" ), false );
1632- PYSTRING_CHECK_EQUAL (isabs_nt (" ..\\ Users" ), false );
1633- }
1634-
1635- PYSTRING_ADD_TEST (pystring_os_path, join)
1636- {
1637- using namespace pystring ::os::path;
1638-
1639- PYSTRING_CHECK_EQUAL (join_posix (" a" ," b" ), " a/b" );
1640- PYSTRING_CHECK_EQUAL (join_posix (" /a" ," b" ), " /a/b" );
1641- PYSTRING_CHECK_EQUAL (join_posix (" /a" ," /b" ), " /b" );
1642- PYSTRING_CHECK_EQUAL (join_posix (" a" ," /b" ), " /b" );
1643- PYSTRING_CHECK_EQUAL (join_posix (" //a" ," b" ), " //a/b" );
1644- PYSTRING_CHECK_EQUAL (join_posix (" //a" ," b//" ), " //a/b//" );
1645- PYSTRING_CHECK_EQUAL (join_posix (" ../a" ," /b" ), " /b" );
1646- PYSTRING_CHECK_EQUAL (join_posix (" ../a" ," b" ), " ../a/b" );
1647-
1648- std::vector< std::string > paths;
1649- PYSTRING_CHECK_EQUAL (join_posix (paths), " " );
1650- paths.push_back (" /a" );
1651- PYSTRING_CHECK_EQUAL (join_posix (paths), " /a" );
1652- paths.push_back (" b" );
1653- PYSTRING_CHECK_EQUAL (join_posix (paths), " /a/b" );
1654- paths.push_back (" c/" );
1655- PYSTRING_CHECK_EQUAL (join_posix (paths), " /a/b/c/" );
1656- paths.push_back (" d" );
1657- PYSTRING_CHECK_EQUAL (join_posix (paths), " /a/b/c/d" );
1658- paths.push_back (" /e" );
1659- PYSTRING_CHECK_EQUAL (join_posix (paths), " /e" );
1660-
1661- PYSTRING_CHECK_EQUAL (join_nt (" c:" ," /a" ), " c:/a" );
1662- PYSTRING_CHECK_EQUAL (join_nt (" c:/" ," /a" ), " c:/a" );
1663- PYSTRING_CHECK_EQUAL (join_nt (" c:/a" ," /b" ), " /b" );
1664- PYSTRING_CHECK_EQUAL (join_nt (" c:" ," d:/" ), " d:/" );
1665- PYSTRING_CHECK_EQUAL (join_nt (" c:/" ," d:/" ), " d:/" );
1666- PYSTRING_CHECK_EQUAL (join_nt (" a" ," b" ), " a\\ b" );
1667- PYSTRING_CHECK_EQUAL (join_nt (" \\ a" ," b" ), " \\ a\\ b" );
1668- PYSTRING_CHECK_EQUAL (join_nt (" c:\\ a" ," b" ), " c:\\ a\\ b" );
1669- PYSTRING_CHECK_EQUAL (join_nt (" c:\\ a" ," c:\\ b" ), " c:\\ b" );
1670- PYSTRING_CHECK_EQUAL (join_nt (" ..\\ a" ," b" ), " ..\\ a\\ b" );
1671- }
1672-
1673- PYSTRING_ADD_TEST (pystring_os_path, normpath)
1674- {
1675- using namespace pystring ::os::path;
1676-
1677- PYSTRING_CHECK_EQUAL (normpath_posix (" A//B" ), " A/B" );
1678- PYSTRING_CHECK_EQUAL (normpath_posix (" A/./B" ), " A/B" );
1679- PYSTRING_CHECK_EQUAL (normpath_posix (" A/foo/../B" ), " A/B" );
1680- PYSTRING_CHECK_EQUAL (normpath_posix (" /A//B" ), " /A/B" );
1681- PYSTRING_CHECK_EQUAL (normpath_posix (" //A//B" ), " //A/B" );
1682- PYSTRING_CHECK_EQUAL (normpath_posix (" ///A//B" ), " /A/B" );
1683- PYSTRING_CHECK_EQUAL (normpath_posix (" ../A" ), " ../A" );
1684- PYSTRING_CHECK_EQUAL (normpath_posix (" ../A../" ), " ../A.." );
1685- PYSTRING_CHECK_EQUAL (normpath_posix (" FOO/../A../././B" ), " A../B" );
1686-
1687- PYSTRING_CHECK_EQUAL (normpath_nt (" " ), " ." );
1688- PYSTRING_CHECK_EQUAL (normpath_nt (" A" ), " A" );
1689- PYSTRING_CHECK_EQUAL (normpath_nt (" A./B" ), " A.\\ B" );
1690- PYSTRING_CHECK_EQUAL (normpath_nt (" C:\\ " ), " C:\\ " );
1691- PYSTRING_CHECK_EQUAL (normpath_nt (" C:\\ A" ), " C:\\ A" );
1692- PYSTRING_CHECK_EQUAL (normpath_nt (" C:/A" ), " C:\\ A" );
1693- PYSTRING_CHECK_EQUAL (normpath_nt (" C:/A..\\ " ), " C:\\ A.." );
1694- PYSTRING_CHECK_EQUAL (normpath_nt (" C:/A..\\ ..\\ " ), " C:\\ " );
1695- PYSTRING_CHECK_EQUAL (normpath_nt (" C:\\\\ A" ), " C:\\ A" );
1696- PYSTRING_CHECK_EQUAL (normpath_nt (" C:\\\\\\ A\\\\ B" ), " C:\\ A\\ B" );
1697- }
1698-
1699- PYSTRING_ADD_TEST (pystring_os_path, split)
1700- {
1701- using namespace pystring ::os::path;
1702-
1703- std::string head, tail;
1704- split_posix (head, tail, " " ); PYSTRING_CHECK_EQUAL (head, " " ); PYSTRING_CHECK_EQUAL (tail, " " );
1705- split_posix (head, tail, " /" ); PYSTRING_CHECK_EQUAL (head, " /" ); PYSTRING_CHECK_EQUAL (tail, " " );
1706- split_posix (head, tail, " a" ); PYSTRING_CHECK_EQUAL (head, " " ); PYSTRING_CHECK_EQUAL (tail, " a" );
1707- split_posix (head, tail, " a/" ); PYSTRING_CHECK_EQUAL (head, " a" ); PYSTRING_CHECK_EQUAL (tail, " " );
1708- split_posix (head, tail, " /a" ); PYSTRING_CHECK_EQUAL (head, " /" ); PYSTRING_CHECK_EQUAL (tail, " a" );
1709- split_posix (head, tail, " /a/b/" ); PYSTRING_CHECK_EQUAL (head, " /a/b" ); PYSTRING_CHECK_EQUAL (tail, " " );
1710- split_posix (head, tail, " /a/b" ); PYSTRING_CHECK_EQUAL (head, " /a" ); PYSTRING_CHECK_EQUAL (tail, " b" );
1711-
1712- split_nt (head, tail, " " ); PYSTRING_CHECK_EQUAL (head, " " ); PYSTRING_CHECK_EQUAL (tail, " " );
1713- split_nt (head, tail, " \\ " ); PYSTRING_CHECK_EQUAL (head, " \\ " ); PYSTRING_CHECK_EQUAL (tail, " " );
1714- split_nt (head, tail, " a" ); PYSTRING_CHECK_EQUAL (head, " " ); PYSTRING_CHECK_EQUAL (tail, " a" );
1715- split_nt (head, tail, " a\\ " ); PYSTRING_CHECK_EQUAL (head, " a" ); PYSTRING_CHECK_EQUAL (tail, " " );
1716- split_nt (head, tail, " c:\\ a" ); PYSTRING_CHECK_EQUAL (head, " c:\\ " ); PYSTRING_CHECK_EQUAL (tail, " a" );
1717- split_nt (head, tail, " c:\\ a\\ b" ); PYSTRING_CHECK_EQUAL (head, " c:\\ a" ); PYSTRING_CHECK_EQUAL (tail, " b" );
1718- split_nt (head, tail, " c:\\ a\\ b\\ " ); PYSTRING_CHECK_EQUAL (head, " c:\\ a\\ b" ); PYSTRING_CHECK_EQUAL (tail, " " );
1719- }
1720-
1721- PYSTRING_ADD_TEST (pystring_os_path, splitext)
1722- {
1723- using namespace pystring ::os::path;
1724-
1725- std::string root, ext;
1726- splitext_nt (root, ext, " " ); PYSTRING_CHECK_EQUAL (root, " " ); PYSTRING_CHECK_EQUAL (ext, " " );
1727- splitext_nt (root, ext, " ." ); PYSTRING_CHECK_EQUAL (root, " ." ); PYSTRING_CHECK_EQUAL (ext, " " );
1728- splitext_nt (root, ext, " .foo" ); PYSTRING_CHECK_EQUAL (root, " .foo" ); PYSTRING_CHECK_EQUAL (ext, " " );
1729- splitext_nt (root, ext, " .foo." ); PYSTRING_CHECK_EQUAL (root, " .foo" ); PYSTRING_CHECK_EQUAL (ext, " ." );
1730- splitext_nt (root, ext, " .foo.e" ); PYSTRING_CHECK_EQUAL (root, " .foo" ); PYSTRING_CHECK_EQUAL (ext, " .e" );
1731- splitext_nt (root, ext, " c" ); PYSTRING_CHECK_EQUAL (root, " c" ); PYSTRING_CHECK_EQUAL (ext, " " );
1732- splitext_nt (root, ext, " a_b.c" ); PYSTRING_CHECK_EQUAL (root, " a_b" ); PYSTRING_CHECK_EQUAL (ext, " .c" );
1733- splitext_nt (root, ext, " c:\\ a.b.c" ); PYSTRING_CHECK_EQUAL (root, " c:\\ a.b" ); PYSTRING_CHECK_EQUAL (ext, " .c" );
1734- splitext_nt (root, ext, " c:\\ a_b.c" ); PYSTRING_CHECK_EQUAL (root, " c:\\ a_b" ); PYSTRING_CHECK_EQUAL (ext, " .c" );
1735- }
1736-
1737- #endif
1738-
1739-
0 commit comments