The following commit has been merged in the master branch: commit 3b8f37b99e551eb1db84b8136f828c4165e4be6f Author: Patrick Winnertz <win...@debian.org> Date: Fri Feb 6 11:17:03 2009 +0100
Moved some functions out of mhl into src/util.c This commit moves the mhl_str_concat_dir_and_file back into src/util.c whitout changing atm the functionality. Please note that this is an incomplete fix and needs to be partially enhanced in order to keep the full functionality with glib. Signed-off-by: Patrick Winnertz <win...@debian.org> diff --git a/edit/edit.c b/edit/edit.c index e8c0c8e..12f5b72 100644 --- a/edit/edit.c +++ b/edit/edit.c @@ -2667,7 +2667,7 @@ user_menu (WEdit * edit) int nomark; struct stat status; long start_mark, end_mark; - char *block_file = mhl_str_dir_plus_file (home_dir, BLOCK_FILE); + char *block_file = concat_dir_and_file (home_dir, BLOCK_FILE); int rc = 0; nomark = eval_marks (edit, &start_mark, &end_mark); diff --git a/edit/editcmd.c b/edit/editcmd.c index 6d3c2ed..26930c6 100644 --- a/edit/editcmd.c +++ b/edit/editcmd.c @@ -215,7 +215,7 @@ edit_save_file (WEdit *edit, const char *filename) return 0; if (*filename != PATH_SEP && edit->dir) { - savename = mhl_str_dir_plus_file (edit->dir, filename); + savename = concat_dir_and_file (edit->dir, filename); filename = catstrs (savename, (char *) NULL); g_free (savename); } @@ -281,7 +281,7 @@ edit_save_file (WEdit *edit, const char *filename) savedir[slashpos - filename + 1] = '\0'; } else savedir = mhl_str_dup ("."); - saveprefix = mhl_str_dir_plus_file (savedir, "cooledit"); + saveprefix = concat_dir_and_file (savedir, "cooledit"); g_free (savedir); fd = mc_mkstemps (&savename, saveprefix, NULL); g_free (saveprefix); diff --git a/edit/editwidget.c b/edit/editwidget.c index 8fb8c14..89e0a5a 100644 --- a/edit/editwidget.c +++ b/edit/editwidget.c @@ -176,7 +176,7 @@ edit_file (const char *_file, int line) WButtonBar *edit_bar; if (!made_directory) { - char *dir = mhl_str_dir_plus_file (home_dir, EDIT_DIR); + char *dir = concat_dir_and_file (home_dir, EDIT_DIR); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); } diff --git a/edit/syntax.c b/edit/syntax.c index 8fdea33..427d24e 100644 --- a/edit/syntax.c +++ b/edit/syntax.c @@ -1026,7 +1026,7 @@ edit_read_syntax_file (WEdit * edit, char ***pnames, const char *syntax_file, f = fopen (syntax_file, "r"); if (!f){ - lib_file = mhl_str_dir_plus_file (mc_home, "syntax" PATH_SEP_STR "Syntax"); + lib_file = concat_dir_and_file (mc_home, "syntax" PATH_SEP_STR "Syntax"); f = fopen (lib_file, "r"); g_free (lib_file); if (!f) @@ -1187,7 +1187,7 @@ edit_load_syntax (WEdit *edit, char ***pnames, const char *type) if (!*edit->filename && !type) return; } - f = mhl_str_dir_plus_file (home_dir, SYNTAX_FILE); + f = concat_dir_and_file (home_dir, SYNTAX_FILE); r = edit_read_syntax_file (edit, pnames, f, edit ? edit->filename : 0, get_first_editor_line (edit), type); if (r == -1) { diff --git a/edit/usermap.c b/edit/usermap.c index e30c011..bb8e0db 100644 --- a/edit/usermap.c +++ b/edit/usermap.c @@ -599,7 +599,7 @@ edit_load_user_map(WEdit *edit) if (edit_key_emulation != EDIT_KEY_EMULATION_USER) return TRUE; - file = mhl_str_dir_plus_file(home_dir, MC_USERMAP); + file = concat_dir_and_file(home_dir, MC_USERMAP); if (stat(file, &s) < 0) { char *msg = g_strdup_printf(_("%s not found!"), file); diff --git a/src/charsets.c b/src/charsets.c index f2e69e0..10bbefc 100644 --- a/src/charsets.c +++ b/src/charsets.c @@ -50,7 +50,7 @@ load_codepages_list (void) extern int display_codepage; char *default_codepage = NULL; - fname = mhl_str_dir_plus_file (mc_home, CHARSETS_INDEX); + fname = concat_dir_and_file (mc_home, CHARSETS_INDEX); if (!(f = fopen (fname, "r"))) { fprintf (stderr, _("Warning: file %s not found\n"), fname); g_free (fname); diff --git a/src/cmd.c b/src/cmd.c index 0bab86e..048037d 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -374,7 +374,7 @@ mkdir_cmd (void) if (dir[0] == '/' || dir[0] == '~') absdir = g_strdup (dir); else - absdir = mhl_str_dir_plus_file (current_panel->cwd, dir); + absdir = concat_dir_and_file (current_panel->cwd, dir); save_cwds_stat (); if (my_mkdir (absdir, 0777) == 0) { @@ -580,10 +580,10 @@ void ext_cmd (void) _(" Which extension file you want to edit? "), D_NORMAL, 2, _("&User"), _("&System Wide")); } - extdir = mhl_str_dir_plus_file (mc_home, MC_LIB_EXT); + extdir = concat_dir_and_file (mc_home, MC_LIB_EXT); if (dir == 0){ - buffer = mhl_str_dir_plus_file (home_dir, MC_USER_EXT); + buffer = concat_dir_and_file (home_dir, MC_USER_EXT); check_for_default (extdir, buffer); do_edit (buffer); g_free (buffer); @@ -610,7 +610,7 @@ menu_edit_cmd (int where) _("&Local"), _("&User"), _("&System Wide") ); - menufile = mhl_str_dir_plus_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); + menufile = concat_dir_and_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); switch (dir) { case 0: @@ -619,12 +619,12 @@ menu_edit_cmd (int where) break; case 1: - buffer = mhl_str_dir_plus_file (home_dir, where ? CEDIT_HOME_MENU : MC_HOME_MENU); + buffer = concat_dir_and_file (home_dir, where ? CEDIT_HOME_MENU : MC_HOME_MENU); check_for_default (menufile, buffer); break; case 2: - buffer = mhl_str_dir_plus_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); + buffer = concat_dir_and_file (mc_home, where ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); break; default: @@ -683,10 +683,10 @@ edit_syntax_cmd (void) _(" Which syntax file you want to edit? "), D_NORMAL, 2, _("&User"), _("&System Wide")); } - extdir = mhl_str_dir_plus_file (mc_home, "syntax" PATH_SEP_STR "Syntax"); + extdir = concat_dir_and_file (mc_home, "syntax" PATH_SEP_STR "Syntax"); if (dir == 0) { - buffer = mhl_str_dir_plus_file (home_dir, SYNTAX_FILE); + buffer = concat_dir_and_file (home_dir, SYNTAX_FILE); check_for_default (extdir, buffer); do_edit (buffer); g_free (buffer); @@ -817,8 +817,8 @@ compare_dir (WPanel *panel, WPanel *other, enum CompareMode mode) } /* Thorough compare on, do byte-by-byte comparison */ - src_name = mhl_str_dir_plus_file (panel->cwd, source->fname); - dst_name = mhl_str_dir_plus_file (other->cwd, target->fname); + src_name = concat_dir_and_file (panel->cwd, source->fname); + dst_name = concat_dir_and_file (other->cwd, target->fname); if (compare_files (src_name, dst_name, source->st.st_size)) do_file_mark (panel, i, 1); g_free (src_name); @@ -932,10 +932,10 @@ do_link (int symbolic_link, const char *fname) char *d; /* suggest the full path for symlink */ - s = mhl_str_dir_plus_file (current_panel->cwd, fname); + s = concat_dir_and_file (current_panel->cwd, fname); if (get_other_type () == view_listing) { - d = mhl_str_dir_plus_file (other_panel->cwd, fname); + d = concat_dir_and_file (other_panel->cwd, fname); } else { d = g_strdup (fname); } diff --git a/src/command.c b/src/command.c index 07f66dc..a21da8c 100644 --- a/src/command.c +++ b/src/command.c @@ -67,7 +67,7 @@ examine_cd (char *path) const char *t; /* Tilde expansion */ - path = mhl_shell_unescape_buf(path); + path = shell_unescape(path); path_tilde = tilde_expand (path); /* Leave space for further expansion */ @@ -128,7 +128,7 @@ examine_cd (char *path) c = *s; *s = 0; if (*p) { - r = mhl_str_dir_plus_file (p, q); + r = concat_dir_and_file (p, q); result = do_cd (r, cd_parse_command); g_free (r); } @@ -180,7 +180,7 @@ void do_cd_command (char *cmd) } else { char *old = current_panel->cwd; char *new; - new = mhl_str_dir_plus_file (old, cmd+3); + new = concat_dir_and_file (old, cmd+3); sync_tree (new); g_free (new); } diff --git a/src/complete.c b/src/complete.c index 6a7b19d..44858c3 100644 --- a/src/complete.c +++ b/src/complete.c @@ -86,7 +86,7 @@ filename_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags) SHOW_C_CTX("filename_completion_function"); if (text && (flags & INPUT_COMPLETE_SHELL_ESC)) - text = mhl_shell_unescape_buf (text); + text = shell_unescape (text); /* If we're starting the match process, initialize us a bit. */ if (!state){ @@ -206,7 +206,7 @@ filename_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags) if (temp && (flags & INPUT_COMPLETE_SHELL_ESC)) { - temp = mhl_shell_escape_dup(temp); + temp = shell_escape(temp); } return temp; } @@ -461,7 +461,7 @@ command_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags) if (!(flags & INPUT_COMPLETE_COMMANDS)) return 0; - text = mhl_shell_unescape_buf(text); + text = shell_unescape(text); flags &= ~INPUT_COMPLETE_SHELL_ESC; if (!state) { /* Initialize us a little bit */ @@ -484,7 +484,7 @@ command_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags) p = filename_completion_function (text, state, flags); if (!p) return 0; - p = mhl_shell_escape_dup(p); + p = shell_escape(p); return p; } @@ -517,7 +517,7 @@ command_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags) if (cur_path >= path_end) break; expanded = tilde_expand (*cur_path ? cur_path : "."); - cur_word = mhl_str_dir_plus_file (expanded, text); + cur_word = concat_dir_and_file (expanded, text); g_free (expanded); canonicalize_pathname (cur_word); cur_path = strchr (cur_path, 0) + 1; @@ -540,7 +540,7 @@ command_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags) } if ((p = strrchr (found, PATH_SEP)) != NULL) { p++; - p = mhl_shell_escape_dup(p); + p = shell_escape(p); g_free(found); return p; } @@ -811,7 +811,7 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags) c = *s; *s = 0; if (*cdpath){ - r = mhl_str_dir_plus_file (cdpath, word); + r = concat_dir_and_file (cdpath, word); SHOW_C_CTX("try_complete:filename_subst_2"); matches = completion_matches (r, filename_completion_function, flags); g_free (r); diff --git a/src/cons.handler.c b/src/cons.handler.c index 1fe35b0..b08c266 100644 --- a/src/cons.handler.c +++ b/src/cons.handler.c @@ -28,8 +28,6 @@ #endif #include <unistd.h> -#include <mhl/string.h> - #include "global.h" #include "tty.h" #include "cons.saver.h" @@ -145,7 +143,7 @@ handle_console_linux (unsigned char action) open ("/dev/null", O_WRONLY); if (tty_name) { /* Exec the console save/restore handler */ - mc_conssaver = mhl_str_dir_plus_file (SAVERDIR, "cons.saver"); + mc_conssaver = concat_dir_and_file (SAVERDIR, "cons.saver"); execl (mc_conssaver, "cons.saver", tty_name, (char *) NULL); } /* Console is not a tty or execl() failed */ diff --git a/src/cons.saver.c b/src/cons.saver.c index 7086cd6..ccd0647 100644 --- a/src/cons.saver.c +++ b/src/cons.saver.c @@ -53,8 +53,6 @@ #endif #include <unistd.h> -#include <mhl/string.h> - #define LINUX_CONS_SAVER_C #include "cons.saver.h" diff --git a/src/ext.c b/src/ext.c index 8d7abef..827e8a2 100644 --- a/src/ext.c +++ b/src/ext.c @@ -442,11 +442,11 @@ regex_command (const char *filename, const char *action, int *move_dir) int mc_user_ext = 1; int home_error = 0; - extension_file = mhl_str_dir_plus_file (home_dir, MC_USER_EXT); + extension_file = concat_dir_and_file (home_dir, MC_USER_EXT); if (!exist_file (extension_file)) { g_free (extension_file); check_stock_mc_ext: - extension_file = mhl_str_dir_plus_file (mc_home, MC_LIB_EXT); + extension_file = concat_dir_and_file (mc_home, MC_LIB_EXT); mc_user_ext = 0; } data = load_file (extension_file); diff --git a/src/file.c b/src/file.c index 4ef043c..dd0e8f1 100644 --- a/src/file.c +++ b/src/file.c @@ -181,7 +181,7 @@ do_transform_source (FileOpContext *ctx, const char *source) for (next_reg = 1, j = 0, k = 0; j < strlen (ctx->dest_mask); j++) { switch (ctx->dest_mask[j]) { case '\\': - if (mhl_shell_is_char_escaped (&ctx->dest_mask[j])){ + if (shell_is_char_escaped (&ctx->dest_mask[j])){ fntarget[k++] = ctx->dest_mask[j++]; fntarget[k++] = ctx->dest_mask[j]; break; @@ -922,7 +922,7 @@ copy_dir_dir (FileOpContext *ctx, const char *s, const char *d, int toplevel, } /* Dive into subdir if exists */ if (toplevel && ctx->dive_into_subdirs) { - dest_dir = mhl_str_dir_plus_file (d, x_basename (s)); + dest_dir = concat_dir_and_file (d, x_basename (s)); } else { dest_dir = g_strdup (d); goto dont_mkdir; @@ -968,11 +968,11 @@ copy_dir_dir (FileOpContext *ctx, const char *s, const char *d, int toplevel, continue; /* get the filename and add it to the src directory */ - path = mhl_str_dir_plus_file (s, next->d_name); + path = concat_dir_and_file (s, next->d_name); (*ctx->stat_func) (path, &buf); if (S_ISDIR (buf.st_mode)) { - mdpath = mhl_str_dir_plus_file (dest_dir, next->d_name); + mdpath = concat_dir_and_file (dest_dir, next->d_name); /* * From here, we just intend to recursively copy subdirs, not * the double functionality of copying different when the target @@ -983,7 +983,7 @@ copy_dir_dir (FileOpContext *ctx, const char *s, const char *d, int toplevel, parent_dirs, progress_count, progress_bytes); g_free (mdpath); } else { - dest_file = mhl_str_dir_plus_file (dest_dir, x_basename (path)); + dest_file = concat_dir_and_file (dest_dir, x_basename (path)); return_status = copy_file_file (ctx, path, dest_file, 1, progress_count, progress_bytes, 0); g_free (dest_file); @@ -1173,7 +1173,7 @@ move_dir_dir (FileOpContext *ctx, const char *s, const char *d, destdir = g_strdup (d); move_over = 1; } else - destdir = mhl_str_dir_plus_file (d, x_basename (s)); + destdir = concat_dir_and_file (d, x_basename (s)); if (sbuf.st_dev == dbuf.st_dev && sbuf.st_ino == dbuf.st_ino) { int msize = COLS - 36; @@ -1330,7 +1330,7 @@ recursive_erase (FileOpContext *ctx, const char *s, off_t *progress_count, continue; if (!strcmp (next->d_name, "..")) continue; - path = mhl_str_dir_plus_file (s, next->d_name); + path = concat_dir_and_file (s, next->d_name); if (mc_lstat (path, &buf)) { g_free (path); mc_closedir (reading); @@ -1521,7 +1521,7 @@ compute_dir_size (const char *dirname, off_t *ret_marked, double *ret_total) if (strcmp (dirent->d_name, "..") == 0) continue; - fullname = mhl_str_dir_plus_file (dirname, dirent->d_name); + fullname = concat_dir_and_file (dirname, dirent->d_name); res = mc_lstat (fullname, &s); @@ -1578,7 +1578,7 @@ panel_compute_totals (WPanel *panel, off_t *ret_marked, double *ret_total) double subdir_bytes = 0; dir_name = - mhl_str_dir_plus_file (panel->cwd, panel->dir.list[i].fname); + concat_dir_and_file (panel->cwd, panel->dir.list[i].fname); compute_dir_size (dir_name, &subdir_count, &subdir_bytes); *ret_marked += subdir_count; @@ -1886,7 +1886,7 @@ panel_operate (void *source_panel, FileOperation operation, /* The source and src_stat variables have been initialized before */ #ifdef WITH_FULL_PATHS - source_with_path = mhl_str_dir_plus_file (panel->cwd, source); + source_with_path = concat_dir_and_file (panel->cwd, source); #endif /* WITH_FULL_PATHS */ if (operation == OP_DELETE) { @@ -1901,7 +1901,7 @@ panel_operate (void *source_panel, FileOperation operation, if (temp == NULL) { value = transform_error; } else { - char *temp2 = mhl_str_dir_plus_file (dest, temp); + char *temp2 = concat_dir_and_file (dest, temp); g_free (dest); dest = temp2; temp = NULL; @@ -1979,7 +1979,7 @@ panel_operate (void *source_panel, FileOperation operation, #ifdef WITH_FULL_PATHS g_free (source_with_path); - source_with_path = mhl_str_dir_plus_file (panel->cwd, source); + source_with_path = concat_dir_and_file (panel->cwd, source); #endif /* WITH_FULL_PATHS */ if (operation == OP_DELETE) { @@ -1995,10 +1995,10 @@ panel_operate (void *source_panel, FileOperation operation, if (temp == NULL) value = transform_error; else { - char *temp2 = mhl_str_dir_plus_file (dest, temp); + char *temp2 = concat_dir_and_file (dest, temp); - source_with_path = mhl_shell_unescape_buf(source_with_path); - temp2 = mhl_shell_unescape_buf(temp2); + source_with_path = shell_unescape(source_with_path); + temp2 = shell_unescape(temp2); switch (operation) { case OP_COPY: diff --git a/src/filenot.c b/src/filenot.c index c1fcffa..c83c7d8 100644 --- a/src/filenot.c +++ b/src/filenot.c @@ -40,7 +40,7 @@ get_absolute_name (const char *file) if (file[0] == PATH_SEP) return g_strdup (file); mc_get_current_wd (dir, MC_MAXPATHLEN); - return mhl_str_dir_plus_file (dir, file); + return concat_dir_and_file (dir, file); } static int @@ -63,7 +63,7 @@ my_mkdir_rec (char *s, mode_t mode) return -1; } - p = mhl_str_dir_plus_file (s, ".."); + p = concat_dir_and_file (s, ".."); q = vfs_canon (p); g_free (p); diff --git a/src/find.c b/src/find.c index 517a219..48c73a2 100644 --- a/src/find.c +++ b/src/find.c @@ -357,7 +357,7 @@ push_directory (const char *dir) dir_stack *new; new = g_new (dir_stack, 1); - new->name = mhl_str_dir_plus_file (dir, NULL); + new->name = concat_dir_and_file (dir, ""); new->prev = dir_stack_base; dir_stack_base = new; } @@ -519,7 +519,7 @@ search_content (Dlg_head *h, const char *directory, const char *filename) int file_fd; int ret_val = 0; - fname = mhl_str_dir_plus_file (directory, filename); + fname = concat_dir_and_file (directory, filename); if (mc_stat (fname, &s) != 0 || !S_ISREG (s.st_mode)){ g_free (fname); @@ -695,7 +695,7 @@ do_search (struct Dlg_head *h) } if (subdirs_left && find_recursively && directory) { /* Can directory be NULL ? */ - char *tmp_name = mhl_str_dir_plus_file (directory, dp->d_name); + char *tmp_name = concat_dir_and_file (directory, dp->d_name); if (!mc_lstat (tmp_name, &tmp_stat) && S_ISDIR (tmp_stat.st_mode)) { push_directory (tmp_name); @@ -755,8 +755,8 @@ make_fullname (const char *dirname, const char *filename) if (strcmp(dirname, ".") == 0 || strcmp(dirname, "."PATH_SEP_STR) == 0) return g_strdup (filename); if (strncmp(dirname, "."PATH_SEP_STR, 2) == 0) - return mhl_str_dir_plus_file (dirname + 2, filename); - return mhl_str_dir_plus_file (dirname, filename); + return concat_dir_and_file (dirname + 2, filename); + return concat_dir_and_file (dirname, filename); } static void diff --git a/src/hotlist.c b/src/hotlist.c index ee8f3bd..28b94cf 100644 --- a/src/hotlist.c +++ b/src/hotlist.c @@ -1449,7 +1449,7 @@ load_hotlist (void) } if (!hotlist_file_name) - hotlist_file_name = mhl_str_dir_plus_file (home_dir, HOTLIST_FILENAME); + hotlist_file_name = concat_dir_and_file (home_dir, HOTLIST_FILENAME); hotlist = new_hotlist (); hotlist->type = HL_TYPE_GROUP; diff --git a/src/main.c b/src/main.c index 367663a..5bdc7e9 100644 --- a/src/main.c +++ b/src/main.c @@ -1138,7 +1138,7 @@ copy_readlink (WPanel *panel) if (S_ISLNK (selection (panel)->st.st_mode)) { char buffer[MC_MAXPATHLEN]; char *p = - mhl_str_dir_plus_file (panel->cwd, selection (panel)->fname); + concat_dir_and_file (panel->cwd, selection (panel)->fname); int i; i = mc_readlink (p, buffer, MC_MAXPATHLEN - 1); diff --git a/src/screen.c b/src/screen.c index 9810287..6321720 100644 --- a/src/screen.c +++ b/src/screen.c @@ -711,7 +711,7 @@ display_mini_info (WPanel *panel) char *link, link_target [MC_MAXPATHLEN]; int len; - link = mhl_str_dir_plus_file (panel->cwd, panel->dir.list [panel->selected].fname); + link = concat_dir_and_file (panel->cwd, panel->dir.list [panel->selected].fname); len = mc_readlink (link, link_target, MC_MAXPATHLEN - 1); g_free (link); if (len > 0){ @@ -1976,7 +1976,7 @@ do_enter_on_file_entry (file_entry *fe) return 1; /* Check if the file is executable */ - full_name = mhl_str_dir_plus_file (current_panel->cwd, fe->fname); + full_name = concat_dir_and_file (current_panel->cwd, fe->fname); if (!is_exe (fe->st.st_mode) || !if_link_is_exe (full_name, fe)) { g_free (full_name); return 0; @@ -1995,7 +1995,7 @@ do_enter_on_file_entry (file_entry *fe) char *tmp; int ret; - tmp = mhl_str_dir_plus_file (vfs_get_current_dir (), fe->fname); + tmp = concat_dir_and_file (vfs_get_current_dir (), fe->fname); ret = mc_setctl (tmp, VFS_SETCTL_RUN, NULL); g_free (tmp); /* We took action only if the dialog was shown or the execution @@ -2032,10 +2032,10 @@ chdir_other_panel (WPanel *panel) } if (!S_ISDIR (panel->dir.list [panel->selected].st.st_mode)) { - new_dir = mhl_str_dir_plus_file (panel->cwd, ".."); + new_dir = concat_dir_and_file (panel->cwd, ".."); sel_entry = strrchr(panel->cwd, PATH_SEP); } else - new_dir = mhl_str_dir_plus_file (panel->cwd, panel->dir.list [panel->selected].fname); + new_dir = concat_dir_and_file (panel->cwd, panel->dir.list [panel->selected].fname); change_panel (); do_cd (new_dir, cd_exact); @@ -2101,7 +2101,7 @@ chdir_to_readlink (WPanel *panel) if (*buffer == PATH_SEP) new_dir = g_strdup (buffer); else - new_dir = mhl_str_dir_plus_file (panel->cwd, buffer); + new_dir = concat_dir_and_file (panel->cwd, buffer); change_panel (); do_cd (new_dir, cd_exact); diff --git a/src/setup.c b/src/setup.c index 8e6ae1d..d434996 100644 --- a/src/setup.c +++ b/src/setup.c @@ -286,7 +286,7 @@ save_layout (void) int i; char buffer [BUF_TINY]; - profile = mhl_str_dir_plus_file (home_dir, PROFILE_NAME); + profile = concat_dir_and_file (home_dir, PROFILE_NAME); /* Save integer options */ for (i = 0; layout [i].opt_name; i++){ @@ -303,7 +303,7 @@ save_configure (void) char *profile; int i; - profile = mhl_str_dir_plus_file (home_dir, PROFILE_NAME); + profile = concat_dir_and_file (home_dir, PROFILE_NAME); /* Save integer options */ for (i = 0; int_options[i].opt_name; i++) @@ -351,7 +351,7 @@ save_setup (void) char *profile; saving_setup = 1; - profile = mhl_str_dir_plus_file (home_dir, PROFILE_NAME); + profile = concat_dir_and_file (home_dir, PROFILE_NAME); save_configure (); @@ -486,9 +486,9 @@ setup_init (void) if (profile_name) return profile_name; - profile = mhl_str_dir_plus_file (home_dir, PROFILE_NAME); + profile = concat_dir_and_file (home_dir, PROFILE_NAME); if (!exist_file (profile)){ - inifile = mhl_str_dir_plus_file (mc_home, "mc.ini"); + inifile = concat_dir_and_file (mc_home, "mc.ini"); if (exist_file (inifile)){ g_free (profile); profile = inifile; @@ -511,7 +511,7 @@ load_setup (void) /* mc.lib is common for all users, but has priority lower than ~/.mc/ini. FIXME: it's only used for keys and treestore now */ - global_profile_name = mhl_str_dir_plus_file (mc_home, "mc.lib"); + global_profile_name = concat_dir_and_file (mc_home, "mc.lib"); /* Load integer boolean options */ for (i = 0; int_options[i].opt_name; i++) diff --git a/src/treestore.c b/src/treestore.c index 91cfb1e..f492d9f 100644 --- a/src/treestore.c +++ b/src/treestore.c @@ -268,7 +268,7 @@ tree_store_load(void) char *name; int retval; - name = mhl_str_dir_plus_file(home_dir, MC_TREE); + name = concat_dir_and_file(home_dir, MC_TREE); retval = tree_store_load_from(name); g_free(name); @@ -374,7 +374,7 @@ tree_store_save(void) char *name; int retval; - tmp = mhl_str_dir_plus_file(home_dir, MC_TREE_TMP); + tmp = concat_dir_and_file(home_dir, MC_TREE_TMP); retval = tree_store_save_to(tmp); if (retval) { @@ -382,7 +382,7 @@ tree_store_save(void) return retval; } - name = mhl_str_dir_plus_file(home_dir, MC_TREE); + name = concat_dir_and_file(home_dir, MC_TREE); retval = rename(tmp, name); g_free(tmp); @@ -608,7 +608,7 @@ tree_store_mark_checked(const char *subname) if (ts.check_name[0] == PATH_SEP && ts.check_name[1] == 0) name = g_strconcat(PATH_SEP_STR, subname, (char *) NULL); else - name = mhl_str_dir_plus_file(ts.check_name, subname); + name = concat_dir_and_file(ts.check_name, subname); /* Search for the subdirectory */ current = ts.check_start; @@ -798,7 +798,7 @@ tree_store_rescan(const char *dir) continue; } - full_name = mhl_str_dir_plus_file(dir, dp->d_name); + full_name = concat_dir_and_file(dir, dp->d_name); if (mc_lstat(full_name, &buf) != -1) { if (S_ISDIR(buf.st_mode)) tree_store_mark_checked(dp->d_name); diff --git a/src/user.c b/src/user.c index 14e3d69..f3881cd 100644 --- a/src/user.c +++ b/src/user.c @@ -724,11 +724,11 @@ user_menu_cmd (struct WEdit *edit_widget) menu = g_strdup (edit_widget ? CEDIT_LOCAL_MENU : MC_LOCAL_MENU); if (!exist_file (menu) || !menu_file_own (menu)){ g_free (menu); - menu = mhl_str_dir_plus_file \ + menu = concat_dir_and_file \ (home_dir, edit_widget ? CEDIT_HOME_MENU : MC_HOME_MENU); if (!exist_file (menu)){ g_free (menu); - menu = mhl_str_dir_plus_file \ + menu = concat_dir_and_file \ (mc_home, edit_widget ? CEDIT_GLOBAL_MENU : MC_GLOBAL_MENU); } } diff --git a/src/util.c b/src/util.c index 3b8d934..22c172a 100644 --- a/src/util.c +++ b/src/util.c @@ -694,7 +694,7 @@ load_mc_home_file (const char *filename, char **allocated_filename) char *lang; char *data; - hintfile_base = mhl_str_dir_plus_file (mc_home, filename); + hintfile_base = concat_dir_and_file (mc_home, filename); lang = guess_message_value (); hintfile = g_strconcat (hintfile_base, ".", lang, (char *) NULL); @@ -1253,6 +1253,18 @@ diff_two_paths (const char *first, const char *second) return buf; } +/* If filename is NULL, then we just append PATH_SEP to the dir */ +char * +concat_dir_and_file (const char *dir, const char *file) +{ + int i = strlen (dir); + + if (dir [i-1] == PATH_SEP) + return g_strconcat (dir, file, (char *) NULL); + else + return g_strconcat (dir, PATH_SEP_STR, file, (char *) NULL); +} + /* Append text to GList, remove all entries with the same text */ GList * list_append_unique (GList *list, char *text) @@ -1313,7 +1325,7 @@ mc_mkstemps (char **pname, const char *prefix, const char *suffix) if (strchr (prefix, PATH_SEP) == NULL) { /* Add prefix first to find the position of XXXXXX */ - tmpbase = mhl_str_dir_plus_file (mc_tmpdir (), prefix); + tmpbase = concat_dir_and_file (mc_tmpdir (), prefix); } else { tmpbase = g_strdup (prefix); } @@ -1381,7 +1393,7 @@ load_file_position (const char *filename, long *line, long *column) *column = 0; /* open file with positions */ - fn = mhl_str_dir_plus_file (home_dir, MC_FILEPOS); + fn = concat_dir_and_file (home_dir, MC_FILEPOS); f = fopen (fn, "r"); g_free (fn); if (!f) @@ -1428,8 +1440,8 @@ save_file_position (const char *filename, long line, long column) len = strlen (filename); - tmp = mhl_str_dir_plus_file (home_dir, MC_FILEPOS_TMP); - fn = mhl_str_dir_plus_file (home_dir, MC_FILEPOS); + tmp = concat_dir_and_file (home_dir, MC_FILEPOS_TMP); + fn = concat_dir_and_file (home_dir, MC_FILEPOS); /* open temporary file */ t = fopen (tmp, "w"); @@ -1522,3 +1534,179 @@ Q_ (const char *s) sep = strchr(result, '|'); return (sep != NULL) ? sep + 1 : result; } + +/*TODO: These three functions should use glib and should be fixed soon */ + +#define shell_escape_toesc(x) \ + (((x)==' ')||((x)=='!')||((x)=='#')||((x)=='$')||((x)=='%')|| \ + ((x)=='(')||((x)==')')||((x)=='\'')||((x)=='&')||((x)=='~')|| \ + ((x)=='{')||((x)=='}')||((x)=='[')||((x)==']')||((x)=='`')|| \ + ((x)=='?')||((x)=='|')||((x)=='<')||((x)=='>')||((x)==';')|| \ + ((x)=='*')||((x)=='\\')||((x)=='"')) + +#define shell_escape_nottoesc(x) \ + (((x)!=0) && (!shell_escape_toesc((x)))) + +/** To be compatible with the general posix command lines we have to escape + strings for the command line + + /params const char * in + string for escaping + /returns + return escaped string (later need to free) + */ +static char* shell_escape(const char* src) +{ + if ((src==NULL)||(!(*src))) + return strdup(""); + + char* buffer = calloc(1, strlen(src)*2+2); + char* ptr = buffer; + + /* look for the first char to escape */ + while (1) + { + char c; + /* copy over all chars not to escape */ + while ((c=(*src)) && shell_escape_nottoesc(c)) + { + *ptr = c; + ptr++; + src++; + } + + /* at this point we either have an \0 or an char to escape */ + if (!c) + return buffer; + + *ptr = '\\'; + ptr++; + *ptr = c; + ptr++; + src++; + } +} + +/** Unescape paths or other strings for e.g the internal cd + shell-unescape within a given buffer (writing to it!) + + /params const char * src + string for unescaping + /returns + return unescaped string + */ +static char* shell_unescape(char* text) +{ + if (!text) + return NULL; + + /* look for the first \ - that's quick skipover if there's nothing to escape */ + char* readptr = text; + while ((*readptr) && ((*readptr)!='\\')) readptr++; + if (!(*readptr)) return text; + + /* if we're here, we're standing on the first '\' */ + char* writeptr = readptr; + char c; + while ((c = *readptr)) + { + if (c=='\\') + { + readptr++; + switch ((c = *readptr)) + { + case 'n': (*writeptr) = '\n'; writeptr++; break; + case 'r': (*writeptr) = '\r'; writeptr++; break; + case 't': (*writeptr) = '\t'; writeptr++; break; + + case ' ': + case '\\': + case '#': + case '$': + case '%': + case '(': + case ')': + case '[': + case ']': + case '{': + case '}': + case '<': + case '>': + case '!': + case '*': + case '?': + case '~': + case '`': + case '"': + case ';': + case '\0': /* end of string! malformed escape string */ + goto out; + default: + (*writeptr) = c; writeptr++; break; + } + } + else /* got a normal character */ + { + (*writeptr) = *readptr; + writeptr++; + } + readptr++; + } +out: + *writeptr = 0; + + return text; +} + +/** Check if char in pointer contain escape'd chars + + /params const char * in + string for checking + /returns + return TRUE if string contain escaped chars + otherwise return FALSE + */ +static gboolean + shell_is_char_escaped ( const char *in ) +{ + if (in == NULL || !*in || in[0] != '\\') + return false; + if (shell_escape_toesc(in[1])) + return TRUE; + return FALSE; +} + +/*FIXME: move back to concat_dir_and_file */ +static char* str_dir_plus_file(const char* dirname, const char* filename) +{ + /* make sure we have valid strings */ + if (!dirname) + dirname=""; + + if (!filename) + filename=""; + + /* skip leading slashes on filename */ + while (*filename == '/') + filename++; + + /* skip trailing slashes on dirname */ + size_t dnlen = strlen(dirname); + while ((dnlen != 0) && (dirname[dnlen-1]=='/')) + dnlen--; + + size_t fnlen = strlen(filename); + /*TODO: was previously calloc(1,dnlen+fnlen+2) - please review*/ + char* buffer = g_malloc(dnlen+fnlen+2); /* enough space for dirname, /, filename, zero */ + char* ptr = buffer; + + memcpy(ptr, dirname, dnlen); + ptr+=dnlen; + *ptr = '/'; + ptr++; + memcpy(ptr, filename, fnlen); + ptr+=fnlen; + *ptr = 0; + + return buffer; +} \ No newline at end of file diff --git a/src/util.h b/src/util.h index 86009f0..f681566 100644 --- a/src/util.h +++ b/src/util.h @@ -66,6 +66,7 @@ char *strip_password (char *path, int has_prefix); const char *strip_home_and_password (const char *dir); const char *extension (const char *); +char *concat_dir_and_file (const char *dir, const char *file); const char *unix_error_string (int error_num); const char *skip_separators (const char *s); const char *skip_numbers (const char *s); diff --git a/src/widget.c b/src/widget.c index 3b209ad..3896be2 100644 --- a/src/widget.c +++ b/src/widget.c @@ -868,7 +868,7 @@ history_get (const char *input_name) return NULL; if (!*input_name) return NULL; - profile = mhl_str_dir_plus_file (home_dir, HISTORY_FILE_NAME); + profile = concat_dir_and_file (home_dir, HISTORY_FILE_NAME); for (i = 0;; i++) { char key_name[BUF_TINY]; char this_entry[BUF_LARGE]; @@ -906,7 +906,7 @@ history_put (const char *input_name, GList *h) if (!num_history_items_recorded) /* this is how to disable */ return; - profile = mhl_str_dir_plus_file (home_dir, HISTORY_FILE_NAME); + profile = concat_dir_and_file (home_dir, HISTORY_FILE_NAME); if ((i = open (profile, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) != -1) close (i); diff --git a/vfs/extfs.c b/vfs/extfs.c index ded60e1..d0de1bd 100644 --- a/vfs/extfs.c +++ b/vfs/extfs.c @@ -250,7 +250,7 @@ extfs_open_archive (int fstype, const char *name, struct archive **pparc) tmp = name_quote (name, 0); } - mc_extfsdir = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR); + mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR); cmd = g_strconcat (mc_extfsdir, extfs_prefixes[fstype], " list ", local_name ? local_name : tmp, (char *) NULL); @@ -625,7 +625,7 @@ extfs_cmd (const char *extfs_cmd, struct archive *archive, archive_name = name_quote (extfs_get_archive_name (archive), 0); quoted_localname = name_quote (localname, 0); - mc_extfsdir = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR); + mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR); cmd = g_strconcat (mc_extfsdir, extfs_prefixes[archive->fstype], extfs_cmd, archive_name, " ", quoted_file, " ", quoted_localname, (char *) NULL); @@ -654,7 +654,7 @@ extfs_run (struct vfs_class *me, const char *file) g_free (p); archive_name = name_quote (extfs_get_archive_name (archive), 0); - mc_extfsdir = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR); + mc_extfsdir = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR); cmd = g_strconcat (mc_extfsdir, extfs_prefixes[archive->fstype], " run ", archive_name, " ", q, (char *) NULL); g_free (mc_extfsdir); @@ -1299,7 +1299,7 @@ static int extfs_init (struct vfs_class *me) (void) me; - mc_extfsini = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR "extfs.ini"); + mc_extfsini = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR "extfs.ini"); cfg = fopen (mc_extfsini, "r"); /* We may not use vfs_die() message or message or similar, diff --git a/vfs/fish.c b/vfs/fish.c index 2e59c8b..0aa4e5b 100644 --- a/vfs/fish.c +++ b/vfs/fish.c @@ -386,7 +386,7 @@ fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) gettimeofday(&dir->timestamp, NULL); dir->timestamp.tv_sec += fish_directory_timeout; - quoted_path = mhl_shell_escape_dup (remote_path); + quoted_path = shell_escape (remote_path); fish_command (me, super, NONE, "#LIST /%s\n" "if `perl -v > /dev/null 2>&1` ; then\n" @@ -525,10 +525,10 @@ fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) } ent->name = mhl_str_dup_range(filename, filename_bound); - mhl_shell_unescape_buf(ent->name); + shell_unescape(ent->name); ent->ino->linkname = mhl_str_dup_range(linkname, linkname_bound); - mhl_shell_unescape_buf(ent->ino->linkname); + shell_unescape(ent->ino->linkname); } else { // we expect: "escaped-name" if (filename_bound - filename > 2) @@ -542,7 +542,7 @@ fish_dir_load(struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path) } ent->name = mhl_str_dup_range(filename, filename_bound); - mhl_shell_unescape_buf(ent->name); + shell_unescape(ent->name); } break; } @@ -658,7 +658,7 @@ fish_file_store(struct vfs_class *me, struct vfs_s_fh *fh, char *name, char *loc * algorithm for file appending case, therefore just "dd" is used for it. */ - quoted_name = mhl_shell_escape_dup(name); + quoted_name = shell_escape(name); print_vfs_message(_("fish: store %s: sending command..."), quoted_name ); /* FIXME: File size is limited to ULONG_MAX */ @@ -756,7 +756,7 @@ fish_linear_start (struct vfs_class *me, struct vfs_s_fh *fh, off_t offset) name = vfs_s_fullpath (me, fh->ino); if (!name) return 0; - quoted_name = mhl_shell_escape_dup(name); + quoted_name = shell_escape(name); fh->u.fish.append = 0; /* @@ -895,7 +895,7 @@ fish_send_command(struct vfs_class *me, struct vfs_s_super *super, const char *c g_free (mpath); \ return -1; \ } \ - rpath = mhl_shell_escape_dup(crpath); \ + rpath = shell_escape(crpath); \ g_free (mpath); #define POSTFIX(flags) \ @@ -929,9 +929,9 @@ static int fish_##name (struct vfs_class *me, const char *path1, const char *pat g_free (mpath1); \ g_free (mpath2); \ } \ - rpath1 = mhl_shell_escape_dup (crpath1); \ + rpath1 = shell_escape (crpath1); \ g_free (mpath1); \ - rpath2 = mhl_shell_escape_dup (crpath2); \ + rpath2 = shell_escape (crpath2); \ g_free (mpath2); \ g_snprintf(buf, sizeof(buf), string "\n", rpath1, rpath2, rpath1, rpath2); \ g_free (rpath1); \ @@ -950,7 +950,7 @@ static int fish_symlink (struct vfs_class *me, const char *setto, const char *pa { char *qsetto; PREFIX - qsetto = mhl_shell_escape_dup (setto); + qsetto = shell_escape (setto); g_snprintf(buf, sizeof(buf), "#SYMLINK %s /%s\n" "ln -s %s /%s 2>/dev/null\n" diff --git a/vfs/ftpfs.c b/vfs/ftpfs.c index f1d9f75..0c475fa 100644 --- a/vfs/ftpfs.c +++ b/vfs/ftpfs.c @@ -44,7 +44,7 @@ What to do with this? int f = !strcmp( remote_path, "/~" ); if (f || !strncmp( remote_path, "/~/", 3 )) { char *s; - s = mhl_str_dir_plus_file( qhome (*bucket), remote_path +3-f ); + s = concat_dir_and_file( qhome (*bucket), remote_path +3-f ); g_free (remote_path); remote_path = s; } @@ -558,7 +558,7 @@ ftpfs_load_no_proxy_list (void) if (mc_file) return; - mc_file = mhl_str_dir_plus_file (mc_home, "mc.no_proxy"); + mc_file = concat_dir_and_file (mc_home, "mc.no_proxy"); if (exist_file (mc_file) && (npf = fopen (mc_file, "r"))) { while (fgets (s, sizeof (s), npf)) { @@ -1233,7 +1233,7 @@ ftpfs_dir_load (struct vfs_class *me, struct vfs_s_inode *dir, char *remote_path ftpfs_open_data_connection (me, super, "LIST -la", 0, TYPE_ASCII, 0); else { /* Trailing "/." is necessary if remote_path is a symlink */ - char *path = mhl_str_dir_plus_file (remote_path, "."); + char *path = concat_dir_and_file (remote_path, "."); sock = ftpfs_open_data_connection (me, super, "LIST -la", path, TYPE_ASCII, 0); @@ -1889,7 +1889,7 @@ static int ftpfs_netrc_lookup (const char *host, char **login, char **pass) } /* Load current .netrc */ - netrcname = mhl_str_dir_plus_file (home_dir, ".netrc"); + netrcname = concat_dir_and_file (home_dir, ".netrc"); netrcp = netrc = load_file (netrcname); if (netrc == NULL) { g_free (netrcname); diff --git a/vfs/gc.c b/vfs/gc.c index 961d7f8..aff2390 100644 --- a/vfs/gc.c +++ b/vfs/gc.c @@ -125,7 +125,7 @@ vfs_getid (struct vfs_class *vclass, const char *dir) vfsid id = NULL; /* append slash if needed */ - dir1 = mhl_str_dir_plus_file (dir, ""); + dir1 = concat_dir_and_file (dir, ""); if (vclass->getid) id = (*vclass->getid) (vclass, dir1); diff --git a/vfs/mcfs.c b/vfs/mcfs.c index 884c523..9f5ace2 100644 --- a/vfs/mcfs.c +++ b/vfs/mcfs.c @@ -406,7 +406,7 @@ mcfs_get_path (mcfs_connection **mc, const char *path) int f = !strcmp (remote_path, "/~"); if (f || !strncmp (remote_path, "/~/", 3)) { char *s; - s = mhl_str_dir_plus_file (mcfs_gethome (*mc), + s = concat_dir_and_file (mcfs_gethome (*mc), remote_path + 3 - f); g_free (remote_path); remote_path = s; diff --git a/vfs/sfs.c b/vfs/sfs.c index 234dca0..8c30b29 100644 --- a/vfs/sfs.c +++ b/vfs/sfs.c @@ -339,7 +339,7 @@ static int sfs_init (struct vfs_class *me) (void) me; - mc_sfsini = mhl_str_dir_plus_file (mc_home, "extfs" PATH_SEP_STR "sfs.ini"); + mc_sfsini = concat_dir_and_file (mc_home, "extfs" PATH_SEP_STR "sfs.ini"); cfg = fopen (mc_sfsini, "r"); if (!cfg){ diff --git a/vfs/smbfs.c b/vfs/smbfs.c index ea30ed2..2001a7d 100644 --- a/vfs/smbfs.c +++ b/vfs/smbfs.c @@ -1217,7 +1217,7 @@ smbfs_get_path (smbfs_connection ** sc, const char *path) int f = !strcmp (remote_path, "/~"); if (f || !strncmp (remote_path, "/~/", 3)) { char *s; - s = mhl_str_dir_plus_file ((*sc)->home, remote_path + 3 - f); + s = concat_dir_and_file ((*sc)->home, remote_path + 3 - f); g_free (remote_path); return s; } diff --git a/vfs/vfs.c b/vfs/vfs.c index f13d217..8ea71f7 100644 --- a/vfs/vfs.c +++ b/vfs/vfs.c @@ -38,8 +38,6 @@ #include <signal.h> #include <ctype.h> /* is_digit() */ -#include <mhl/string.h> - #include "../src/global.h" #include "../src/tty.h" /* enable/disable interrupt key */ #include "../src/wtools.h" /* message() */ @@ -658,7 +656,7 @@ vfs_canon (const char *path) if (*path != PATH_SEP){ char *local, *result; - local = mhl_str_dir_plus_file (current_dir, path); + local = concat_dir_and_file (current_dir, path); result = vfs_canon (local); g_free (local); -- Midnight Commander Development _______________________________________________ Mc-devel mailing list http://mail.gnome.org/mailman/listinfo/mc-devel