Code reorganization and fixes around the vfs_path_as_str() function

Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
Slava Zanko 2013-06-20 14:24:34 +03:00 committed by Andrew Borodin
parent a467bb4b6e
commit d2eac2f5af
10 changed files with 116 additions and 114 deletions

View File

@ -270,16 +270,12 @@ vfs_timeout_handler (void)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
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; const vfs_path_element_t *path_element;
vpath = vfs_path_from_str (dir);
path_element = vfs_path_get_by_index (vpath, -1); path_element = vfs_path_get_by_index (vpath, -1);
vfs_stamp_create (path_element->class, vfs_getid (vpath)); vfs_stamp_create (path_element->class, vfs_getid (vpath));
vfs_path_free (vpath);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */

View File

@ -253,7 +253,7 @@ char *vfs_translate_path_n (const char *path);
void vfs_stamp_path (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); void vfs_fill_names (fill_names_f);

View File

@ -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 status, link_to_dir, stale_link;
int next_free = 0; int next_free = 0;
struct stat st; struct stat st;
const char *vpath_str;
/* ".." (if any) must be the first entry in the list */ /* ".." (if any) must be the first entry in the list */
if (!set_zero_dir (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); tree_store_start_check (vpath);
{
const char *vpath_str;
vpath_str = vfs_path_as_str (vpath); vpath_str = vfs_path_as_str (vpath);
/* Do not add a ".." entry to the root directory */ /* Do not add a ".." entry to the root directory */
if ((vpath_str[0] == PATH_SEP) && (vpath_str[1] == '\0')) if ((vpath_str[0] == PATH_SEP) && (vpath_str[1] == '\0'))
next_free--; next_free--;
}
while ((dp = mc_readdir (dirp)) != NULL) while ((dp = mc_readdir (dirp)) != NULL)
{ {

View File

@ -197,12 +197,12 @@ static FileProgressStatus transform_error = FILE_CONT;
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static char * static char *
transform_source (FileOpContext * ctx, const char *source) transform_source (FileOpContext * ctx, const vfs_path_t * source_vpath)
{ {
char *s, *q; char *s, *q;
char *fnsource; 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 */ /* 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 */ /* 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 else
{ {
temp = transform_source (ctx, vfs_path_as_str (source_with_vpath)); temp = transform_source (ctx, source_with_vpath);
if (temp == NULL) if (temp == NULL)
value = transform_error; value = transform_error;
else else
@ -2997,7 +2997,7 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
} }
else else
{ {
temp = transform_source (ctx, vfs_path_as_str (source_with_vpath)); temp = transform_source (ctx, source_with_vpath);
if (temp == NULL) if (temp == NULL)
value = transform_error; value = transform_error;
else else

View File

@ -608,7 +608,13 @@ restore_into_right_dir_panel (int idx, Widget * from_widget)
const char *p_name = get_nth_panel_name (idx); const char *p_name = get_nth_panel_name (idx);
if (last_was_panel) 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 else
new_widget = panel_new (p_name); new_widget = panel_new (p_name);

View File

@ -683,47 +683,25 @@ create_panels (void)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
put_current_path (void) midnight_put_panel_path (WPanel * panel)
{ {
vfs_path_t *cwd_vpath; vfs_path_t *cwd_vpath;
const char *cwd_vpath_str;
if (!command_prompt) if (!command_prompt)
return; return;
#ifdef HAVE_CHARSET #ifdef HAVE_CHARSET
cwd_vpath = remove_encoding_from_path (current_panel->cwd_vpath); cwd_vpath = remove_encoding_from_path (panel->cwd_vpath);
#else #else
cwd_vpath = vfs_path_clone (current_panel->cwd_vpath); cwd_vpath = vfs_path_clone (panel->cwd_vpath);
#endif #endif
command_insert (cmdline, vfs_path_as_str (cwd_vpath), FALSE); cwd_vpath_str = vfs_path_as_str (cwd_vpath);
if (cwd_vpath->str[strlen (vfs_path_as_str (cwd_vpath)) - 1] != PATH_SEP)
command_insert (cmdline, PATH_SEP_STR, FALSE);
vfs_path_free (cwd_vpath); command_insert (cmdline, cwd_vpath_str, FALSE);
}
/* --------------------------------------------------------------------------------------------- */ if (cwd_vpath_str[strlen (cwd_vpath_str) - 1] != PATH_SEP)
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)
command_insert (cmdline, PATH_SEP_STR, FALSE); command_insert (cmdline, PATH_SEP_STR, FALSE);
vfs_path_free (cwd_vpath); vfs_path_free (cwd_vpath);
@ -1130,7 +1108,7 @@ midnight_execute_cmd (Widget * sender, unsigned long command)
copy_cmd (); copy_cmd ();
break; break;
case CK_PutCurrentPath: case CK_PutCurrentPath:
put_current_path (); midnight_put_panel_path (current_panel);
break; break;
case CK_PutCurrentLink: case CK_PutCurrentLink:
put_current_link (); put_current_link ();
@ -1139,7 +1117,8 @@ midnight_execute_cmd (Widget * sender, unsigned long command)
put_current_tagged (); put_current_tagged ();
break; break;
case CK_PutOtherPath: case CK_PutOtherPath:
put_other_path (); if (get_other_type () == view_listing)
midnight_put_panel_path (other_panel);
break; break;
case CK_PutOtherLink: case CK_PutOtherLink:
put_other_link (); put_other_link ();
@ -1466,7 +1445,7 @@ midnight_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void
/* Ctrl-Shift-Enter */ /* Ctrl-Shift-Enter */
if (parm == (KEY_M_CTRL | KEY_M_SHIFT | '\n')) if (parm == (KEY_M_CTRL | KEY_M_SHIFT | '\n'))
{ {
put_current_path (); midnight_put_panel_path (current_panel);
put_prog_name (); put_prog_name ();
return MSG_HANDLED; return MSG_HANDLED;
} }

View File

@ -2972,17 +2972,20 @@ panel_set_sort_type_by_id (WPanel * panel, const char *name)
*/ */
static const char * 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; size_t llen, clen;
const char *p; const char *p, *cwd, *lwd;
llen = strlen (lwd); llen = vfs_path_len (lwd_vpath);
clen = strlen (cwd); clen = vfs_path_len (cwd_vpath);
if (llen <= clen) if (llen <= clen)
return NULL; return NULL;
cwd = vfs_path_as_str (cwd_vpath);
lwd = vfs_path_as_str (lwd_vpath);
p = g_strrstr (lwd, VFS_PATH_URL_DELIMITER); p = g_strrstr (lwd, VFS_PATH_URL_DELIMITER);
if (p == NULL) 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) if (mc_chdir (new_dir_vpath) == -1)
{
panel_set_cwd (panel, vfs_path_as_str (panel->cwd_vpath));
return FALSE; return FALSE;
}
/* Success: save previous directory, shutdown status of previous dir */ /* Success: save previous directory, shutdown status of previous dir */
olddir_vpath = vfs_path_clone (panel->cwd_vpath); 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); input_free_completions (cmdline);
vfs_path_free (panel->cwd_vpath); vfs_path_free (panel->cwd_vpath);
vfs_setup_cwd (); vfs_setup_cwd ();
panel->cwd_vpath = vfs_path_clone (vfs_get_raw_current_dir ()); 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); 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, 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.reverse, panel->sort_info.case_sensitive,
panel->sort_info.exec_first, panel->filter); panel->sort_info.exec_first, panel->filter);
try_to_select (panel, try_to_select (panel, get_parent_dir_name (panel->cwd_vpath, olddir_vpath));
get_parent_dir_name (vfs_path_as_str (panel->cwd_vpath),
vfs_path_as_str (olddir_vpath)));
load_hint (0); load_hint (0);
panel->dirty = 1; panel->dirty = 1;
@ -3926,6 +3924,34 @@ panel_save_curent_file_to_clip_file (const gchar * event_group_name, const gchar
return TRUE; 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 ****************************************************************************/ /*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -3968,10 +3994,13 @@ panel_clean_dir (WPanel * panel)
*/ */
void 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); 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 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); 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 * 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; WPanel *panel;
Widget *w; Widget *w;
@ -4028,10 +4060,10 @@ panel_new_with_dir (const char *panel_name, const char *wpath)
/* We do not want the cursor */ /* We do not want the cursor */
widget_want_cursor (w, FALSE); widget_want_cursor (w, FALSE);
if (wpath != NULL) if (vpath != NULL)
{ {
curdir = _vfs_get_cwd (); curdir = _vfs_get_cwd ();
panel_set_cwd (panel, wpath); panel_set_cwd (panel, vpath);
} }
else 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->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); panel->hist_name = g_strconcat ("Dir Hist ", panel_name, (char *) NULL);
/* directories history will be get later */ /* 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 */ /* Restore old right path */
if (curdir != NULL) if (curdir != NULL)
{ {
vfs_path_t *vpath; vfs_path_t *tmp_vpath;
vpath = vfs_path_from_str (curdir); tmp_vpath = vfs_path_from_str (curdir);
err = mc_chdir (vpath); err = mc_chdir (tmp_vpath);
vfs_path_free (vpath); vfs_path_free (tmp_vpath);
} }
g_free (curdir); g_free (curdir);
@ -4137,45 +4169,27 @@ void
panel_reload (WPanel * panel) panel_reload (WPanel * panel)
{ {
struct stat current_stat; struct stat current_stat;
gboolean ok; vfs_path_t *cwd_vpath;
ok = (panels_options.fast_reload if (panels_options.fast_reload && stat (vfs_path_as_str (panel->cwd_vpath), &current_stat) == 0
&& stat (vfs_path_as_str (panel->cwd_vpath), &current_stat) == 0
&& current_stat.st_ctime == panel->dir_stat.st_ctime && current_stat.st_ctime == panel->dir_stat.st_ctime
&& current_stat.st_mtime == panel->dir_stat.st_mtime); && current_stat.st_mtime == panel->dir_stat.st_mtime)
if (ok)
return; return;
do cwd_vpath = panel_recursive_cd_to_parent (panel->cwd_vpath);
{ vfs_path_free (panel->cwd_vpath);
char *last_slash;
const char *panel_cwd_path; if (cwd_vpath == NULL)
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')
{ {
panel->cwd_vpath = vfs_path_from_str (PATH_SEP_STR);
panel_clean_dir (panel); panel_clean_dir (panel);
panel->count = set_zero_dir (&panel->dir) ? 1 : 0; panel->count = set_zero_dir (&panel->dir) ? 1 : 0;
return; return;
} }
last_slash = strrchr (panel_cwd_path, PATH_SEP);
vfs_path_free (panel->cwd_vpath); panel->cwd_vpath = 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);
}
memset (&(panel->dir_stat), 0, sizeof (panel->dir_stat)); memset (&(panel->dir_stat), 0, sizeof (panel->dir_stat));
show_dir (panel); show_dir (panel);
}
while (TRUE);
panel->count = panel->count =
do_reload_dir (panel->cwd_vpath, &panel->dir, panel->sort_info.sort_field->sort_routine, do_reload_dir (panel->cwd_vpath, &panel->dir, panel->sort_info.sort_field->sort_routine,

View File

@ -152,7 +152,7 @@ extern mc_fhl_t *mc_filehighlight;
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
WPanel *panel_new (const char *panel_name); 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_clean_dir (WPanel * panel);
void panel_reload (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 *); const panel_field_t *panel_get_field_by_title_hotkey (const char *);
gsize panel_get_num_of_user_possible_fields (void); gsize panel_get_num_of_user_possible_fields (void);
const char **panel_get_user_possible_fields (gsize *); const char **panel_get_user_possible_fields (gsize *);
void panel_set_cwd (WPanel * panel, const char *path_str); void panel_set_cwd (WPanel * panel, const vfs_path_t * vpath);
void panel_set_lwd (WPanel * panel, const char *path_str); void panel_set_lwd (WPanel * panel, const vfs_path_t * vpath);
void panel_init (void); void panel_init (void);
void panel_deinit (void); void panel_deinit (void);

View File

@ -376,9 +376,13 @@ do_external_panelize (char *command)
current_panel->count = next_free; current_panel->count = next_free;
if (list->list[0].fname[0] == PATH_SEP) if (list->list[0].fname[0] == PATH_SEP)
{ {
vfs_path_t *vpath_root;
int ret; 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; (void) ret;
} }
} }

View File

@ -182,7 +182,7 @@ START_PARAMETRIZED_TEST (test_from_to_string, test_from_to_string_ds)
vfs_path_t *vpath; vfs_path_t *vpath;
size_t vpath_len; size_t vpath_len;
const vfs_path_element_t *path_element; 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); vpath = vfs_path_from_str_flags (data->input_string, VPF_USE_DEPRECATED_PARSER);