static char *p00_file_find(const char *file_name, const char *path) { struct ioutil_dir_s *ioutil_dir; struct rawfile_info_s *rawfile; BYTE p00_header_file_name[P00_HDR_CBMNAME_LEN]; char *name, *alloc_name = NULL; int rc; ioutil_dir = ioutil_opendir(path); if (ioutil_dir == NULL) return NULL; while (1) { name = ioutil_readdir(ioutil_dir); if (name == NULL) break; if (p00_check_name(name) < 0) continue; rawfile = rawfile_open(name, path, FILEIO_COMMAND_READ); if (rawfile == NULL) continue; rc = p00_read_header(rawfile, (BYTE *)p00_header_file_name, NULL); if (rc >= 0) { BYTE *cname; unsigned int equal; p00_pad_a0(p00_header_file_name); cname = cbmdos_dir_slot_create(file_name, strlen(file_name)); equal = cbmdos_parse_wildcard_compare(cname, p00_header_file_name); lib_free(cname); if (equal > 0) alloc_name = lib_stralloc(name); else rc = -1; } rawfile_destroy(rawfile); if (rc >= 0) break; } ioutil_closedir(ioutil_dir); return alloc_name; }
static unsigned int vdrive_dir_name_match(BYTE *slot, BYTE *nslot, int length, int type) { if (length < 0) { if (slot[SLOT_TYPE_OFFSET]) return 0; else return 1; } if (!slot[SLOT_TYPE_OFFSET]) return 0; if (type != CBMDOS_FT_DEL && type != (slot[SLOT_TYPE_OFFSET] & 0x07)) return 0; return cbmdos_parse_wildcard_compare(nslot, &slot[SLOT_NAME_OFFSET]); }
static char *cbmfile_find_file(const char *fsname, const char *path) { struct ioutil_dir_s *ioutil_dir; BYTE *name1, *name2; char *name, *retname = NULL; const char *open_path; open_path = path; if (path == NULL) open_path = ""; ioutil_dir = ioutil_opendir(open_path); if (ioutil_dir == NULL) return NULL; name1 = cbmdos_dir_slot_create(fsname, (unsigned int)strlen(fsname)); while (1) { unsigned int equal; name = ioutil_readdir(ioutil_dir); if (name == NULL) break; name2 = cbmdos_dir_slot_create(name, (unsigned int)strlen(name)); equal = cbmdos_parse_wildcard_compare(name1, name2); lib_free(name2); if (equal > 0) { retname = lib_stralloc(name); break; } } lib_free(name1); ioutil_closedir(ioutil_dir); return retname; }