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 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; }
static int fsdevice_open_directory(vdrive_t *vdrive, unsigned int secondary, bufinfo_t *bufinfo, cbmdos_cmd_parse_t *cmd_parse, char *rname) { struct ioutil_dir_s *ioutil_dir; char *mask; BYTE *p; int i; if ((secondary != 0) || (bufinfo[secondary].mode != Read)) { fsdevice_error(vdrive, CBMDOS_IPE_NOT_WRITE); return FLOPPY_ERROR; } if (!(mask = strrchr(rname, '/'))) { mask = rname; } /* Test on wildcards. */ if (cbmdos_parse_wildcard_check(mask, (unsigned int)strlen(mask))) { if (*mask == '/') { strcpy(bufinfo[secondary].dirmask, mask + 1); *mask++ = 0; } else { strcpy(bufinfo[secondary].dirmask, mask); lib_free(cmd_parse->parsecmd); cmd_parse->parsecmd = lib_stralloc(fsdevice_get_path(vdrive->unit)); } } else { bufinfo[secondary].dirmask[0] = '\0'; if (!*(cmd_parse->parsecmd)) { lib_free(cmd_parse->parsecmd); cmd_parse->parsecmd = lib_stralloc(fsdevice_get_path(vdrive->unit)); } } /* trying to open */ ioutil_dir = ioutil_opendir((char *)(cmd_parse->parsecmd)); if (ioutil_dir == NULL) { for (p = (BYTE *)(cmd_parse->parsecmd); *p; p++) { if (isupper((int)*p)) { *p = tolower((int)*p); } } ioutil_dir = ioutil_opendir((char *)(cmd_parse->parsecmd)); if (ioutil_dir == NULL) { fsdevice_error(vdrive, CBMDOS_IPE_NOT_FOUND); return FLOPPY_ERROR; } } strcpy(bufinfo[secondary].dir, cmd_parse->parsecmd); /* * Start Address, Line Link and Line number 0 */ p = bufinfo[secondary].name; *p++ = 1; *p++ = 4; *p++ = 1; *p++ = 1; *p++ = 0; *p++ = 0; *p++ = (BYTE)0x12; /* Reverse on */ *p++ = '"'; strcpy((char *)p, bufinfo[secondary].dir); /* Dir name */ charset_petconvstring((BYTE *)p, 0); /* ASCII name to PETSCII */ i = 0; while (*p) { ++p; i++; } while (i < 16) { *p++ = ' '; i++; } *p++ = '"'; *p++ = ' '; *p++ = 'V'; *p++ = 'I'; *p++ = 'C'; *p++ = 'E'; *p++ = ' '; *p++ = 0; bufinfo[secondary].buflen = (int)(p - bufinfo[secondary].name); bufinfo[secondary].bufp = bufinfo[secondary].name; bufinfo[secondary].mode = Directory; bufinfo[secondary].ioutil_dir = ioutil_dir; bufinfo[secondary].eof = 0; return FLOPPY_COMMAND_OK; }