VFS: Added new function vfs_path_to_str_flags()

Signed-off-by: Slava Zanko <slavazanko@gmail.com>
This commit is contained in:
Slava Zanko 2011-11-26 23:12:52 +03:00
parent c68ce1efe4
commit 18d8b06238
3 changed files with 150 additions and 14 deletions

View File

@ -442,7 +442,7 @@ vfs_path_from_str_uri_parser (char *path)
url_delimiter += strlen (VFS_PATH_URL_DELIMITER);
sub = VFSDATA (element);
if (sub != NULL && sub->flags & VFS_S_REMOTE)
if (sub != NULL && (sub->flags & VFS_S_REMOTE) != 0)
{
slash_pointer = strchr (url_delimiter, PATH_SEP);
if (slash_pointer == NULL)
@ -534,29 +534,65 @@ vfs_path_tokens_add_class_info (vfs_path_element_t * element, GString * ret_toke
g_string_append (ret_tokens, element_tokens->str);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Strip path to home dir.
* @param dir pointer to string contains full path
*/
static char *
vfs_path_strip_home (const char *dir)
{
const char *home_dir = mc_config_get_home_dir ();
if (home_dir != NULL)
{
size_t len;
len = strlen (home_dir);
if (strncmp (dir, home_dir, len) == 0 && (dir[len] == PATH_SEP || dir[len] == '\0'))
return g_strdup_printf ("~%s", dir + len);
}
return g_strdup (dir);
}
/* --------------------------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/**
* Convert first elements_count elements from vfs_path_t to string representation.
* Convert first elements_count elements from vfs_path_t to string representation with flags.
*
* @param vpath pointer to vfs_path_t object
* @param elements_count count of first elements for convert
* @param flags flags for parser
* @param flags flags for converter
*
* @return pointer to newly created string.
*/
#define vfs_append_from_path(appendfrom) \
{ \
if ((*appendfrom != PATH_SEP) && (*appendfrom != '\0') \
&& (buffer->str[buffer->len - 1] != PATH_SEP)) \
g_string_append_c (buffer, PATH_SEP); \
g_string_append (buffer, appendfrom); \
if ((flags & VPF_STRIP_HOME) && element_index == 0 && (element->class->flags & VFSF_LOCAL) != 0) \
{ \
char *stripped_home_str; \
stripped_home_str = vfs_path_strip_home (appendfrom); \
g_string_append (buffer, stripped_home_str); \
g_free (stripped_home_str); \
} \
else \
{ \
if ((*appendfrom != PATH_SEP) && (*appendfrom != '\0') \
&& (buffer->str[buffer->len - 1] != PATH_SEP)) \
g_string_append_c (buffer, PATH_SEP); \
g_string_append (buffer, appendfrom); \
} \
}
char *
vfs_path_to_str_elements_count (const vfs_path_t * vpath, int elements_count)
vfs_path_to_str_flags (const vfs_path_t * vpath, int elements_count, vfs_path_flag_t flags)
{
int element_index;
GString *buffer;
@ -565,7 +601,7 @@ vfs_path_to_str_elements_count (const vfs_path_t * vpath, int elements_count)
if (vpath == NULL)
return NULL;
if (elements_count > vfs_path_elements_count (vpath))
if (elements_count == 0 || elements_count > vfs_path_elements_count (vpath))
elements_count = vfs_path_elements_count (vpath);
if (elements_count < 0)
@ -588,14 +624,15 @@ vfs_path_to_str_elements_count (const vfs_path_t * vpath, int elements_count)
g_string_append (buffer, element->vfs_prefix);
g_string_append (buffer, VFS_PATH_URL_DELIMITER);
url_str = vfs_path_build_url_params_str (element, TRUE);
url_str = vfs_path_build_url_params_str (element, !(flags & VPF_STRIP_PASSWORD));
if (*url_str != '\0')
g_string_append (buffer, url_str);
g_free (url_str);
}
if (vfs_path_element_need_cleanup_converter (element))
if ((flags & VPF_RECODE) == 0 && vfs_path_element_need_cleanup_converter (element))
{
if (buffer->str[buffer->len - 1] != PATH_SEP)
g_string_append (buffer, PATH_SEP_STR);
@ -616,6 +653,22 @@ vfs_path_to_str_elements_count (const vfs_path_t * vpath, int elements_count)
#undef vfs_append_from_path
/* --------------------------------------------------------------------------------------------- */
/**
* Convert first elements_count elements from vfs_path_t to string representation.
*
* @param vpath pointer to vfs_path_t object
* @param elements_count count of first elements for convert
*
* @return pointer to newly created string.
*/
char *
vfs_path_to_str_elements_count (const vfs_path_t * vpath, int elements_count)
{
return vfs_path_to_str_flags (vpath, elements_count, VPF_NONE);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Convert vfs_path_t to string representation.

View File

@ -11,7 +11,10 @@ typedef enum
{
VPF_NONE = 0,
VPF_NO_CANON = 1 << 0,
VPF_USE_DEPRECATED_PARSER = 1 << 1
VPF_USE_DEPRECATED_PARSER = 1 << 1,
VPF_RECODE = 1 << 2,
VPF_STRIP_HOME = 1 << 3,
VPF_STRIP_PASSWORD = 1 << 4
} vfs_path_flag_t;
/*** structures declarations (and typedefs of structures)*****************************************/
@ -55,6 +58,7 @@ int vfs_path_elements_count (const vfs_path_t * path);
char *vfs_path_to_str (const vfs_path_t * path);
char *vfs_path_to_str_elements_count (const vfs_path_t * path, int elements_count);
char *vfs_path_to_str_flags (const vfs_path_t * vpath, int elements_count, vfs_path_flag_t flags);
vfs_path_t *vfs_path_from_str (const char *path_str);
vfs_path_t *vfs_path_from_str_flags (const char *path_str, vfs_path_flag_t flags);
vfs_path_t *vfs_path_build_filename (const char *first_element, ...);

View File

@ -43,9 +43,14 @@
#include "src/vfs/local/local.c"
const char *mc_config_get_home_dir (void);
const char *
mc_config_get_home_dir (void)
{
return "/mock/home";
}
struct vfs_s_subclass test_subclass1, test_subclass2, test_subclass3;
struct vfs_class vfs_test_ops1, vfs_test_ops2, vfs_test_ops3;
static void
setup (void)
@ -58,6 +63,7 @@ teardown (void)
}
/* --------------------------------------------------------------------------------------------- */
#define path_recode_one_check(input, etalon1, etalon2) {\
vpath = vfs_path_from_str (input);\
element = vfs_path_get_by_index(vpath, -1);\
@ -96,6 +102,8 @@ START_TEST (test_path_recode_base_utf8)
}
END_TEST
/* --------------------------------------------------------------------------------------------- */
START_TEST (test_path_recode_base_koi8r)
{
vfs_path_t *vpath;
@ -125,6 +133,75 @@ START_TEST (test_path_recode_base_koi8r)
END_TEST
/* --------------------------------------------------------------------------------------------- */
struct vfs_s_subclass test_subclass1;
struct vfs_class vfs_test_ops1;
START_TEST(test_path_to_str_flags)
{
vfs_path_t *vpath;
char *str_path;
str_init_strings ("UTF-8");
vfs_init ();
init_localfs ();
vfs_setup_work_dir ();
mc_global.sysconfig_dir = (char *) TEST_SHARE_DIR;
mc_global.sysconfig_dir = (char *) TEST_SHARE_DIR;
load_codepages_list ();
test_subclass1.flags = VFS_S_REMOTE;
vfs_s_init_class (&vfs_test_ops1, &test_subclass1);
vfs_test_ops1.name = "testfs1";
vfs_test_ops1.flags = VFSF_NOLINKS;
vfs_test_ops1.prefix = "test1";
vfs_register_class (&vfs_test_ops1);
vpath = vfs_path_from_str ("/test1://user:passwd@host.name/#enc:KOI8-R/ÑеÑ<C2B5>ÑовÑй/путь");
str_path = vfs_path_to_str_flags (vpath, 0, VPF_STRIP_PASSWORD);
fail_unless (strcmp ("/test1://user@host.name/#enc:KOI8-R/ÑеÑ<C2B5>ÑовÑй/путь", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
str_path = vfs_path_to_str_flags (vpath, 0, VPF_RECODE);
fail_unless (strcmp ("/test1://user:passwd@host.name/ÔÅÓÔÏ×ÙÊ/ÐÕÔØ", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
str_path = vfs_path_to_str_flags (vpath, 0, VPF_RECODE | VPF_STRIP_PASSWORD);
fail_unless (strcmp ("/test1://user@host.name/ÔÅÓÔÏ×ÙÊ/ÐÕÔØ", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
vfs_path_free (vpath);
vpath = vfs_path_build_filename (mc_config_get_home_dir (), "test", "dir", NULL);
str_path = vfs_path_to_str_flags (vpath, 0, VPF_STRIP_HOME);
fail_unless (strcmp ("~/test/dir", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
vfs_path_free (vpath);
vpath = vfs_path_build_filename (mc_config_get_home_dir (), "test1://user:passwd@host.name/#enc:KOI8-R/ÑеÑ<C2B5>ÑовÑй/путь", NULL);
str_path = vfs_path_to_str_flags (vpath, 0, VPF_STRIP_HOME | VPF_STRIP_PASSWORD);
fail_unless (strcmp ("~/test1://user@host.name/#enc:KOI8-R/ÑеÑ<C2B5>ÑовÑй/путь", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
str_path = vfs_path_to_str_flags (vpath, 0, VPF_STRIP_HOME | VPF_RECODE);
fail_unless (strcmp ("~/test1://user:passwd@host.name/ÔÅÓÔÏ×ÙÊ/ÐÕÔØ", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
str_path = vfs_path_to_str_flags (vpath, 0, VPF_STRIP_HOME | VPF_RECODE | VPF_STRIP_PASSWORD);
fail_unless (strcmp ("~/test1://user@host.name/ÔÅÓÔÏ×ÙÊ/ÐÕÔØ", str_path) == 0, "\nstr=%s\n", str_path);
g_free (str_path);
vfs_path_free (vpath);
free_codepages_list ();
str_uninit_strings ();
vfs_shut ();
}
END_TEST
/* --------------------------------------------------------------------------------------------- */
int
main (void)
@ -140,10 +217,12 @@ main (void)
/* Add new tests here: *************** */
tcase_add_test (tc_core, test_path_recode_base_utf8);
tcase_add_test (tc_core, test_path_recode_base_koi8r);
tcase_add_test (tc_core, test_path_to_str_flags);
/* *********************************** */
suite_add_tcase (s, tc_core);
sr = srunner_create (s);
srunner_print (sr, CK_VERBOSE);
srunner_set_log (sr, "path_recode.log");
srunner_run_all (sr, CK_NORMAL);
number_failed = srunner_ntests_failed (sr);