55 lines
1.3 KiB
C++
55 lines
1.3 KiB
C++
#ifndef CPPPATH_H
|
|
#define CPPPATH_H
|
|
|
|
// cpppath.h
|
|
// 5/7/2014 jichi
|
|
|
|
#include <cstddef> // for size_t
|
|
|
|
enum : char { cpp_pathsep_unix = '/' , cpp_pathsep_win = '\\' };
|
|
|
|
// basename
|
|
|
|
template <class charT>
|
|
inline const charT *cpp_basic_basename(const charT *s)
|
|
{
|
|
const charT *p = s;
|
|
//if (s) // not checked
|
|
for (; *s; s++)
|
|
if (*s == cpp_pathsep_unix || *s == cpp_pathsep_win)
|
|
p = s + 1;
|
|
return p;
|
|
}
|
|
|
|
//if (const char *r = ::strrchr(s, pathsep))
|
|
// return r + 1; // skip the path seperator
|
|
//else
|
|
// return s;
|
|
inline const char *cpp_basename(const char *s) { return cpp_basic_basename<char>(s); }
|
|
|
|
//if (const wchar_t *r = ::wcsrchr(s, pathsep))
|
|
// return r + 1; // skip the path seperator
|
|
//else
|
|
// return s;
|
|
inline const wchar_t *cpp_wbasename(const wchar_t *s) { return cpp_basic_basename<wchar_t>(s); }
|
|
|
|
// dirmame
|
|
|
|
/// Return the length so that s[len] == pathsep
|
|
template <class charT>
|
|
inline size_t cpp_basic_dirlen(const charT *s)
|
|
{
|
|
const charT *p = s,
|
|
*t = s;
|
|
//if (s) // not checked
|
|
for (; *s; s++)
|
|
if (*s == cpp_pathsep_unix || *s == cpp_pathsep_win)
|
|
p = s + 1;
|
|
return p - t;
|
|
}
|
|
|
|
inline size_t cpp_wdirlen(const char *s) { return cpp_basic_dirlen<char>(s); }
|
|
inline size_t cpp_wdirlen(const wchar_t *s) { return cpp_basic_dirlen<wchar_t>(s); }
|
|
|
|
#endif // CPPPATH_H
|