mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
Code reorganization and fixes around the vfs_path_as_str() function
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
parent
a467bb4b6e
commit
d2eac2f5af
@ -270,16 +270,12 @@ vfs_timeout_handler (void)
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
void
|
||||
vfs_release_path (const char *dir)
|
||||
vfs_release_path (const vfs_path_t * vpath)
|
||||
{
|
||||
vfs_path_t *vpath;
|
||||
const vfs_path_element_t *path_element;
|
||||
|
||||
vpath = vfs_path_from_str (dir);
|
||||
path_element = vfs_path_get_by_index (vpath, -1);
|
||||
|
||||
vfs_stamp_create (path_element->class, vfs_getid (vpath));
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -253,7 +253,7 @@ char *vfs_translate_path_n (const char *path);
|
||||
|
||||
void vfs_stamp_path (const char *path);
|
||||
|
||||
void vfs_release_path (const char *dir);
|
||||
void vfs_release_path (const vfs_path_t * vpath);
|
||||
|
||||
void vfs_fill_names (fill_names_f);
|
||||
|
||||
|
@ -557,7 +557,6 @@ do_load_dir (const vfs_path_t * vpath, dir_list * list, sortfn * sort, gboolean
|
||||
int status, link_to_dir, stale_link;
|
||||
int next_free = 0;
|
||||
struct stat st;
|
||||
const char *vpath_str;
|
||||
|
||||
/* ".." (if any) must be the first entry in the list */
|
||||
if (!set_zero_dir (list))
|
||||
@ -576,10 +575,14 @@ do_load_dir (const vfs_path_t * vpath, dir_list * list, sortfn * sort, gboolean
|
||||
|
||||
tree_store_start_check (vpath);
|
||||
|
||||
{
|
||||
const char *vpath_str;
|
||||
|
||||
vpath_str = vfs_path_as_str (vpath);
|
||||
/* Do not add a ".." entry to the root directory */
|
||||
if ((vpath_str[0] == PATH_SEP) && (vpath_str[1] == '\0'))
|
||||
next_free--;
|
||||
}
|
||||
|
||||
while ((dp = mc_readdir (dirp)) != NULL)
|
||||
{
|
||||
|
@ -197,12 +197,12 @@ static FileProgressStatus transform_error = FILE_CONT;
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static char *
|
||||
transform_source (FileOpContext * ctx, const char *source)
|
||||
transform_source (FileOpContext * ctx, const vfs_path_t * source_vpath)
|
||||
{
|
||||
char *s, *q;
|
||||
char *fnsource;
|
||||
|
||||
s = g_strdup (source);
|
||||
s = g_strdup (vfs_path_as_str (source_vpath));
|
||||
|
||||
/* We remove \n from the filename since regex routines would use \n as an anchor */
|
||||
/* this is just to be allowed to maniupulate file names with \n on it */
|
||||
@ -2886,7 +2886,7 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = transform_source (ctx, vfs_path_as_str (source_with_vpath));
|
||||
temp = transform_source (ctx, source_with_vpath);
|
||||
if (temp == NULL)
|
||||
value = transform_error;
|
||||
else
|
||||
@ -2997,7 +2997,7 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
|
||||
}
|
||||
else
|
||||
{
|
||||
temp = transform_source (ctx, vfs_path_as_str (source_with_vpath));
|
||||
temp = transform_source (ctx, source_with_vpath);
|
||||
if (temp == NULL)
|
||||
value = transform_error;
|
||||
else
|
||||
|
@ -608,7 +608,13 @@ restore_into_right_dir_panel (int idx, Widget * from_widget)
|
||||
const char *p_name = get_nth_panel_name (idx);
|
||||
|
||||
if (last_was_panel)
|
||||
new_widget = panel_new_with_dir (p_name, saved_dir);
|
||||
{
|
||||
vfs_path_t *saved_dir_vpath;
|
||||
|
||||
saved_dir_vpath = vfs_path_from_str (saved_dir);
|
||||
new_widget = panel_new_with_dir (p_name, saved_dir_vpath);
|
||||
vfs_path_free (saved_dir_vpath);
|
||||
}
|
||||
else
|
||||
new_widget = panel_new (p_name);
|
||||
|
||||
|
@ -683,47 +683,25 @@ create_panels (void)
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
put_current_path (void)
|
||||
midnight_put_panel_path (WPanel * panel)
|
||||
{
|
||||
vfs_path_t *cwd_vpath;
|
||||
const char *cwd_vpath_str;
|
||||
|
||||
if (!command_prompt)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_CHARSET
|
||||
cwd_vpath = remove_encoding_from_path (current_panel->cwd_vpath);
|
||||
cwd_vpath = remove_encoding_from_path (panel->cwd_vpath);
|
||||
#else
|
||||
cwd_vpath = vfs_path_clone (current_panel->cwd_vpath);
|
||||
cwd_vpath = vfs_path_clone (panel->cwd_vpath);
|
||||
#endif
|
||||
|
||||
command_insert (cmdline, vfs_path_as_str (cwd_vpath), FALSE);
|
||||
if (cwd_vpath->str[strlen (vfs_path_as_str (cwd_vpath)) - 1] != PATH_SEP)
|
||||
command_insert (cmdline, PATH_SEP_STR, FALSE);
|
||||
cwd_vpath_str = vfs_path_as_str (cwd_vpath);
|
||||
|
||||
vfs_path_free (cwd_vpath);
|
||||
}
|
||||
command_insert (cmdline, cwd_vpath_str, FALSE);
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static void
|
||||
put_other_path (void)
|
||||
{
|
||||
vfs_path_t *cwd_vpath;
|
||||
|
||||
if (get_other_type () != view_listing)
|
||||
return;
|
||||
|
||||
if (!command_prompt)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_CHARSET
|
||||
cwd_vpath = remove_encoding_from_path (other_panel->cwd_vpath);
|
||||
#else
|
||||
cwd_vpath = vfs_path_clone (other_panel->cwd_vpath);
|
||||
#endif
|
||||
|
||||
command_insert (cmdline, vfs_path_as_str (cwd_vpath), FALSE);
|
||||
if (cwd_vpath->str[strlen (vfs_path_as_str (cwd_vpath)) - 1] != PATH_SEP)
|
||||
if (cwd_vpath_str[strlen (cwd_vpath_str) - 1] != PATH_SEP)
|
||||
command_insert (cmdline, PATH_SEP_STR, FALSE);
|
||||
|
||||
vfs_path_free (cwd_vpath);
|
||||
@ -1130,7 +1108,7 @@ midnight_execute_cmd (Widget * sender, unsigned long command)
|
||||
copy_cmd ();
|
||||
break;
|
||||
case CK_PutCurrentPath:
|
||||
put_current_path ();
|
||||
midnight_put_panel_path (current_panel);
|
||||
break;
|
||||
case CK_PutCurrentLink:
|
||||
put_current_link ();
|
||||
@ -1139,7 +1117,8 @@ midnight_execute_cmd (Widget * sender, unsigned long command)
|
||||
put_current_tagged ();
|
||||
break;
|
||||
case CK_PutOtherPath:
|
||||
put_other_path ();
|
||||
if (get_other_type () == view_listing)
|
||||
midnight_put_panel_path (other_panel);
|
||||
break;
|
||||
case CK_PutOtherLink:
|
||||
put_other_link ();
|
||||
@ -1466,7 +1445,7 @@ midnight_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void
|
||||
/* Ctrl-Shift-Enter */
|
||||
if (parm == (KEY_M_CTRL | KEY_M_SHIFT | '\n'))
|
||||
{
|
||||
put_current_path ();
|
||||
midnight_put_panel_path (current_panel);
|
||||
put_prog_name ();
|
||||
return MSG_HANDLED;
|
||||
}
|
||||
|
@ -2972,17 +2972,20 @@ panel_set_sort_type_by_id (WPanel * panel, const char *name)
|
||||
*/
|
||||
|
||||
static const char *
|
||||
get_parent_dir_name (const char *cwd, const char *lwd)
|
||||
get_parent_dir_name (const vfs_path_t * cwd_vpath, const vfs_path_t * lwd_vpath)
|
||||
{
|
||||
size_t llen, clen;
|
||||
const char *p;
|
||||
const char *p, *cwd, *lwd;
|
||||
|
||||
llen = strlen (lwd);
|
||||
clen = strlen (cwd);
|
||||
llen = vfs_path_len (lwd_vpath);
|
||||
clen = vfs_path_len (cwd_vpath);
|
||||
|
||||
if (llen <= clen)
|
||||
return NULL;
|
||||
|
||||
cwd = vfs_path_as_str (cwd_vpath);
|
||||
lwd = vfs_path_as_str (lwd_vpath);
|
||||
|
||||
p = g_strrstr (lwd, VFS_PATH_URL_DELIMITER);
|
||||
|
||||
if (p == NULL)
|
||||
@ -3044,21 +3047,18 @@ _do_panel_cd (WPanel * panel, const vfs_path_t * new_dir_vpath, enum cd_enum cd_
|
||||
}
|
||||
|
||||
if (mc_chdir (new_dir_vpath) == -1)
|
||||
{
|
||||
panel_set_cwd (panel, vfs_path_as_str (panel->cwd_vpath));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Success: save previous directory, shutdown status of previous dir */
|
||||
olddir_vpath = vfs_path_clone (panel->cwd_vpath);
|
||||
panel_set_lwd (panel, vfs_path_as_str (panel->cwd_vpath));
|
||||
panel_set_lwd (panel, panel->cwd_vpath);
|
||||
input_free_completions (cmdline);
|
||||
|
||||
vfs_path_free (panel->cwd_vpath);
|
||||
vfs_setup_cwd ();
|
||||
panel->cwd_vpath = vfs_path_clone (vfs_get_raw_current_dir ());
|
||||
|
||||
vfs_release_path (vfs_path_as_str (olddir_vpath));
|
||||
vfs_release_path (olddir_vpath);
|
||||
|
||||
subshell_chdir (panel->cwd_vpath);
|
||||
|
||||
@ -3069,9 +3069,7 @@ _do_panel_cd (WPanel * panel, const vfs_path_t * new_dir_vpath, enum cd_enum cd_
|
||||
do_load_dir (panel->cwd_vpath, &panel->dir, panel->sort_info.sort_field->sort_routine,
|
||||
panel->sort_info.reverse, panel->sort_info.case_sensitive,
|
||||
panel->sort_info.exec_first, panel->filter);
|
||||
try_to_select (panel,
|
||||
get_parent_dir_name (vfs_path_as_str (panel->cwd_vpath),
|
||||
vfs_path_as_str (olddir_vpath)));
|
||||
try_to_select (panel, get_parent_dir_name (panel->cwd_vpath, olddir_vpath));
|
||||
|
||||
load_hint (0);
|
||||
panel->dirty = 1;
|
||||
@ -3926,6 +3924,34 @@ panel_save_curent_file_to_clip_file (const gchar * event_group_name, const gchar
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static vfs_path_t *
|
||||
panel_recursive_cd_to_parent (const vfs_path_t * vpath)
|
||||
{
|
||||
vfs_path_t *cwd_vpath;
|
||||
|
||||
cwd_vpath = vfs_path_clone (vpath);
|
||||
|
||||
while (mc_chdir (cwd_vpath) < 0)
|
||||
{
|
||||
const char *panel_cwd_path;
|
||||
vfs_path_t *tmp_vpath;
|
||||
|
||||
/* check if path contains only '/' */
|
||||
panel_cwd_path = vfs_path_as_str (cwd_vpath);
|
||||
if (panel_cwd_path[0] == PATH_SEP && panel_cwd_path[1] == '\0')
|
||||
return NULL;
|
||||
|
||||
tmp_vpath = vfs_path_vtokens_get (cwd_vpath, 0, -1);
|
||||
vfs_path_free (cwd_vpath);
|
||||
cwd_vpath = vfs_path_build_filename (PATH_SEP_STR, vfs_path_as_str (tmp_vpath), NULL);
|
||||
vfs_path_free (tmp_vpath);
|
||||
}
|
||||
|
||||
return cwd_vpath;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/*** public functions ****************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -3968,10 +3994,13 @@ panel_clean_dir (WPanel * panel)
|
||||
*/
|
||||
|
||||
void
|
||||
panel_set_cwd (WPanel * panel, const char *path_str)
|
||||
panel_set_cwd (WPanel * panel, const vfs_path_t * vpath)
|
||||
{
|
||||
if (vpath != panel->cwd_vpath) /* check if new vpath is not the panel->cwd_vpath object */
|
||||
{
|
||||
vfs_path_free (panel->cwd_vpath);
|
||||
panel->cwd_vpath = vfs_path_from_str (path_str);
|
||||
panel->cwd_vpath = vfs_path_clone (vpath);
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -3983,10 +4012,13 @@ panel_set_cwd (WPanel * panel, const char *path_str)
|
||||
*/
|
||||
|
||||
void
|
||||
panel_set_lwd (WPanel * panel, const char *path_str)
|
||||
panel_set_lwd (WPanel * panel, const vfs_path_t * vpath)
|
||||
{
|
||||
if (vpath != panel->lwd_vpath) /* check if new vpath is not the panel->lwd_vpath object */
|
||||
{
|
||||
vfs_path_free (panel->lwd_vpath);
|
||||
panel->lwd_vpath = vfs_path_from_str (path_str);
|
||||
panel->lwd_vpath = vfs_path_clone (vpath);
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -4013,7 +4045,7 @@ panel_new (const char *panel_name)
|
||||
*/
|
||||
|
||||
WPanel *
|
||||
panel_new_with_dir (const char *panel_name, const char *wpath)
|
||||
panel_new_with_dir (const char *panel_name, const vfs_path_t * vpath)
|
||||
{
|
||||
WPanel *panel;
|
||||
Widget *w;
|
||||
@ -4028,10 +4060,10 @@ panel_new_with_dir (const char *panel_name, const char *wpath)
|
||||
/* We do not want the cursor */
|
||||
widget_want_cursor (w, FALSE);
|
||||
|
||||
if (wpath != NULL)
|
||||
if (vpath != NULL)
|
||||
{
|
||||
curdir = _vfs_get_cwd ();
|
||||
panel_set_cwd (panel, wpath);
|
||||
panel_set_cwd (panel, vpath);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4039,7 +4071,7 @@ panel_new_with_dir (const char *panel_name, const char *wpath)
|
||||
panel->cwd_vpath = vfs_path_clone (vfs_get_raw_current_dir ());
|
||||
}
|
||||
|
||||
panel_set_lwd (panel, ".");
|
||||
panel_set_lwd (panel, vfs_get_raw_current_dir ());
|
||||
|
||||
panel->hist_name = g_strconcat ("Dir Hist ", panel_name, (char *) NULL);
|
||||
/* directories history will be get later */
|
||||
@ -4120,11 +4152,11 @@ panel_new_with_dir (const char *panel_name, const char *wpath)
|
||||
/* Restore old right path */
|
||||
if (curdir != NULL)
|
||||
{
|
||||
vfs_path_t *vpath;
|
||||
vfs_path_t *tmp_vpath;
|
||||
|
||||
vpath = vfs_path_from_str (curdir);
|
||||
err = mc_chdir (vpath);
|
||||
vfs_path_free (vpath);
|
||||
tmp_vpath = vfs_path_from_str (curdir);
|
||||
err = mc_chdir (tmp_vpath);
|
||||
vfs_path_free (tmp_vpath);
|
||||
}
|
||||
g_free (curdir);
|
||||
|
||||
@ -4137,45 +4169,27 @@ void
|
||||
panel_reload (WPanel * panel)
|
||||
{
|
||||
struct stat current_stat;
|
||||
gboolean ok;
|
||||
vfs_path_t *cwd_vpath;
|
||||
|
||||
ok = (panels_options.fast_reload
|
||||
&& stat (vfs_path_as_str (panel->cwd_vpath), ¤t_stat) == 0
|
||||
if (panels_options.fast_reload && stat (vfs_path_as_str (panel->cwd_vpath), ¤t_stat) == 0
|
||||
&& current_stat.st_ctime == panel->dir_stat.st_ctime
|
||||
&& current_stat.st_mtime == panel->dir_stat.st_mtime);
|
||||
|
||||
if (ok)
|
||||
&& current_stat.st_mtime == panel->dir_stat.st_mtime)
|
||||
return;
|
||||
|
||||
do
|
||||
{
|
||||
char *last_slash;
|
||||
const char *panel_cwd_path;
|
||||
|
||||
if (mc_chdir (panel->cwd_vpath) != -1)
|
||||
break;
|
||||
|
||||
panel_cwd_path = vfs_path_as_str (panel->cwd_vpath);
|
||||
|
||||
if (panel_cwd_path[0] == PATH_SEP && panel_cwd_path[1] == '\0')
|
||||
cwd_vpath = panel_recursive_cd_to_parent (panel->cwd_vpath);
|
||||
vfs_path_free (panel->cwd_vpath);
|
||||
|
||||
if (cwd_vpath == NULL)
|
||||
{
|
||||
panel->cwd_vpath = vfs_path_from_str (PATH_SEP_STR);
|
||||
panel_clean_dir (panel);
|
||||
panel->count = set_zero_dir (&panel->dir) ? 1 : 0;
|
||||
return;
|
||||
}
|
||||
last_slash = strrchr (panel_cwd_path, PATH_SEP);
|
||||
vfs_path_free (panel->cwd_vpath);
|
||||
if (last_slash == NULL || last_slash == panel_cwd_path)
|
||||
panel->cwd_vpath = vfs_path_from_str (PATH_SEP_STR);
|
||||
else
|
||||
{
|
||||
*last_slash = '\0';
|
||||
panel->cwd_vpath = vfs_path_clone (panel->cwd_vpath);
|
||||
}
|
||||
|
||||
panel->cwd_vpath = cwd_vpath;
|
||||
memset (&(panel->dir_stat), 0, sizeof (panel->dir_stat));
|
||||
show_dir (panel);
|
||||
}
|
||||
while (TRUE);
|
||||
|
||||
panel->count =
|
||||
do_reload_dir (panel->cwd_vpath, &panel->dir, panel->sort_info.sort_field->sort_routine,
|
||||
|
@ -152,7 +152,7 @@ extern mc_fhl_t *mc_filehighlight;
|
||||
/*** declarations of public functions ************************************************************/
|
||||
|
||||
WPanel *panel_new (const char *panel_name);
|
||||
WPanel *panel_new_with_dir (const char *panel_name, const char *dr);
|
||||
WPanel *panel_new_with_dir (const char *panel_name, const vfs_path_t * vpath);
|
||||
void panel_clean_dir (WPanel * panel);
|
||||
|
||||
void panel_reload (WPanel * panel);
|
||||
@ -186,8 +186,8 @@ const panel_field_t *panel_get_field_by_title (const char *);
|
||||
const panel_field_t *panel_get_field_by_title_hotkey (const char *);
|
||||
gsize panel_get_num_of_user_possible_fields (void);
|
||||
const char **panel_get_user_possible_fields (gsize *);
|
||||
void panel_set_cwd (WPanel * panel, const char *path_str);
|
||||
void panel_set_lwd (WPanel * panel, const char *path_str);
|
||||
void panel_set_cwd (WPanel * panel, const vfs_path_t * vpath);
|
||||
void panel_set_lwd (WPanel * panel, const vfs_path_t * vpath);
|
||||
|
||||
void panel_init (void);
|
||||
void panel_deinit (void);
|
||||
|
@ -376,9 +376,13 @@ do_external_panelize (char *command)
|
||||
current_panel->count = next_free;
|
||||
if (list->list[0].fname[0] == PATH_SEP)
|
||||
{
|
||||
vfs_path_t *vpath_root;
|
||||
int ret;
|
||||
panel_set_cwd (current_panel, PATH_SEP_STR);
|
||||
ret = chdir (PATH_SEP_STR);
|
||||
|
||||
vpath_root = vfs_path_from_str (PATH_SEP_STR);
|
||||
panel_set_cwd (current_panel, vpath_root);
|
||||
ret = mc_chdir (vpath_root);
|
||||
vfs_path_free (vpath_root);
|
||||
(void) ret;
|
||||
}
|
||||
}
|
||||
|
@ -182,7 +182,7 @@ START_PARAMETRIZED_TEST (test_from_to_string, test_from_to_string_ds)
|
||||
vfs_path_t *vpath;
|
||||
size_t vpath_len;
|
||||
const vfs_path_element_t *path_element;
|
||||
char *actual_result;
|
||||
const char *actual_result;
|
||||
|
||||
vpath = vfs_path_from_str_flags (data->input_string, VPF_USE_DEPRECATED_PARSER);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user