gboolean do_cd (const vfs_path_t * new_dir_vpath, enum cd_enum exact) { gboolean res; const vfs_path_t *_new_dir_vpath = new_dir_vpath; if (current_panel->is_panelized) { size_t new_vpath_len; new_vpath_len = vfs_path_len (new_dir_vpath); if (vfs_path_ncmp (new_dir_vpath, panelized_panel.root_vpath, new_vpath_len) == 0) _new_dir_vpath = panelized_panel.root_vpath; } res = do_panel_cd (current_panel, _new_dir_vpath, exact); #ifdef HAVE_CHARSET if (res) { const vfs_path_element_t *path_element; path_element = vfs_path_get_by_index (current_panel->cwd_vpath, -1); if (path_element->encoding != NULL) current_panel->codepage = get_codepage_index (path_element->encoding); else current_panel->codepage = SELECT_CHARSET_NO_TRANSLATE; } #endif /* HAVE_CHARSET */ return res; }
static void check_codeset (void) { const char *current_system_codepage = NULL; current_system_codepage = str_detect_termencoding (); #ifdef HAVE_CHARSET { const char *_display_codepage; _display_codepage = get_codepage_id (mc_global.display_codepage); if (strcmp (_display_codepage, current_system_codepage) != 0) { mc_global.display_codepage = get_codepage_index (current_system_codepage); if (mc_global.display_codepage == -1) mc_global.display_codepage = 0; mc_config_set_string (mc_main_config, CONFIG_MISC_SECTION, "display_codepage", cp_display); } } #endif mc_global.utf8_display = str_isutf8 (current_system_codepage); }
static gboolean regex_check_type (const vfs_path_t * filename_vpath, const char *ptr, int *have_type, gboolean case_insense, GError ** error) { gboolean found = FALSE; /* Following variables are valid if *have_type is 1 */ static char content_string[2048]; #ifdef HAVE_CHARSET static char encoding_id[21]; /* CSISO51INISCYRILLIC -- 20 */ #endif static size_t content_shift = 0; static int got_data = 0; if (!use_file_to_check_type) return FALSE; if (*have_type == 0) { vfs_path_t *localfile_vpath; const char *realname; /* name used with "file" */ #ifdef HAVE_CHARSET int got_encoding_data; #endif /* HAVE_CHARSET */ /* Don't repeate even unsuccessful checks */ *have_type = 1; localfile_vpath = mc_getlocalcopy (filename_vpath); if (localfile_vpath == NULL) { g_propagate_error (error, g_error_new (MC_ERROR, -1, _("Cannot fetch a local copy of %s"), vfs_path_as_str (filename_vpath))); return FALSE; } realname = vfs_path_get_last_path_str (localfile_vpath); #ifdef HAVE_CHARSET got_encoding_data = is_autodetect_codeset_enabled ? get_file_encoding_local (localfile_vpath, encoding_id, sizeof (encoding_id)) : 0; if (got_encoding_data > 0) { char *pp; int cp_id; pp = strchr (encoding_id, '\n'); if (pp != NULL) *pp = '\0'; cp_id = get_codepage_index (encoding_id); if (cp_id == -1) cp_id = default_source_codepage; do_set_codepage (cp_id); } #endif /* HAVE_CHARSET */ mc_ungetlocalcopy (filename_vpath, localfile_vpath, FALSE); got_data = get_file_type_local (localfile_vpath, content_string, sizeof (content_string)); if (got_data > 0) { char *pp; size_t real_len; pp = strchr (content_string, '\n'); if (pp != NULL) *pp = '\0'; real_len = strlen (realname); if (strncmp (content_string, realname, real_len) == 0) { /* Skip "realname: " */ content_shift = real_len; if (content_string[content_shift] == ':') { /* Solaris' file prints tab(s) after ':' */ for (content_shift++; content_string[content_shift] == ' ' || content_string[content_shift] == '\t'; content_shift++) ; } } } else { /* No data */ content_string[0] = '\0'; } vfs_path_free (localfile_vpath); } if (got_data == -1) { g_propagate_error (error, g_error_new (MC_ERROR, -1, _("Pipe failed"))); return FALSE; } if (content_string[0] != '\0') { mc_search_t *search; search = mc_search_new (ptr, -1); if (search != NULL) { search->search_type = MC_SEARCH_T_REGEX; search->is_case_sensitive = !case_insense; found = mc_search_run (search, content_string + content_shift, 0, -1, NULL); mc_search_free (search); } else { g_propagate_error (error, g_error_new (MC_ERROR, -1, _("Regular expression error"))); } } return found; }
void load_setup (void) { const char *profile; size_t i; const char *kt; #ifdef HAVE_CHARSET char *buffer; load_codepages_list (); #endif /* HAVE_CHARSET */ profile = setup_init (); /* mc.lib is common for all users, but has priority lower than ${XDG_CONFIG_HOME}/mc/ini. FIXME: it's only used for keys and treestore now */ global_profile_name = g_build_filename (mc_global.sysconfig_dir, MC_GLOBAL_CONFIG_FILE, (char *) NULL); if (!exist_file (global_profile_name)) { g_free (global_profile_name); global_profile_name = g_build_filename (mc_global.share_data_dir, MC_GLOBAL_CONFIG_FILE, (char *) NULL); } panels_profile_name = mc_config_get_full_path (MC_PANELS_FILE); mc_main_config = mc_config_init (profile, FALSE); if (!exist_file (panels_profile_name)) setup__move_panels_config_into_separate_file (profile); mc_panels_config = mc_config_init (panels_profile_name, FALSE); /* Load integer boolean options */ for (i = 0; int_options[i].opt_name != NULL; i++) *int_options[i].opt_addr = mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name, *int_options[i].opt_addr); #ifndef USE_INTERNAL_EDIT /* reset forced in case of build without internal editor */ use_internal_edit = 0; #endif /* USE_INTERNAL_EDIT */ if (option_tab_spacing <= 0) option_tab_spacing = DEFAULT_TAB_SPACING; #ifdef USE_INTERNAL_EDIT if (option_word_wrap_line_length <= 0) option_word_wrap_line_length = DEFAULT_WRAP_LINE_LENGTH; #endif /* USE_INTERNAL_EDIT */ /* overwrite old_esc_mode_timeout */ kt = getenv ("KEYBOARD_KEY_TIMEOUT_US"); if ((kt != NULL) && (kt[0] != '\0')) old_esc_mode_timeout = atoi (kt); /* Load string options */ for (i = 0; str_options[i].opt_name != NULL; i++) *str_options[i].opt_addr = mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name, str_options[i].opt_defval); load_layout (); panels_load_options (); load_panelize (); startup_left_mode = setup__load_panel_state ("New Left Panel"); startup_right_mode = setup__load_panel_state ("New Right Panel"); /* At least one of the panels is a listing panel */ if (startup_left_mode != view_listing && startup_right_mode != view_listing) startup_left_mode = view_listing; boot_current_is_left = mc_config_get_bool (mc_panels_config, "Dirs", "current_is_left", TRUE); /* Load time formats */ user_recent_timeformat = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "timeformat_recent", FMTTIME); user_old_timeformat = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "timeformat_old", FMTYEAR); #ifdef ENABLE_VFS_FTP ftpfs_proxy_host = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "ftp_proxy_host", "gate"); ftpfs_ignore_chattr_errors = mc_config_get_bool (mc_main_config, CONFIG_APP_SECTION, "ignore_ftp_chattr_errors", TRUE); ftpfs_init_passwd (); #endif /* ENABLE_VFS_FTP */ /* The default color and the terminal dependent color */ mc_global.tty.setup_color_string = mc_config_get_string (mc_main_config, "Colors", "base_color", ""); mc_global.tty.term_color_string = mc_config_get_string (mc_main_config, "Colors", getenv ("TERM"), ""); mc_global.tty.color_terminal_string = mc_config_get_string (mc_main_config, "Colors", "color_terminals", ""); /* Load the directory history */ /* directory_history_load (); */ /* Remove the temporal entries */ #ifdef HAVE_CHARSET if (codepages->len > 1) { buffer = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "display_codepage", ""); if (buffer[0] != '\0') { mc_global.display_codepage = get_codepage_index (buffer); cp_display = get_codepage_id (mc_global.display_codepage); } g_free (buffer); buffer = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "source_codepage", ""); if (buffer[0] != '\0') { default_source_codepage = get_codepage_index (buffer); mc_global.source_codepage = default_source_codepage; /* May be source_codepage doesn't need this */ cp_source = get_codepage_id (mc_global.source_codepage); } g_free (buffer); } autodetect_codeset = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "autodetect_codeset", ""); if ((autodetect_codeset[0] != '\0') && (strcmp (autodetect_codeset, "off") != 0)) is_autodetect_codeset_enabled = TRUE; g_free (init_translation_table (mc_global.source_codepage, mc_global.display_codepage)); buffer = (char *) get_codepage_id (mc_global.display_codepage); if (buffer != NULL) mc_global.utf8_display = str_isutf8 (buffer); #endif /* HAVE_CHARSET */ #ifdef HAVE_ASPELL spell_language = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "spell_language", "en"); #endif /* HAVE_ASPELL */ clipboard_store_path = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "clipboard_store", ""); clipboard_paste_path = mc_config_get_string (mc_main_config, CONFIG_MISC_SECTION, "clipboard_paste", ""); }
int load_codepages_list (void) { int result = -1; FILE *f; char *fname; char buf[256]; extern char *mc_home; extern int display_codepage; char *default_codepage = NULL; 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); return -1; } g_free (fname); for (n_codepages = 0; fgets (buf, sizeof (buf), f);) if (buf[0] != '\n' && buf[0] != '\0' && buf[0] != '#') ++n_codepages; rewind (f); codepages = g_new0 (struct codepage_desc, n_codepages + 1); for (n_codepages = 0; fgets (buf, sizeof buf, f);) { /* split string into id and cpname */ char *p = buf; int buflen = strlen (buf); if (*p == '\n' || *p == '\0' || *p == '#') continue; if (buflen > 0 && buf[buflen - 1] == '\n') buf[buflen - 1] = '\0'; while (*p != '\t' && *p != ' ' && *p != '\0') ++p; if (*p == '\0') goto fail; *p++ = 0; while (*p == '\t' || *p == ' ') ++p; if (*p == '\0') goto fail; if (strcmp (buf, "default") == 0) { default_codepage = g_strdup (p); continue; } codepages[n_codepages].id = g_strdup (buf); codepages[n_codepages].name = g_strdup (p); ++n_codepages; } if (default_codepage) { display_codepage = get_codepage_index (default_codepage); g_free (default_codepage); } result = n_codepages; fail: fclose (f); return result; }
static void load_codepages_list_from_file (GPtrArray ** list, const char *fname) { FILE *f; guint i; char buf[BUF_MEDIUM]; char *default_codepage = NULL; f = fopen (fname, "r"); if (f == NULL) return; for (i = 0; fgets (buf, sizeof buf, f) != NULL;) { /* split string into id and cpname */ char *p = buf; size_t buflen = strlen (buf); if (*p == '\n' || *p == '\0' || *p == '#') continue; if (buflen > 0 && buf[buflen - 1] == '\n') buf[buflen - 1] = '\0'; while (*p != '\t' && *p != ' ' && *p != '\0') ++p; if (*p == '\0') goto fail; *p++ = '\0'; g_strstrip (p); if (*p == '\0') goto fail; if (strcmp (buf, "default") == 0) default_codepage = g_strdup (p); else { const char *id = buf; if (*list == NULL) { *list = g_ptr_array_sized_new (16); g_ptr_array_add (*list, new_codepage_desc (id, p)); } else { /* whether id is already present in list */ /* if yes, overwrite description */ for (i = 0; i < (*list)->len; i++) { codepage_desc *desc; desc = (codepage_desc *) g_ptr_array_index (*list, i); if (strcmp (id, desc->id) == 0) { /* found */ g_free (desc->name); desc->name = g_strdup (p); break; } } /* not found */ if (i == (*list)->len) g_ptr_array_add (*list, new_codepage_desc (id, p)); } } } if (default_codepage != NULL) { display_codepage = get_codepage_index (default_codepage); g_free (default_codepage); } fail: fclose (f); }