void edit_qt() //this is used to set the quest template for the current quest { char tpath[2048]; char tpath2[2048]; strcpy(temppath, header.templatepath); if(temppath[0]==0) { getcwd(temppath,2048); fix_filename_case(temppath); fix_filename_slashes(temppath); put_backslash(temppath); } bool gotname; gotname=getname("Load Quest Template (.zqt)","zqt",NULL,temppath,true); if(gotname) { strcpy(tpath, temppath); chop_path(tpath); getcwd(tpath2,2048); fix_filename_case(tpath2); fix_filename_slashes(tpath2); put_backslash(tpath2); if(!strcmp(tpath, tpath2)) { strcpy(header.templatepath, get_filename(temppath)); } else { strcpy(header.templatepath, temppath); } if(!valid_zqt(temppath)) { jwin_alert("ZQuest","Invalid Quest Template",NULL,NULL,"O&K",NULL,'k',0,lfont); memset(header.templatepath, 0, 2048); } } }
/* File Name Concatenator basically on Windows / DOS */ char *ci_find_file(char *dir_name, char *file_name) { char *diamond = NULL; if (dir_name == NULL && file_name == NULL) return NULL; if (dir_name == NULL) { diamond = (char *)malloc(strlen(file_name) + 3); strcpy(diamond, file_name); } else { diamond = (char *)malloc(strlen(dir_name) + strlen(file_name) + 2); append_filename(diamond, dir_name, file_name, strlen(dir_name) + strlen(file_name) + 2); } fix_filename_case(diamond); fix_filename_slashes(diamond); return diamond; }
/* Case Insensitive File Find */ char *ci_find_file(char *dir_name, char *file_name) { struct stat statbuf; struct dirent *entry = NULL; DIR *rough = NULL; DIR *prevdir = NULL; char *diamond = NULL; char *directory = NULL; char *filename = NULL; if (dir_name == NULL && file_name == NULL) return NULL; if (!(dir_name == NULL)) { fix_filename_case(dir_name); fix_filename_slashes(dir_name); } fix_filename_case(file_name); fix_filename_slashes(file_name); if (dir_name == NULL) { char *match = NULL; int match_len = NULL; int dir_len = NULL; match = get_filename(file_name); if (match == NULL) return NULL; match_len = strlen(match); dir_len = (match - file_name); if (dir_len == 0) { directory = (char *)malloc(2); strcpy(directory,"."); } else { directory = (char *)malloc(dir_len + 1); strncpy(directory, file_name, dir_len); directory[dir_len] = '\0'; } filename = (char *)malloc(match_len + 1); strncpy(filename, match, match_len); filename[match_len] = '\0'; } else { directory = (char *)malloc(strlen(dir_name) + 1); strcpy(directory, dir_name); filename = (char *)malloc(strlen(file_name) + 1); strcpy(filename, file_name); } if ((prevdir = opendir(".")) == NULL) { fprintf(stderr, "ci_find_file: cannot open current working directory\n"); return NULL; } if (chdir(directory) == -1) { fprintf(stderr, "ci_find_file: cannot change to directory: %s\n", directory); return NULL; } if ((rough = opendir(directory)) == NULL) { fprintf(stderr, "ci_find_file: cannot open directory: %s\n", directory); return NULL; } while ((entry = readdir(rough)) != NULL) { lstat(entry->d_name, &statbuf); if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) { if (strcasecmp(filename, entry->d_name) == 0) { #ifdef _DEBUG fprintf(stderr, "ci_find_file: Looked for %s in rough %s, found diamond %s.\n", filename, directory, entry->d_name); #endif _DEBUG diamond = (char *)malloc(strlen(directory) + strlen(entry->d_name) + 2); append_filename(diamond, directory, entry->d_name, strlen(directory) + strlen(entry->d_name) + 2); break; } } } closedir(rough); fchdir(dirfd(prevdir)); closedir(prevdir); free(directory); free(filename); return diamond; }
/* 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; }
/* fs_flist_putter: * Callback routine for for_each_file() to fill the file selector listbox. */ static int fs_flist_putter(AL_CONST char *str, int attrib, void *check_attrib) { char *s, *ext, *name; int c, c2; s = get_filename(str); fix_filename_case(s); if(!(attrib & FA_DIREC)) { /* Check if file extension matches. */ if(fext_p) { ext = get_extension(s); for(c=0; c<fext_size; c++) { if(ustricmp(ext, fext_p[c]) == 0) goto Next; } return 0; } Next: /* Check if file attributes match. */ if(check_attrib) { for(c=0; c<ATTRB_MAX; c++) { if((attrb_state[c] == ATTRB_SET) && (!(attrib & attrb_flag[c]))) return 0; if((attrb_state[c] == ATTRB_UNSET) && (attrib & attrb_flag[c])) return 0; } } } if((flist->size < FLIST_SIZE) && ((ugetc(s) != '.') || (ugetat(s, 1)))) { int size = ustrsizez(s) + ((attrib & FA_DIREC) ? ucwidth(OTHER_PATH_SEPARATOR) : 0); name = (char *) zc_malloc(size); if(!name) return -1; ustrzcpy(name, size, s); if(attrib & FA_DIREC) put_backslash(name); /* Sort alphabetically with directories first. */ for(c=0; c<flist->size; c++) { if(ugetat(flist->name[c], -1) == OTHER_PATH_SEPARATOR) { if(attrib & FA_DIREC) if(ustrfilecmp(name, flist->name[c]) < 0) break; } else { if(attrib & FA_DIREC) break; if(ustrfilecmp(name, flist->name[c]) < 0) break; } } /* Shift in preparation for inserting the new entry. */ for(c2=flist->size; c2>c; c2--) flist->name[c2] = flist->name[c2-1]; /* Insert the new entry. */ flist->name[c] = name; flist->size++; } 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; }
/* fs_flist_putter: * Callback routine for for_each_file() to fill the file selector listbox. */ static void fs_flist_putter(AL_CONST char *str, int attrib, int param) { char ext_tokens[32]; char *s, *ext, *tok, *name; char tmp[512], tmp2[32]; int c, c2, i, k, sign; /* attribute flags (rhsda order) * 0 = not required, 1 = must be set, -1 = must be unset */ int attr_flag[5+5] = { 0, -1, -1, 0, 0, FA_RDONLY, FA_HIDDEN, FA_SYSTEM, FA_DIREC, FA_ARCH }; c = usetc(ext_tokens, ' '); c += usetc(ext_tokens+c, ','); c += usetc(ext_tokens+c, ';'); usetc(ext_tokens+c, 0); s = get_filename(str); fix_filename_case(s); if (fext) { ustrcpy(tmp, fext); ustrtok(tmp, ext_tokens); c = (ustrtok(NULL, ext_tokens) ? 1 : 0); if (!c) { if (!ustrchr(fext, '/')) c = 1; } if (c && (!(attrib & FA_DIREC))) { ustrcpy(tmp, fext); ext = get_extension(s); tok = ustrtok(tmp, ext_tokens); while (tok) { if (ustricmp(ext, tok) == 0) break; tok = ustrtok(NULL, ext_tokens); } if (!tok) return; } c = usetc(ext_tokens, ' '); c += usetc(ext_tokens+c, ','); c += usetc(ext_tokens+c, ';'); c += usetc(ext_tokens+c, '/'); usetc(ext_tokens+c, 0); ustrcpy(tmp, fext); tok = ustrchr(tmp, '/'); if (tok) tok = ustrtok(tok, ext_tokens); if (tok) { sign = 1; c = usetc(tmp2, 'r'); c += usetc(tmp2+c, 'h'); c += usetc(tmp2+c, 's'); c += usetc(tmp2+c, 'd'); c += usetc(tmp2+c, 'a'); c += usetc(tmp2+c, '+'); c += usetc(tmp2+c, '-'); usetc(tmp2+c, 0); /* scan the string */ i = 0; while ((c = utolower(ugetat(tok, i)))) { k = 0; while ((c2 = ugetat(tmp2, k))!=0) { if (c == c2) { if (k<5) { attr_flag[k] = sign; break; } else sign = (k==5) ? 1 : -1; } k++; } i++; } } } /* check if file attributes match */ if (!(attr_flag[3+5] & attrib)) { /* if not a directory, we check all attributes except FA_DIREC */ for (c=0; c<5; c++) { if (c == 3) continue; if ((attr_flag[c] == 1) && (!(attrib & attr_flag[c+5]))) return; if ((attr_flag[c] == -1) && (attrib & attr_flag[c+5])) return; } } else { /* if a directory, we check only FA_DIREC */ if (attr_flag[3] == -1) return; } if ((flist->size < FLIST_SIZE) && ((ugetc(s) != '.') || (ugetat(s, 1)))) { name = malloc(ustrsizez(s) + ((attrib & FA_DIREC) ? ucwidth(OTHER_PATH_SEPARATOR) : 0)); if (!name) return; for (c=0; c<flist->size; c++) { if (ugetat(flist->name[c], -1) == OTHER_PATH_SEPARATOR) { if (attrib & FA_DIREC) if (ustrfilecmp(s, flist->name[c]) < 0) break; } else { if (attrib & FA_DIREC) break; if (ustrfilecmp(s, flist->name[c]) < 0) break; } } for (c2=flist->size; c2>c; c2--) flist->name[c2] = flist->name[c2-1]; flist->name[c] = name; ustrcpy(flist->name[c], s); if (attrib & FA_DIREC) put_backslash(flist->name[c]); flist->size++; } }
void edit_qt(int index) { int ret; quest_template tqt; char tpath[2048]; char tpath2[2048]; tqt=QuestTemplates[index]; editqt_dlg[0].dp2=lfont; do { editqt_dlg[6].dp=QuestTemplates[index].name; editqt_dlg[8].dp=QuestTemplates[index].path; strcpy(temppath, QuestTemplates[index].path); bool gotname; if(is_large) large_dialog(editqt_dlg); ret=zc_popup_dialog(editqt_dlg,6); switch(ret) { case 2: gotname=getname("Load Quest Template (.zqt)","zqt",NULL,temppath,true); if(gotname) { strcpy(tpath, temppath); chop_path(tpath); getcwd(tpath2,2048); fix_filename_case(tpath2); fix_filename_slashes(tpath2); put_backslash(tpath2); if(!strcmp(tpath, tpath2)) { strcpy(QuestTemplates[index].path, get_filename(temppath)); } else { strcpy(QuestTemplates[index].path, temppath); } } break; case 3: if(!valid_zqt(temppath)) { ret=2; jwin_alert("ZQuest","Invalid Quest Template",NULL,NULL,"O&K",NULL,'k',0,lfont); break; } if(index==qt_count) { ++qt_count; } break; case 4: QuestTemplates[index]=tqt; break; } } while(ret==2); }