ultimatepp/uppsrc/Core/Path.h
Mirek Fidler 34ff691308 sizeof(wchar) is changed to 4 (32 bits) to support non BMP unicode characters
This might bring some incompatibilities in the code that expects wchar to be 16 bit, which
  escpecially involves dealing with Win32 (and to lesser extend MacOS) APIs, so if your application
  is doing that, please check all instances of WCHAR (UniChar on MacOS) or even wchar
  especially type casts.

  To support host APIs, char16 is introduced (but there is no 16-bit String varian).

  Use ToSystemCharsetW, FromSystemCharsetW to convert texts to Win32 API.

- Support of drawing non-BMP characters in GUI
- Vastly improved character font replacement code (when drawing characters missing with requested font, replacement font is used)
- Last instances of Win32 ANSI calls (those ending with A) are removed
- UTF handling routines are refactored and their's naming is unified
- RTF is now being able to handle non-BMP characters (RTF is used as clipboard format for RichText)

Other minor changes:

- fixed TryRealloc issue
- improved MemoryCheck
- Removed MemoryAlloc48/MemoryFree48
- In theide Background parsing should less often cause delays in the main thread
2021-12-02 12:03:19 +01:00

351 lines
11 KiB
C++

bool PatternMatch(const char *p, const char *s);
bool PatternMatchMulti(const char *p, const char *s);
const char *GetFileNamePos(const char *path);
const char *GetFileExtPos(const char *path);
bool HasFileExt(const char *path);
bool HasWildcards(const char *path);
bool IsFullPath(const char *path);
String GetFileDirectory(const char *path); // with DIR_SEP at the end
String GetFileFolder(const char *path); // without DIR_SEP at the end, if not Win32 root
String GetFileTitle(const char *path);
String GetFileExt(const char *path);
String GetFileName(const char *path);
String AppendFileName(const String& path, const char *filename);
String WinPath(const char *path);
String UnixPath(const char *path);
#ifdef PLATFORM_WIN32
inline String NativePath(const char *path) { return WinPath(path); }
#endif
#ifdef PLATFORM_POSIX
inline String NativePath(const char *path) { return UnixPath(path); }
#endif
String AppendExt(const char *path, const char *ext);
String ForceExt(const char *path, const char *ext);
String GetFileOnPath(const char *file, const char *paths, bool current = true, const char *curdir = NULL);
#ifndef PLATFORM_WINCE
String GetFullPath(const char *path);
String GetCurrentDirectory();
#endif
#ifdef PLATFORM_POSIX
bool SetCurrentDirectory(const char *path);
#endif
struct FileTime;
int Compare_FileTime(const FileTime& fa, const FileTime& fb);
#ifdef PLATFORM_WIN32
struct FileTime : FILETIME, CompareRelOps<const FileTime&, &Compare_FileTime> {
FileTime() {}
FileTime(const FILETIME& ft) { dwLowDateTime = ft.dwLowDateTime;
dwHighDateTime = ft.dwHighDateTime; }
};
class FindFile : NoCopy {
WIN32_FIND_DATAW data[1];
HANDLE handle;
String pattern;
String path;
bool Next0();
void Close();
public:
bool Search(const char *path);
bool Next();
dword GetAttributes() const { return data->dwFileAttributes; }
String GetName() const;
String GetPath() const;
int64 GetLength() const;
FileTime GetCreationTime() const { return data->ftCreationTime; }
FileTime GetLastAccessTime() const { return data->ftLastAccessTime; }
FileTime GetLastWriteTime() const { return data->ftLastWriteTime; }
bool IsDirectory() const { return GetAttributes() & FILE_ATTRIBUTE_DIRECTORY; }
bool IsFolder() const;
bool IsFile() const { return !IsDirectory(); }
bool IsSymLink() const;
bool IsExecutable() const;
bool IsArchive() const { return GetAttributes() & FILE_ATTRIBUTE_ARCHIVE; }
bool IsCompressed() const { return GetAttributes() & FILE_ATTRIBUTE_COMPRESSED; }
bool IsHidden() const { return GetAttributes() & FILE_ATTRIBUTE_HIDDEN; }
bool IsReadOnly() const { return GetAttributes() & FILE_ATTRIBUTE_READONLY; }
bool IsSystem() const { return GetAttributes() & FILE_ATTRIBUTE_SYSTEM; }
bool IsTemporary() const { return GetAttributes() & FILE_ATTRIBUTE_TEMPORARY; }
operator bool() const { return handle != INVALID_HANDLE_VALUE; }
bool operator++() { return Next(); }
bool operator++(int) { return Next(); }
struct Iterator {
FindFile *ff;
void operator++() { if(!ff->Next()) ff = NULL; }
bool operator!=(const Iterator& b) const { return ff != b.ff; }
const FindFile& operator*() const { return *ff; }
};
Iterator begin() { Iterator h; h.ff = *this ? this : nullptr; return h; }
Iterator end() { Iterator h; h.ff = nullptr; return h; }
FindFile();
FindFile(const char *name);
~FindFile();
};
#endif
#ifdef PLATFORM_POSIX
struct FileTime : CompareRelOps<const FileTime&, &Compare_FileTime>
{
FileTime() {}
FileTime(time_t ft) : ft(ft) {}
operator time_t () const { return ft; }
time_t ft;
};
inline int Compare_FileTime(const FileTime& f, const FileTime& g) { return f.ft < g.ft ? -1 : f.ft > g.ft ? 1 : 0; }
class FindFile : NoCopy {
bool file;
DIR *dir;
mutable bool statis;
mutable struct stat statf;
String path;
String name;
String pattern;
struct stat &Stat() const;
bool CanMode(dword usr, dword grp, dword oth) const;
public:
bool Search(const char *name);
bool Next();
void Close();
dword GetMode() const { return Stat().st_mode; }
String GetName() const { return name; }
String GetPath() const;
int64 GetLength() const { return Stat().st_size; }
FileTime GetLastChangeTime() const { return Stat().st_ctime; }
FileTime GetLastAccessTime() const { return Stat().st_atime; }
FileTime GetLastWriteTime() const { return Stat().st_mtime; }
uid_t GetUid() { return Stat().st_uid; }
gid_t GetGid() { return Stat().st_gid; }
bool CanRead() const { return CanMode(S_IRUSR, S_IRGRP, S_IROTH); }
bool CanWrite() const { return CanMode(S_IWUSR, S_IWGRP, S_IWOTH); }
bool CanExecute() const { return CanMode(S_IXUSR, S_IXGRP, S_IXOTH); }
bool IsReadOnly() const { return CanRead() && !CanWrite(); }
bool IsHidden() const { return *name == '.'; }
bool IsDirectory() const { return S_ISDIR(GetMode()); }
bool IsFolder() const;
bool IsFile() const { return S_ISREG(GetMode()); }
bool IsSymLink() const;
bool IsExecutable() const;
operator bool() const { return file; }
bool operator++() { return Next(); }
bool operator++(int) { return Next(); }
struct Iterator {
FindFile *ff;
void operator++() { if(!ff->Next()) ff = NULL; }
bool operator!=(const Iterator& b) const { return ff != b.ff; }
const FindFile& operator*() const { return *ff; }
};
Iterator begin() { Iterator h; h.ff = *this ? this : nullptr; return h; }
Iterator end() { Iterator h; h.ff = nullptr; return h; }
FindFile() { file = false; dir = NULL; }
FindFile(const char *name);
~FindFile() { Close(); }
};
// POSIX FileTime is unfortunately long int and clashes with Date::operator int()
inline bool operator==(Time a, FileTime b) { return a == Time(b); }
inline bool operator!=(Time a, FileTime b) { return a != Time(b); }
inline bool operator==(FileTime a, Time b) { return Time(a) == b; }
inline bool operator!=(FileTime a, Time b) { return Time(a) != b; }
#endif
int64 GetFileLength(const char *path);
bool FileExists(const char *path);
bool DirectoryExists(const char *path);
struct Time;
FileTime GetFileTime(const char *path);
Time FileGetTime(const char *path);
bool SetFileTime(const char *path, FileTime ft);
bool FileSetTime(const char *path, Time time);
FileTime TimeToFileTime(Time time);
bool FileCopy(const char *oldpath, const char *newpath);
bool FileMove(const char *oldpath, const char *newpath);
bool FileDelete(const char *path);
#ifdef PLATFORM_POSIX
bool DirectoryCreate(const char *path, int mode = 0755);
bool RealizeDirectory(const String& path, int mode = 0755);
bool RealizePath(const String& path, int mode = 0755);
#else
bool DirectoryCreate(const char *path);
bool RealizeDirectory(const String& path);
bool RealizePath(const String& path);
#endif
bool DirectoryDelete(const char *path);
String NormalizePath(const char *path, const char *currdir);
String NormalizePath(const char *path);
bool PathIsEqual(const char *p1, const char *p2);
#ifdef PLATFORM_POSIX
inline bool DeleteFile(const char *fn) { return unlink(fn) == 0; }
#endif
bool DeleteFolderDeep(const char *dir, bool rdonly = false);
#ifndef PLATFORM_WINCE
String GetTempPath();
String GetTempFileName(const char *prefix = NULL);
#endif
String GetSymLinkPath(const char *linkpath);
template <class T> class Array;
template <class T> class Vector;
enum {
FINDALLFILES = 1,
FINDALLFOLDERS = 2,
};
Vector<String> FindAllPaths(const String& dir, const char *patterns = "*", dword opt = FINDALLFILES);
class FileSystemInfo {
public:
enum
{
ROOT_UNKNOWN = 0,
ROOT_NO_ROOT_DIR = 1,
ROOT_REMOVABLE = 2,
ROOT_FIXED = 3,
ROOT_REMOTE = 4,
ROOT_CDROM = 5,
ROOT_RAMDISK = 6,
ROOT_NETWORK = 7,
ROOT_COMPUTER = 8,
};
enum
{
STYLE_WIN32 = 0x0001,
STYLE_POSIX = 0x0002,
};
struct FileInfo
{
FileInfo();
operator bool () const { return !IsNull(filename); }
String filename;
String msdos_name;
String root_desc;
int64 length;
Time last_access_time;
Time last_write_time;
Time creation_time;
bool read_only;
bool is_directory;
bool is_folder;
bool is_file;
bool is_symlink;
bool is_archive;
bool is_compressed;
bool is_hidden;
bool is_read_only;
bool is_system;
bool is_temporary;
char root_style;
dword unix_mode;
};
virtual int GetStyle() const;
bool IsWin32() const { return GetStyle() & STYLE_WIN32; }
bool IsPosix() const { return GetStyle() & STYLE_POSIX; }
virtual Array<FileInfo> Find(String mask, int max_count = 1000000, bool unmounted = false) const; // mask = Null -> root
virtual bool CreateFolder(String path, String& error) const;
bool FolderExists(String path) const;
virtual ~FileSystemInfo() {}
};
FileSystemInfo& StdFileSystemInfo();
#ifdef PLATFORM_WIN32
class NetNode : Moveable<NetNode> {
NETRESOURCEW net;
Vector<char16> local, remote, comment, provider;
String name;
String path;
static void Copy(String& t, char *s);
static Array<NetNode> Enum0(HANDLE hEnum);
void SetPtrs();
public:
enum {
UNKNOWN, NETWORK, GROUP, SERVER, SHARE
};
String GetName() const { return name; }
String GetPath() const { return path; }
int GetDisplayType() const;
String GetRemote() const { return ToUtf8(remote); }
String GetLocal() const { return ToUtf8(local); }
String GetProvider() const { return ToUtf8(provider); }
String GetComment() const { return ToUtf8(comment); }
Array<NetNode> Enum() const;
static Array<NetNode> EnumRoot();
static Array<NetNode> EnumRemembered();
NetNode();
NetNode(const NetNode& s) { *this = s; }
NetNode& operator=(const NetNode& s);
};
#endif