/* Converts a path into canonic form. Mind that canonic paths are usually not * longer than the original one, but can be extended in corner cases so several * extra bytes (e.g. 16) in the buffer are needed. */ static void make_canonic(const char path[], char buf[], size_t buf_size) { canonicalize_path(path, buf, buf_size); if(!is_root_dir(buf) && !ends_with_slash(path)) { chosp(buf); } }
xstring_t remove_file_from_path(const xstring_t& path) { if (ends_with_slash(path)) { return path; } auto last_separator = path.find_last_of(_X("/\\")); return last_separator != xstring_t::npos ? path.substr(0, last_separator) : path; }
void remove_last_path_component(char *path) { char *slash; while(ends_with_slash(path)) { chosp(path); } if((slash = strrchr(path, '/')) != NULL) { int pos = is_root_dir(path) ? 1 : 0; slash[pos] = '\0'; } }
void remove_last_path_component(char path[]) { char *slash; while(ends_with_slash(path)) { chosp(path); } slash = strrchr(path, '/'); if(slash != NULL) { const int offset = is_root_dir(path) ? 1 : 0; slash[offset] = '\0'; } }
xstring_t path_combine(const xstring_t& path1, const xstring_t& path2) { if (path1.length() == 0) { return path2; } if (path2.length() == 0) { return path1; } xstring_t path{ path1 }; if (ends_with_slash(path)) { path.resize(path.length() - 1); } return path + PATH_SEPARATOR + (path2[0] == _X('\\') || path2[0] == _X('/') ? path2.substr(1) : path2); }
void make_abs_path(char buf[], size_t buf_len, const char base[], const char sub[], const char cwd[]) { char local_buf[buf_len]; if(is_path_absolute(base)) { snprintf(local_buf, buf_len, "%s%s%s", base, (sub[0] == '\0' ? "" : "/"), sub); } else { snprintf(local_buf, buf_len, "%s/%s%s%s", cwd, base, (sub[0] == '\0' ? "" : "/"), sub); } canonicalize_path(local_buf, buf, buf_len); if(!ends_with_slash(sub) && !is_root_dir(buf)) { chosp(buf); } }
/* Traverses passed directory recursively and adds it and all found * subdirectories to PATH environment variable. */ static void add_dirs_to_path(const char *path) { DIR *dir; struct dirent *dentry; const char *slash = ""; dir = os_opendir(path); if(dir == NULL) return; slash = ends_with_slash(path) ? "" : "/"; add_to_path(path); while((dentry = os_readdir(dir)) != NULL) { char buf[PATH_MAX]; if(is_builtin_dir(dentry->d_name)) { continue; } snprintf(buf, sizeof(buf), "%s%s%s", path, slash, dentry->d_name); #ifndef _WIN32 if(dentry->d_type == DT_DIR) #else if(is_dir(buf)) #endif { add_dirs_to_path(buf); } } os_closedir(dir); }
void quick_view_file(FileView *view) { char path[PATH_MAX]; const dir_entry_t *entry; if(curr_stats.load_stage < 2) { return; } if(vle_mode_is(VIEW_MODE)) { return; } if(curr_stats.number_of_windows == 1) { return; } if(draw_abandoned_view_mode()) { return; } ui_view_erase(other_view); entry = &view->dir_entry[view->list_pos]; get_full_path_of(entry, sizeof(path), path); switch(view->dir_entry[view->list_pos].type) { case FT_CHAR_DEV: mvwaddstr(other_view->win, LINE, COL, "File is a Character Device"); break; case FT_BLOCK_DEV: mvwaddstr(other_view->win, LINE, COL, "File is a Block Device"); break; #ifndef _WIN32 case FT_SOCK: mvwaddstr(other_view->win, LINE, COL, "File is a Socket"); break; #endif case FT_FIFO: mvwaddstr(other_view->win, LINE, COL, "File is a Named Pipe"); break; case FT_LINK: if(get_link_target_abs(path, entry->origin, path, sizeof(path)) != 0) { mvwaddstr(other_view->win, LINE, COL, "Cannot resolve Link"); break; } if(!ends_with_slash(path) && is_dir(path)) { strncat(path, "/", sizeof(path) - strlen(path) - 1); } /* break intensionally omitted */ case FT_UNK: default: { const char *viewer; FILE *fp; char *const typed_fname = get_typed_fname(path); viewer = ft_get_viewer(typed_fname); free(typed_fname); if(viewer == NULL && is_dir(path)) { mvwaddstr(other_view->win, LINE, COL, "File is a Directory"); break; } if(is_null_or_empty(viewer)) { fp = os_fopen(path, "rb"); } else { fp = use_info_prog(viewer); } if(fp == NULL) { mvwaddstr(other_view->win, LINE, COL, "Cannot open file"); break; } ui_view_clear(other_view); wattrset(other_view->win, 0); view_file(fp, cfg.wrap_quick_view); fclose(fp); break; } } refresh_view_win(other_view); ui_view_title_update(other_view); }
/* Checks whether entry corresponds to a directory. Returns non-zero if so, * otherwise zero is returned. */ static int is_directory_entry(const dir_entry_t *entry) { return (entry->type == DIRECTORY) || (entry->type == LINK && ends_with_slash(entry->name)); }
void quick_view_file(FileView *view) { char buf[PATH_MAX]; if(curr_stats.load_stage < 2) return; if(get_mode() == VIEW_MODE) return; if(curr_stats.number_of_windows == 1) return; werase(other_view->win); werase(other_view->title); mvwaddstr(other_view->title, 0, 0, "File: "); wprint(other_view->title, view->dir_entry[view->list_pos].name); snprintf(buf, sizeof(buf), "%s/%s", view->curr_dir, view->dir_entry[view->list_pos].name); switch(view->dir_entry[view->list_pos].type) { case CHARACTER_DEVICE: mvwaddstr(other_view->win, LINE, COL, "File is a Character Device"); break; case BLOCK_DEVICE: mvwaddstr(other_view->win, LINE, COL, "File is a Block Device"); break; #ifndef _WIN32 case SOCKET: mvwaddstr(other_view->win, LINE, COL, "File is a Socket"); break; #endif case FIFO: mvwaddstr(other_view->win, LINE, COL, "File is a Named Pipe"); break; case LINK: if(get_link_target_abs(buf, view->curr_dir, buf, sizeof(buf)) != 0) { mvwaddstr(other_view->win, LINE, COL, "Cannot resolve Link"); break; } if(!ends_with_slash(buf) && is_dir(buf)) { strncat(buf, "/", sizeof(buf) - strlen(buf) - 1); } /* break intensionally omitted */ case UNKNOWN: default: { const char *viewer; FILE *fp; viewer = get_viewer_for_file(buf); if(viewer == NULL && is_dir(buf)) { mvwaddstr(other_view->win, LINE, COL, "File is a Directory"); break; } if(is_null_or_empty(viewer)) fp = fopen(buf, "r"); else fp = use_info_prog(viewer); if(fp == NULL) { mvwaddstr(other_view->win, LINE, COL, "Cannot open file"); break; } colmgr_reset(); wattrset(other_view->win, 0); view_file(fp, cfg.wrap_quick_view); fclose(fp); } break; } refresh_view_win(other_view); wrefresh(other_view->title); }