static UI_CALLBACK(change_working_directory) { char *wd; int len; len = ioutil_maxpathlen(); wd = lib_malloc(len); ioutil_getcwd(wd, len); vsync_suspend_speed_eval(); #ifdef USE_GNOMEUI if (ui_change_dir(_("VICE setting"), _("Change current working directory"), wd, len) == UI_BUTTON_OK) { if (ioutil_chdir(wd) < 0) ui_error(_("Directory not found")); } #else if (ui_input_string(_("VICE setting"), _("Change current working directory"), wd, len) == UI_BUTTON_OK) { if (ioutil_chdir(wd) < 0) ui_error(_("Directory not found")); } #endif lib_free(wd); }
static struct file_list *file_list_read_nolfn(const char *path, const char *pattern) { char *cwd = ioutil_current_dir(); struct file_list *fl = NULL; struct find_t f; if (cwd == NULL) { return NULL; } if (ioutil_chdir(path) < 0) { goto end; } if (_dos_findfirst("*.*", (_A_NORMAL | _A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_SUBDIR | _A_ARCH), &f)) { goto end; } fl = file_list_create(); /* (We skip `.' here.) */ while (!_dos_findnext(&f)) { strlwr(f.name); if (pattern == NULL || (f.attrib & _A_SUBDIR)) { file_list_add_item(fl, f.name, (f.attrib & _A_SUBDIR) ? FT_DIR : FT_NORMAL); continue; } { char *p = lib_stralloc(pattern); char *element; element = strtok(p, ";"); do { if (fnmatch(element, f.name, FNM_NOCASE) == 0) { file_list_add_item(fl, f.name, (f.attrib & _A_SUBDIR) ? FT_DIR : FT_NORMAL); } element = strtok(NULL, ";"); } while (element != NULL); lib_free(p); } } file_list_sort(fl); end: ioutil_chdir(cwd); return fl; }
static TUI_MENU_CALLBACK(change_workdir_callback) { char s[256]; if (!been_activated) { return NULL; } *s = '\0'; if (tui_input_string("Change working directory", "New directory:", s, 255) == -1) { return NULL; } util_remove_spaces(s); if (*s == '\0') { return NULL; } if (ioutil_chdir(s) == -1) { tui_error("Invalid directory."); } return NULL; }
static int fsdevice_flush_cd(vdrive_t* vdrive, char *arg) { int er; er = CBMDOS_IPE_OK; if (ioutil_chdir(fsdevice_get_path(vdrive->unit)) || ioutil_chdir(arg)) { er = CBMDOS_IPE_NOT_FOUND; if (ioutil_errno(IOUTIL_ERRNO_EPERM)) { er = CBMDOS_IPE_PERMISSION; } } else { /* get full path and save */ arg = ioutil_current_dir(); fsdevice_set_directory(arg, vdrive->unit); lib_free(arg); } return er; }
static int cmdline_chdir(const char *param, void *extra_param) { return ioutil_chdir(param); }
/* FIXME: documentation. */ char *tui_file_selector(const char *title, const char *directory, const char *pattern, const char *default_item, read_contents_func_type contents_func, char **browse_file_return, unsigned int *browse_file_number_return) { static char *return_path = NULL; struct file_list *fl; int curr_item, first_item, need_update; int x, y, width, height, num_cols, num_lines, field_width; int num_files; char str[0x100]; int str_len = 0; tui_area_t backing_store = NULL; if (contents_func != NULL) { *browse_file_return = NULL; } if (browse_file_number_return != NULL) { *browse_file_number_return = 0; } if (directory != NULL) { return_path = lib_stralloc(directory); } else { return_path = ioutil_current_dir(); } slashize_path(&return_path); fl = file_list_read(return_path, pattern); if (fl == NULL) { return NULL; } first_item = curr_item = 0; num_cols = 4; field_width = 18; num_lines = 17; height = num_lines + 2; width = field_width * num_cols + 4; num_files = num_cols * num_lines; if (default_item != NULL && *default_item) { int i; for (i = 0; i < fl->num_items; i++) { if (!strcasecmp(default_item, fl->items[i].name)) { curr_item = i; while (curr_item - first_item >= num_files) { first_item += num_lines; } break; } } } x = CENTER_X(width); y = CENTER_Y(height); need_update = 1; tui_area_get(&backing_store, x, y, width + 2, height + 1); tui_display_window(x, y, width, height, MENU_BORDER, MENU_BACK, title, NULL); while (1) { int key; tui_set_attr(MENU_FORE, MENU_BACK, 0); if (need_update) { file_selector_display_path(return_path, x + 1, y + height - 1, width - 2); file_selector_update(fl, first_item, x + 2, y + 1, field_width, num_lines, num_cols); tui_set_attr(FIRST_LINE_FORE, FIRST_LINE_BACK, 0); tui_display(0, tui_num_lines() - 1, tui_num_cols(), "\030\031\033\032: Move <Enter>: Select %s<Alt>-<letter>: Change drive", contents_func != NULL ? "<Space>: Preview " : ""); need_update = 0; } tui_set_attr(MENU_FORE, MENU_HIGHLIGHT, 0); file_selector_display_item(fl, curr_item, first_item, x + 2, y + 1, field_width, num_lines, num_cols); key = getkey(); tui_set_attr(MENU_FORE, MENU_BACK, 0); file_selector_display_item(fl, curr_item, first_item, x + 2, y + 1, field_width, num_lines, num_cols); switch (key) { case K_Escape: tui_area_put(backing_store, x, y); tui_area_free(backing_store); return NULL; case K_Left: str_len = 0; if (curr_item - num_lines >= 0) { curr_item -= num_lines; if (curr_item < first_item) { if (first_item >= num_lines) { first_item -= num_lines; need_update = 1; } else { curr_item += num_lines; } } } break; case K_Up: str_len = 0; if (curr_item > 0) { curr_item--; if (curr_item < first_item) { first_item = curr_item; need_update = 1; } } break; case K_Right: str_len = 0; if (curr_item + num_lines < fl->num_used_items) { curr_item += num_lines; if (curr_item - first_item >= num_files) { first_item += num_lines; need_update = 1; } } break; case K_Down: str_len = 0; if (curr_item < fl->num_used_items - 1) { curr_item++; if (curr_item == first_item + num_files) { first_item++; need_update = 1; } } break; case K_PageDown: str_len = 0; if (curr_item + num_files < fl->num_used_items) { curr_item += num_files; first_item += num_files; } need_update = 1; break; case K_PageUp: str_len = 0; if (curr_item - num_files >= 0) { curr_item -= num_files; first_item -= num_files; if (first_item < 0) { first_item = 0; } need_update = 1; } break; case K_Home: str_len = 0; curr_item = 0; if (first_item != 0) { first_item = 0; need_update = 1; } break; case K_End: str_len = 0; curr_item = fl->num_used_items - 1; first_item = curr_item - num_files + 1; if (first_item < 0) { first_item = 0; } need_update = 1; break; case K_Return: str_len = 0; if (fl->items[curr_item].type == FT_DIR) { struct file_list *new_fl; char *new_path; new_path = change_path(fl, return_path, curr_item); new_fl = file_list_read(new_path, pattern); if (new_fl != NULL) { file_list_free(fl); fl = new_fl; first_item = curr_item = 0; lib_free(return_path); return_path = new_path; need_update = 1; ioutil_chdir(return_path); } else { lib_free(new_path); } } else { char *p = util_concat(return_path, fl->items[curr_item].name, NULL); lib_free(return_path); return_path = p; tui_area_put(backing_store, x, y); tui_area_free(backing_store); return return_path; } break; case K_BackSpace: if (str_len > 1) { int n; str_len--; n = file_list_find(fl, str, str_len); if (n >= 0) { curr_item = n; if (curr_item < first_item) { first_item = curr_item; need_update = 1; } else if (first_item + num_files <= curr_item) { first_item = curr_item - num_files + 1; need_update = 1; } } } else { str_len = 0; curr_item = 0; if (first_item != 0) { first_item = 0; need_update = 1; } } break; case ' ': if (contents_func != NULL && fl->items[curr_item].type != FT_DIR && browse_file_return != NULL) { tui_display(0, tui_num_lines() - 1, tui_num_cols(), ""); *browse_file_return = tui_image_browser(fl->items[curr_item].name, contents_func, browse_file_number_return); if (*browse_file_return != NULL) { char *p = util_concat(return_path, fl->items[curr_item].name, NULL); lib_free(return_path); return_path = p; tui_area_put(backing_store, x, y); tui_area_free(backing_store); return return_path; } need_update = 1; break; } else { tui_beep(); } default: { int drive_num; drive_num = alt_key_to_drive_num(key); if (drive_num > 0) { /* `A-a' ... `A-z' change the current drive. */ int num_available_drives; int current_drive; _dos_getdrive(¤t_drive); _dos_setdrive(current_drive, &num_available_drives); if (drive_num <= num_available_drives) { char *new_path; /* FIXME: This is a hack... Maybe there is a cleaner way to do it, but for now I just don't know. */ _dos_setdrive(drive_num, &num_available_drives); new_path = ioutil_current_dir(); if (new_path != NULL) { slashize_path(&new_path); _dos_setdrive(current_drive, &num_available_drives); if (new_path != NULL) { struct file_list *new_fl; new_fl = file_list_read(new_path, pattern); if (new_fl != NULL) { file_list_free(fl); fl = new_fl; first_item = curr_item = 0; lib_free(return_path); return_path = new_path; need_update = 1; ioutil_chdir(return_path); } else { lib_free(new_path); } } } else { _dos_setdrive(current_drive, &num_available_drives); tui_beep(); } } else { tui_beep(); } } else if (isprint(key) && str_len < 0x100) { int n; str[str_len] = key; n = file_list_find(fl, str, str_len + 1); if (n < 0) { tui_beep(); } else { str_len++; curr_item = n; if (curr_item < first_item) { first_item = curr_item; need_update = 1; } else if (first_item + num_files <= curr_item) { first_item = curr_item - num_files + 1; need_update = 1; } } } } break; } } }