diff --git a/dlib/platform.d b/dlib/platform.d index 170a35b..e0856b7 100644 --- a/dlib/platform.d +++ b/dlib/platform.d @@ -1737,26 +1737,40 @@ ViewChanges(Watcher* watcher) void SetEventType(WatchEvent* ev, u32 mask) { - if(mask & IN_ACCESS) - { - ev.type |= WET.Accessed; - } - else if(mask & IN_ATTRIB) - { - ev.type |= WET.Metadata; - } - else if(mask & IN_CREATE) - { - ev.type |= WET.Created; - } - else if(mask & IN_MODIFY) - { - ev.type |= WET.Modified; - } - else if(mask & IN_DELETE) - { - ev.type |= WET.Deleted; - } + ev.type |= (mask & IN_ACCESS) ? WET.Accessed : WET.None; + ev.type |= (mask & IN_ATTRIB) ? WET.Metadata : WET.None; + ev.type |= (mask & IN_CREATE) ? WET.Created : WET.None; + ev.type |= (mask & IN_MODIFY) ? WET.Modified : WET.None; + ev.type |= (mask & IN_DELETE) ? WET.Deleted : WET.None; +} + +pragma(inline, true) +bool IsAbsolutePath(string path) => path.length && path[0] == '/'; + +string +AbsolutePath(string path) +{ + import core.sys.posix.stdlib : realpath; + + const u64 MAX_PATH = 4096; + string result = path; + + if(!IsAbsolutePath(result)) + { + static char[MAX_PATH] path_input; + static char[MAX_PATH] absolute_path; + + path_input[0 .. result.length] = result[0 .. $]; + path_input[result.length] = '\0'; + + absolute_path = '\0'; + + realpath(path_input.ptr, absolute_path.ptr); + + result = Str(absolute_path[0 .. strlen(absolute_path.ptr)]); + } + + return result; } version(DLIB_TEST) unittest @@ -1792,32 +1806,32 @@ version(DLIB_TEST) unittest enum WatchEventType { - None = 0x0000, - File = 0x0001, - Dir = 0x0002, - Self = 0x0004, - Created = 0x0008, - Modified = 0x0010, - Deleted = 0x0020, - Moved = 0x0040, - Metadata = 0x0080, - Accessed = 0x0100, - FileCreated = WET.File | WET.Created, + None = 0x0000, + File = 0x0001, + Dir = 0x0002, + Self = 0x0004, + Created = 0x0008, + Modified = 0x0010, + Deleted = 0x0020, + Moved = 0x0040, + Metadata = 0x0080, + Accessed = 0x0100, + FileCreated = WET.File | WET.Created, FileModified = WET.File | WET.Modified, - FileDeleted = WET.File | WET.Deleted, - FileMoved = WET.File | WET.Moved, + FileDeleted = WET.File | WET.Deleted, + FileMoved = WET.File | WET.Moved, FileMetadata = WET.File | WET.Metadata, FileAccessed = WET.File | WET.Accessed, - DirCreated = WET.Dir | WET.Created, - DirModified = WET.Dir | WET.Modified, - DirDeleted = WET.Dir | WET.Deleted, - DirMoved = WET.Dir | WET.Moved, - DirMetadata = WET.Dir | WET.Metadata, - DirAccessed = WET.Dir | WET.Accessed, - SelfCreated = WET.Self | WET.Created, + DirCreated = WET.Dir | WET.Created, + DirModified = WET.Dir | WET.Modified, + DirDeleted = WET.Dir | WET.Deleted, + DirMoved = WET.Dir | WET.Moved, + DirMetadata = WET.Dir | WET.Metadata, + DirAccessed = WET.Dir | WET.Accessed, + SelfCreated = WET.Self | WET.Created, SelfModified = WET.Self | WET.Modified, - SelfDeleted = WET.Self | WET.Deleted, - SelfMoved = WET.Self | WET.Moved, + SelfDeleted = WET.Self | WET.Deleted, + SelfMoved = WET.Self | WET.Moved, SelfMetadata = WET.Self | WET.Metadata, SelfAccessed = WET.Self | WET.Accessed, }