| 1 | #ifndef DIR_H |
| 2 | #define DIR_H |
| 3 | |
| 4 | #include <time.h> |
| 5 | #include <stddef.h> |
| 6 | #include <stdint.h> |
| 7 | #include <stdbool.h> |
| 8 | #include <sys/stat.h> |
| 9 | #include "cvector.h" |
| 10 | |
| 11 | #define M_SUID S_ISUID |
| 12 | #define M_SGID S_ISGID |
| 13 | #define M_STICKY S_ISVTX |
| 14 | #define M_USRR S_IRUSR |
| 15 | #define M_USRW S_IWUSR |
| 16 | #define M_USRX S_IXUSR |
| 17 | #define M_GRPR S_IRGRP |
| 18 | #define M_GRPW S_IWGRP |
| 19 | #define M_GRPX S_IXGRP |
| 20 | #define M_OTHR S_IROTH |
| 21 | #define M_OTHW S_IWOTH |
| 22 | #define M_OTHX S_IXOTH |
| 23 | |
| 24 | #define REGSEARCH_BAD_REGEX 1 |
| 25 | #define REGSEARCH_NOT_FOUND 2 |
| 26 | |
| 27 | #define TOGGLEMARK_PARENT_MARKED 1 |
| 28 | #define TOGGLEMARK_DIRENT_UNKNOWN 2 |
| 29 | |
| 30 | enum size_unit { |
| 31 | SIZE_B, |
| 32 | SIZE_KB, |
| 33 | SIZE_MB, |
| 34 | SIZE_GB, |
| 35 | SIZE_TB, |
| 36 | SIZE_EB, |
| 37 | }; |
| 38 | |
| 39 | enum de_type { |
| 40 | DE_FILE, |
| 41 | DE_DIR, |
| 42 | DE_FIFO, |
| 43 | DE_LINK, |
| 44 | DE_BLOCK, |
| 45 | DE_CHAR, |
| 46 | DE_SOCKET, |
| 47 | DE_UNKNOWN |
| 48 | }; |
| 49 | |
| 50 | typedef struct { |
| 51 | char * name; |
| 52 | enum de_type type; |
| 53 | unsigned size_small; |
| 54 | enum size_unit size_unit; |
| 55 | |
| 56 | size_t size; |
| 57 | uint16_t mode; |
| 58 | time_t mtime; |
| 59 | char * uname; |
| 60 | char * gname; |
| 61 | |
| 62 | char * linkname; |
| 63 | enum de_type linktype; |
| 64 | |
| 65 | bool marked; |
| 66 | } dirent_t; |
| 67 | |
| 68 | typedef struct { |
| 69 | size_t len; |
| 70 | cvector(dirent_t) entries; |
| 71 | size_t nodots_len; |
| 72 | cvector(dirent_t*) nodots; |
| 73 | |
| 74 | size_t longest_uname; |
| 75 | size_t longest_gname; |
| 76 | size_t longest_size; |
| 77 | size_t longest_size_small; |
| 78 | size_t longest_size_unit; |
| 79 | } dir_t; |
| 80 | |
| 81 | void dir_init(void); |
| 82 | void dir_deinit(void); |
| 83 | |
| 84 | int dir_list(const char * path, dir_t * dir); |
| 85 | void dir_free(dir_t * dir); |
| 86 | const char * dir_get_cwd(void); |
| 87 | int dir_cd_back(const char * cwd); |
| 88 | int dir_cd(const char * cwd, const char * next); |
| 89 | int dir_search_name(const dir_t * dir, const char * name, size_t * idx); |
| 90 | int dir_search_regex(const dir_t * dir, const char * regexstr, size_t * idx); |
| 91 | const char * dir_basename(const char * path); |
| 92 | size_t dir_len(const dir_t * dir); |
| 93 | dirent_t * dir_get_entry(const dir_t * dir, size_t cursor); |
| 94 | cvector(dirent_t) dir_entries(const dir_t * dir); |
| 95 | void dir_sort(dir_t * dir); |
| 96 | const char * dir_get_home(void); |
| 97 | size_t dir_get_total_marked(void); |
| 98 | size_t dir_marked_subfiles(void); |
| 99 | int dir_paste_marks(const char * cwd, size_t * total_pastes); |
| 100 | int dir_marked_delete(void); |
| 101 | |
| 102 | char dirent_crepr(const dirent_t * de); // character representing dir entry |
| 103 | char dirent_creprl(const dirent_t * de); // like above, but for the link |
| 104 | char dirent_longcrepr(const dirent_t * de); // like above, but for long mode |
| 105 | bool dirent_isexec(const dirent_t * de); |
| 106 | const char * dirent_prettymode(const dirent_t * de); |
| 107 | const char * dirent_size_unit(const dirent_t * de); |
| 108 | size_t dirent_subfiles(const dirent_t * de); // number of sub entries in a dir |
| 109 | int dirent_delete(const dirent_t * de); |
| 110 | int dirent_open(const dirent_t * de); |
| 111 | int dirent_togglemark(dirent_t * de); |
| 112 | |
| 113 | #endif /* DIR_H */ |
| 114 | |