예제 #1
0
파일: p00.c 프로젝트: martinpiper/VICE
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;
}
예제 #2
0
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]);
}
예제 #3
0
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;
}