/* jwin_file_select_ex: * Displays the JWin file selector, with the message as caption. * Allows the user to select a file, and stores the selection in the * path buffer, whose length in bytes is given by size and should have * room for at least 80 characters. The files are filtered according to * the file extensions in ext. Passing NULL includes all files, "PCX;BMP" * includes only files with .PCX or .BMP extensions. Returns zero if it * was closed with the Cancel button or non-zero if it was OK'd. */ int jwin_file_select_ex(AL_CONST char *message, char *path, AL_CONST char *ext, int size, int width, int height, FONT *title_font) { static attrb_state_t default_attrb_state[ATTRB_MAX] = DEFAULT_ATTRB_STATE; int ret; char *p; char tmp[32]; ASSERT(message); ASSERT(path); if(title_font) { file_selector[0].dp2=title_font; } if(width == OLD_FILESEL_WIDTH) width = 304; #ifdef HAVE_DIR_LIST if(height == OLD_FILESEL_HEIGHT) height = 160; #else if(height == OLD_FILESEL_HEIGHT) height = 188; #endif /* for fs_dlist_proc() */ ASSERT(size >= 4 * uwidth_max(U_CURRENT)); usetc(updir, 0); file_selector[FS_WIN].dp = (char *)message; file_selector[FS_EDIT].d1 = size/uwidth_max(U_CURRENT) - 1; file_selector[FS_EDIT].dp = path; file_selector[FS_OK].dp = (void*)get_config_text("OK"); file_selector[FS_CANCEL].dp = (void*)get_config_text("Cancel"); /* Set default attributes. */ memcpy(attrb_state, default_attrb_state, sizeof(default_attrb_state)); /* Parse extension string. */ // if (ext)// && ugetc(ext)) { parse_extension_string(ext); } if(!ugetc(path)) { #ifdef HAVE_DIR_LIST int drive = _al_getdrive(); #else int drive = 0; #endif _al_getdcwd(drive, path, size - ucwidth(OTHER_PATH_SEPARATOR)); fix_filename_case(path); fix_filename_slashes(path); put_backslash(path); } clear_keybuf(); do { } while(gui_mouse_b()); file_selector[FS_TYPES].proc = fs_dummy_proc; enlarge_file_selector(width, height); ret = popup_zqdialog(file_selector, FS_EDIT); if(fext) { zc_free(fext); fext = NULL; } if(fext_p) { _al_free(fext_p); fext_p = NULL; } if((ret == FS_CANCEL) || (ret == FS_WIN) || (!ugetc(get_filename(path)))) return FALSE; p = get_extension(path); if((!ugetc(p)) && (ext) && (!ustrpbrk(ext, uconvert_ascii(" ,;", tmp)))) { size -= ((long)(size_t)p - (long)(size_t)path + ucwidth('.')); if(size >= uwidth_max(U_CURRENT) + ucwidth(0)) /* do not end with '.' */ { p += usetc(p, '.'); ustrzcpy(p, size, ext); } } return TRUE; }
/* al_findfirst: * Initiates a directory search. */ int al_findfirst(AL_CONST char *pattern, struct al_ffblk *info, int attrib) { struct FF_DATA *ff_data; struct stat s; int actual_attrib; char tmp[1024]; char *p; /* allocate ff_data structure */ ff_data = _AL_MALLOC(sizeof(struct FF_DATA)); if (!ff_data) { *allegro_errno = ENOMEM; return -1; } memset(ff_data, 0, sizeof *ff_data); info->ff_data = (void *) ff_data; /* if the pattern contains no wildcard, we use stat() */ if (!ustrpbrk(pattern, uconvert("?*", U_ASCII, tmp, U_CURRENT, sizeof(tmp)))) { /* start the search */ errno = *allegro_errno = 0; if (stat(uconvert(pattern, U_CURRENT, tmp, U_UTF8, sizeof(tmp)), &s) == 0) { /* get file attributes */ actual_attrib = ff_get_attrib(ff_get_filename(uconvert(pattern, U_CURRENT, tmp, U_UTF8, sizeof(tmp))), &s); /* does it match ? */ if ((actual_attrib & ~attrib) == 0) { info->attrib = actual_attrib; info->time = s.st_mtime; info->size = s.st_size; /* overflows at 2GB */ ff_data->size = s.st_size; ustrzcpy(info->name, sizeof(info->name), get_filename(pattern)); return 0; } } _AL_FREE(ff_data); info->ff_data = NULL; *allegro_errno = (errno ? errno : ENOENT); return -1; } ff_data->attrib = attrib; do_uconvert(pattern, U_CURRENT, ff_data->dirname, U_UTF8, sizeof(ff_data->dirname)); p = ff_get_filename(ff_data->dirname); _al_sane_strncpy(ff_data->pattern, p, sizeof(ff_data->pattern)); if (p == ff_data->dirname) _al_sane_strncpy(ff_data->dirname, "./", FF_MAXPATHLEN); else *p = 0; /* nasty bodge, but gives better compatibility with DOS programs */ if (strcmp(ff_data->pattern, "*.*") == 0) _al_sane_strncpy(ff_data->pattern, "*", FF_MAXPATHLEN); /* start the search */ errno = *allegro_errno = 0; ff_data->dir = opendir(ff_data->dirname); if (!ff_data->dir) { *allegro_errno = (errno ? errno : ENOENT); _AL_FREE(ff_data); info->ff_data = NULL; return -1; } if (al_findnext(info) != 0) { al_findclose(info); return -1; } return 0; }
int raine_file_select_ex( char *message, char *path, char *ext, int size,int width, int height) { char buf[512]; int ret; char *p; if (width == -1) width = 305; #ifdef HAVE_DIR_LIST if (height == -1) height = 161; #else if (height == -1) height = 189; #endif /* for fs_dlist_proc() */ ASSERT(size >= 4 * uwidth_max(U_CURRENT)); ustrcpy(updir, empty_string); file_selector[FS_MESSAGE].dp = (char *)message; file_selector[FS_EDIT].d1 = size/uwidth_max(U_CURRENT) - 1; file_selector[FS_EDIT].dp = path; file_selector[FS_OK].dp = (void*)raine_get_config_text("OK"); file_selector[FS_CANCEL].dp = (void*)raine_get_config_text("Cancel"); fext = ext; if (!ugetc(path)) { if (!getcwd(buf, sizeof(buf))) buf[0]=0; do_uconvert(buf, U_ASCII, path, U_CURRENT, size); fix_filename_case(path); fix_filename_slashes(path); put_backslash(path); } clear_keybuf(); do { } while (gui_mouse_b()); stretch_dialog(file_selector, width, height); centre_dialog(file_selector); // Stupid correction of the allegro colors... file_selector[FS_FILES].fg = CGUI_COL_TEXT_1; file_selector[FS_FILES].bg = CGUI_BOX_COL_MIDDLE; #ifdef HAVE_DIR_LIST /* not all platforms need a directory list */ file_selector[FS_DISKS].fg = CGUI_COL_TEXT_1; file_selector[FS_DISKS].bg = CGUI_BOX_COL_MIDDLE; #endif ret = do_dialog(file_selector, FS_EDIT); if (ret == FS_CANCEL) return FALSE; p = get_extension(path); if ((!ugetc(p)) && (ext) && (!ustrpbrk(ext, uconvert_ascii(" ,;", NULL)))) { p += usetc(p, '.'); ustrcpy(p, ext); } return TRUE; }