mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
VFS: Make functions vfs_canon_and_translate() and vfs_canon() as static in lib/vfs/path.c
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
parent
8ea49095c3
commit
405cc98cea
@ -34,6 +34,7 @@
|
||||
|
||||
#include "lib/global.h"
|
||||
#include "lib/strutil.h"
|
||||
#include "lib/util.h" /* concat_dir_and_file */
|
||||
|
||||
#include "vfs.h"
|
||||
#include "utilvfs.h"
|
||||
@ -120,6 +121,64 @@ _vfs_split_with_semi_skip_count (char *path, const char **inpath, const char **o
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/**
|
||||
* remove //, /./ and /../
|
||||
*
|
||||
* @return newly allocated string
|
||||
*/
|
||||
|
||||
static char *
|
||||
vfs_canon (const char *path)
|
||||
{
|
||||
if (!path)
|
||||
vfs_die ("Cannot canonicalize NULL");
|
||||
|
||||
/* Relative to current directory */
|
||||
if (*path != PATH_SEP)
|
||||
{
|
||||
char *local, *result, *curr_dir;
|
||||
|
||||
curr_dir = vfs_get_current_dir ();
|
||||
local = concat_dir_and_file (curr_dir, path);
|
||||
g_free (curr_dir);
|
||||
|
||||
result = vfs_canon (local);
|
||||
g_free (local);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* So we have path of following form:
|
||||
* /p1/p2#op/.././././p3#op/p4. Good luck.
|
||||
*/
|
||||
{
|
||||
char *result = g_strdup (path);
|
||||
canonicalize_pathname (result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/** canonize and translate path
|
||||
*
|
||||
* @return new string
|
||||
*/
|
||||
|
||||
static char *
|
||||
vfs_canon_and_translate (const char *path)
|
||||
{
|
||||
char *canon;
|
||||
char *result;
|
||||
if (path == NULL)
|
||||
canon = g_strdup ("");
|
||||
else
|
||||
canon = vfs_canon (path);
|
||||
result = vfs_translate_path_n (canon);
|
||||
g_free (canon);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/*** public functions ****************************************************************************/
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
@ -185,7 +244,7 @@ vfs_path_to_str (const vfs_path_t * vpath)
|
||||
*
|
||||
* @param path_str VFS-path
|
||||
*
|
||||
* @return pointer to newly created vfs_path_t object with filled elements array.
|
||||
* @return pointer to newly created vfs_path_t object with filled path elements array.
|
||||
*/
|
||||
|
||||
vfs_path_t *
|
||||
@ -202,9 +261,7 @@ vfs_path_from_str (const char *path_str)
|
||||
|
||||
vpath = vfs_path_new ();
|
||||
vpath->unparsed_encoding = g_strdup (vfs_get_encoding (path_str));
|
||||
|
||||
vpath->unparsed = vfs_canon_and_translate (path_str);
|
||||
|
||||
if (vpath->unparsed == NULL)
|
||||
{
|
||||
vfs_path_free (vpath);
|
||||
|
@ -471,22 +471,6 @@ vfs_translate_path_n (const char *path)
|
||||
return (result != NULL) ? g_strdup (result) : NULL;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
char *
|
||||
vfs_canon_and_translate (const char *path)
|
||||
{
|
||||
char *canon;
|
||||
char *result;
|
||||
if (path == NULL)
|
||||
canon = g_strdup ("");
|
||||
else
|
||||
canon = vfs_canon (path);
|
||||
result = vfs_translate_path_n (canon);
|
||||
g_free (canon);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/**
|
||||
* Get current directory without any OS calls.
|
||||
@ -527,42 +511,6 @@ vfs_set_raw_current_dir (const vfs_path_t * vpath)
|
||||
current_path = (vfs_path_t *) vpath;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/**
|
||||
* remove //, /./ and /../
|
||||
*/
|
||||
|
||||
char *
|
||||
vfs_canon (const char *path)
|
||||
{
|
||||
if (!path)
|
||||
vfs_die ("Cannot canonicalize NULL");
|
||||
|
||||
/* Relative to current directory */
|
||||
if (*path != PATH_SEP)
|
||||
{
|
||||
char *local, *result, *curr_dir;
|
||||
|
||||
curr_dir = vfs_get_current_dir ();
|
||||
local = concat_dir_and_file (curr_dir, path);
|
||||
g_free (curr_dir);
|
||||
|
||||
result = vfs_canon (local);
|
||||
g_free (local);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* So we have path of following form:
|
||||
* /p1/p2#op/.././././p3#op/p4. Good luck.
|
||||
*/
|
||||
{
|
||||
char *result = g_strdup (path);
|
||||
canonicalize_pathname (result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
/* Return TRUE is the current VFS class is local */
|
||||
|
||||
|
@ -236,7 +236,6 @@ void vfs_set_raw_current_dir (const vfs_path_t * vpath);
|
||||
gboolean vfs_current_is_local (void);
|
||||
gboolean vfs_file_is_local (const vfs_path_t * vpath);
|
||||
|
||||
char *vfs_canon (const char *path);
|
||||
char *vfs_strip_suffix_from_filename (const char *filename);
|
||||
char *vfs_translate_url (const char *url);
|
||||
|
||||
@ -250,8 +249,6 @@ vfs_class_flags_t vfs_file_class_flags (const vfs_path_t * vpath);
|
||||
* return static buffer */
|
||||
const char *vfs_get_encoding (const char *path);
|
||||
|
||||
/* canonize and translate path, return new string */
|
||||
char *vfs_canon_and_translate (const char *path);
|
||||
/* translate path back to terminal encoding, remove all #enc:
|
||||
* every invalid character is replaced with question mark
|
||||
* return static buffer */
|
||||
|
@ -499,12 +499,15 @@ edit_load_position (WEdit * edit)
|
||||
char *filename;
|
||||
long line, column;
|
||||
off_t offset;
|
||||
vfs_path_t *vpath;
|
||||
|
||||
if (!edit->filename || !*edit->filename)
|
||||
return;
|
||||
|
||||
filename = vfs_canon (edit->filename);
|
||||
vpath = vfs_path_from_str (edit->filename);
|
||||
filename = vfs_path_to_str (vpath);
|
||||
load_file_position (filename, &line, &column, &offset, &edit->serialized_bookmarks);
|
||||
vfs_path_free (vpath);
|
||||
g_free (filename);
|
||||
|
||||
if (line > 0)
|
||||
@ -532,11 +535,13 @@ static void
|
||||
edit_save_position (WEdit * edit)
|
||||
{
|
||||
char *filename;
|
||||
vfs_path_t *vpath;
|
||||
|
||||
if (edit->filename == NULL || *edit->filename == '\0')
|
||||
return;
|
||||
|
||||
filename = vfs_canon (edit->filename);
|
||||
vpath = vfs_path_from_str (edit->filename);
|
||||
filename = vfs_path_to_str (vpath);
|
||||
|
||||
book_mark_serialize (edit, BOOK_MARK_COLOR);
|
||||
save_file_position (filename, edit->curs_line + 1, edit->curs_col, edit->curs1,
|
||||
@ -544,6 +549,7 @@ edit_save_position (WEdit * edit)
|
||||
edit->serialized_bookmarks = NULL;
|
||||
|
||||
g_free (filename);
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -437,7 +437,7 @@ execute_with_vfs_arg (const char *command, const char *filename)
|
||||
/* Simplest case, this file is local */
|
||||
if (!filename || vfs_file_is_local (vpath))
|
||||
{
|
||||
fn = vfs_canon_and_translate (filename);
|
||||
fn = vfs_path_to_str (vpath);
|
||||
do_execute (command, fn, EXECUTE_INTERNAL);
|
||||
g_free (fn);
|
||||
vfs_path_free (vpath);
|
||||
|
@ -119,7 +119,6 @@ exec_extension (const char *filename, const char *lc_data, int *move_dir, int st
|
||||
else
|
||||
do_local_copy = 0;
|
||||
|
||||
vfs_path_free (vpath);
|
||||
/*
|
||||
* All commands should be run in /bin/sh regardless of user shell.
|
||||
* To do that, create temporary shell script and run it.
|
||||
@ -160,6 +159,7 @@ exec_extension (const char *filename, const char *lc_data, int *move_dir, int st
|
||||
g_free (localcopy);
|
||||
}
|
||||
g_free (file_name);
|
||||
vfs_path_free (vpath);
|
||||
return;
|
||||
}
|
||||
fputs (parameter, cmd_file);
|
||||
@ -229,6 +229,7 @@ exec_extension (const char *filename, const char *lc_data, int *move_dir, int st
|
||||
fclose (cmd_file);
|
||||
unlink (file_name);
|
||||
g_free (file_name);
|
||||
vfs_path_free (vpath);
|
||||
return;
|
||||
}
|
||||
mc_stat (localcopy, &mystat);
|
||||
@ -237,7 +238,7 @@ exec_extension (const char *filename, const char *lc_data, int *move_dir, int st
|
||||
}
|
||||
else
|
||||
{
|
||||
fn = vfs_canon_and_translate (filename);
|
||||
fn = vfs_path_to_str (vpath);
|
||||
text = quote_func (fn, 0);
|
||||
g_free (fn);
|
||||
}
|
||||
@ -375,6 +376,7 @@ exec_extension (const char *filename, const char *lc_data, int *move_dir, int st
|
||||
mc_ungetlocalcopy (filename, localcopy, localmtime != mystat.st_mtime);
|
||||
g_free (localcopy);
|
||||
}
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
@ -92,7 +92,11 @@ my_mkdir_rec (char *s, mode_t mode)
|
||||
}
|
||||
|
||||
p = concat_dir_and_file (s, "..");
|
||||
q = vfs_canon (p);
|
||||
{
|
||||
vfs_path_t *vpath = vfs_path_from_str (p);
|
||||
q = vfs_path_to_str (vpath);
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
g_free (p);
|
||||
|
||||
result = my_mkdir_rec (q, mode);
|
||||
@ -116,9 +120,13 @@ my_mkdir (const char *s, mode_t mode)
|
||||
result = mc_mkdir (s, mode);
|
||||
if (result)
|
||||
{
|
||||
char *p = vfs_canon (s);
|
||||
vfs_path_t *vpath;
|
||||
char *p;
|
||||
vpath = vfs_path_from_str (s);
|
||||
p = vfs_path_to_str (vpath);
|
||||
|
||||
result = my_mkdir_rec (p, mode);
|
||||
vfs_path_free (vpath);
|
||||
g_free (p);
|
||||
}
|
||||
if (result == 0)
|
||||
|
@ -236,10 +236,13 @@ mcview_done (mcview_t * view)
|
||||
if (mcview_remember_file_position && view->filename != NULL)
|
||||
{
|
||||
char *canon_fname;
|
||||
canon_fname = vfs_canon (view->filename);
|
||||
vfs_path_t *vpath;
|
||||
vpath = vfs_path_from_str (view->filename);
|
||||
canon_fname = vfs_path_to_str (vpath);
|
||||
save_file_position (canon_fname, -1, 0, view->dpy_start, view->saved_bookmarks);
|
||||
view->saved_bookmarks = NULL;
|
||||
g_free (canon_fname);
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
|
||||
/* Write back the global viewer mode */
|
||||
@ -290,7 +293,9 @@ mcview_set_codeset (mcview_t * view)
|
||||
const char *cp_id = NULL;
|
||||
|
||||
view->utf8 = TRUE;
|
||||
cp_id = get_codepage_id (mc_global.source_codepage >= 0 ? mc_global.source_codepage : mc_global.display_codepage);
|
||||
cp_id =
|
||||
get_codepage_id (mc_global.source_codepage >=
|
||||
0 ? mc_global.source_codepage : mc_global.display_codepage);
|
||||
if (cp_id != NULL)
|
||||
{
|
||||
GIConv conv;
|
||||
|
@ -387,12 +387,15 @@ mcview_load (mcview_t * view, const char *command, const char *file, int start_l
|
||||
char *canon_fname;
|
||||
long line, col;
|
||||
off_t new_offset;
|
||||
vfs_path_t *vpath;
|
||||
|
||||
canon_fname = vfs_canon (view->filename);
|
||||
vpath = vfs_path_from_str (view->filename);
|
||||
canon_fname = vfs_path_to_str (vpath);
|
||||
load_file_position (canon_fname, &line, &col, &new_offset, &view->saved_bookmarks);
|
||||
new_offset = min (new_offset, mcview_get_filesize (view));
|
||||
view->dpy_start = mcview_bol (view, new_offset, 0);
|
||||
g_free (canon_fname);
|
||||
vfs_path_free (vpath);
|
||||
}
|
||||
else if (start_line > 0)
|
||||
mcview_moveto (view, start_line - 1, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user