mirror of https://github.com/mgba-emu/mgba.git
VFS: Add VDir.openDir
This commit is contained in:
parent
5b22a628fa
commit
6cf4179a97
|
@ -44,6 +44,7 @@ static bool _vd3dClose(struct VDir* vd);
|
||||||
static void _vd3dRewind(struct VDir* vd);
|
static void _vd3dRewind(struct VDir* vd);
|
||||||
static struct VDirEntry* _vd3dListNext(struct VDir* vd);
|
static struct VDirEntry* _vd3dListNext(struct VDir* vd);
|
||||||
static struct VFile* _vd3dOpenFile(struct VDir* vd, const char* path, int mode);
|
static struct VFile* _vd3dOpenFile(struct VDir* vd, const char* path, int mode);
|
||||||
|
static struct VDir* _vd3dOpenDir(struct VDir* vd, const char* path);
|
||||||
|
|
||||||
static const char* _vd3deName(struct VDirEntry* vde);
|
static const char* _vd3deName(struct VDirEntry* vde);
|
||||||
static enum VFSType _vd3deType(struct VDirEntry* vde);
|
static enum VFSType _vd3deType(struct VDirEntry* vde);
|
||||||
|
@ -185,8 +186,9 @@ struct VDir* VDirOpen(const char* path) {
|
||||||
|
|
||||||
vd3d->d.close = _vd3dClose;
|
vd3d->d.close = _vd3dClose;
|
||||||
vd3d->d.rewind = _vd3dRewind;
|
vd3d->d.rewind = _vd3dRewind;
|
||||||
vd3d->d.listNext = _vd3dListNext; //// Crashes here for no good reason
|
vd3d->d.listNext = _vd3dListNext;
|
||||||
vd3d->d.openFile = _vd3dOpenFile;
|
vd3d->d.openFile = _vd3dOpenFile;
|
||||||
|
vd3d->d.openDir = _vd3dOpenDir;
|
||||||
|
|
||||||
vd3d->vde.d.name = _vd3deName;
|
vd3d->vde.d.name = _vd3deName;
|
||||||
vd3d->vde.d.type = _vd3deType;
|
vd3d->vde.d.type = _vd3deType;
|
||||||
|
@ -235,6 +237,23 @@ static struct VFile* _vd3dOpenFile(struct VDir* vd, const char* path, int mode)
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct VDir* _vd3dOpenDir(struct VDir* vd, const char* path) {
|
||||||
|
struct VDir3DS* vd3d = (struct VDir3DS*) vd;
|
||||||
|
if (!path) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const char* dir = vd3d->path;
|
||||||
|
char* combined = malloc(sizeof(char) * (strlen(path) + strlen(dir) + 2));
|
||||||
|
sprintf(combined, "%s/%s", dir, path);
|
||||||
|
|
||||||
|
struct VDir* vd2 = VDirOpen(combined);
|
||||||
|
if (!vd2) {
|
||||||
|
vd2 = VDirOpenArchive(combined);
|
||||||
|
}
|
||||||
|
free(combined);
|
||||||
|
return vd2;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* _vd3deName(struct VDirEntry* vde) {
|
static const char* _vd3deName(struct VDirEntry* vde) {
|
||||||
struct VDirEntry3DS* vd3de = (struct VDirEntry3DS*) vde;
|
struct VDirEntry3DS* vd3de = (struct VDirEntry3DS*) vde;
|
||||||
if (!vd3de->utf8Name[0]) {
|
if (!vd3de->utf8Name[0]) {
|
||||||
|
|
|
@ -42,6 +42,7 @@ static bool _vdsceClose(struct VDir* vd);
|
||||||
static void _vdsceRewind(struct VDir* vd);
|
static void _vdsceRewind(struct VDir* vd);
|
||||||
static struct VDirEntry* _vdsceListNext(struct VDir* vd);
|
static struct VDirEntry* _vdsceListNext(struct VDir* vd);
|
||||||
static struct VFile* _vdsceOpenFile(struct VDir* vd, const char* path, int mode);
|
static struct VFile* _vdsceOpenFile(struct VDir* vd, const char* path, int mode);
|
||||||
|
static struct VDir* _vdsceOpenDir(struct VDir* vd, const char* path);
|
||||||
|
|
||||||
static const char* _vdesceName(struct VDirEntry* vde);
|
static const char* _vdesceName(struct VDirEntry* vde);
|
||||||
static enum VFSType _vdesceType(struct VDirEntry* vde);
|
static enum VFSType _vdesceType(struct VDirEntry* vde);
|
||||||
|
@ -150,6 +151,7 @@ struct VDir* VDirOpen(const char* path) {
|
||||||
vd->d.rewind = _vdsceRewind;
|
vd->d.rewind = _vdsceRewind;
|
||||||
vd->d.listNext = _vdsceListNext;
|
vd->d.listNext = _vdsceListNext;
|
||||||
vd->d.openFile = _vdsceOpenFile;
|
vd->d.openFile = _vdsceOpenFile;
|
||||||
|
vd->d.openDir = _vdsceOpenDir;
|
||||||
vd->path = strdup(path);
|
vd->path = strdup(path);
|
||||||
|
|
||||||
vd->de.d.name = _vdesceName;
|
vd->de.d.name = _vdesceName;
|
||||||
|
@ -190,13 +192,29 @@ struct VFile* _vdsceOpenFile(struct VDir* vd, const char* path, int mode) {
|
||||||
const char* dir = vdsce->path;
|
const char* dir = vdsce->path;
|
||||||
char* combined = malloc(sizeof(char) * (strlen(path) + strlen(dir) + strlen(PATH_SEP) + 1));
|
char* combined = malloc(sizeof(char) * (strlen(path) + strlen(dir) + strlen(PATH_SEP) + 1));
|
||||||
sprintf(combined, "%s%s%s", dir, PATH_SEP, path);
|
sprintf(combined, "%s%s%s", dir, PATH_SEP, path);
|
||||||
printf("Opening %s\n", combined);
|
|
||||||
|
|
||||||
struct VFile* file = VFileOpen(combined, mode);
|
struct VFile* file = VFileOpen(combined, mode);
|
||||||
free(combined);
|
free(combined);
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct VDir* _vdsceOpenDir(struct VDir* vd, const char* path) {
|
||||||
|
struct VDirSce* vdsce = (struct VDirSce*) vd;
|
||||||
|
if (!path) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const char* dir = vdsce->path;
|
||||||
|
char* combined = malloc(sizeof(char) * (strlen(path) + strlen(dir) + strlen(PATH_SEP) + 1));
|
||||||
|
sprintf(combined, "%s%s%s", dir, PATH_SEP, path);
|
||||||
|
|
||||||
|
struct VDir* vd2 = VDirOpen(combined);
|
||||||
|
if (!vd2) {
|
||||||
|
vd2 = VDirOpenArchive(combined);
|
||||||
|
}
|
||||||
|
free(combined);
|
||||||
|
return vd2;
|
||||||
|
}
|
||||||
|
|
||||||
static const char* _vdesceName(struct VDirEntry* vde) {
|
static const char* _vdesceName(struct VDirEntry* vde) {
|
||||||
struct VDirEntrySce* vdesce = (struct VDirEntrySce*) vde;
|
struct VDirEntrySce* vdesce = (struct VDirEntrySce*) vde;
|
||||||
return vdesce->ent.d_name;
|
return vdesce->ent.d_name;
|
||||||
|
|
|
@ -58,6 +58,7 @@ struct VDir {
|
||||||
void (*rewind)(struct VDir* vd);
|
void (*rewind)(struct VDir* vd);
|
||||||
struct VDirEntry* (*listNext)(struct VDir* vd);
|
struct VDirEntry* (*listNext)(struct VDir* vd);
|
||||||
struct VFile* (*openFile)(struct VDir* vd, const char* name, int mode);
|
struct VFile* (*openFile)(struct VDir* vd, const char* name, int mode);
|
||||||
|
struct VDir* (*openDir)(struct VDir* vd, const char* name);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VFile* VFileOpen(const char* path, int flags);
|
struct VFile* VFileOpen(const char* path, int flags);
|
||||||
|
|
|
@ -14,6 +14,7 @@ static bool _vdClose(struct VDir* vd);
|
||||||
static void _vdRewind(struct VDir* vd);
|
static void _vdRewind(struct VDir* vd);
|
||||||
static struct VDirEntry* _vdListNext(struct VDir* vd);
|
static struct VDirEntry* _vdListNext(struct VDir* vd);
|
||||||
static struct VFile* _vdOpenFile(struct VDir* vd, const char* path, int mode);
|
static struct VFile* _vdOpenFile(struct VDir* vd, const char* path, int mode);
|
||||||
|
static struct VDir* _vdOpenDir(struct VDir* vd, const char* path);
|
||||||
|
|
||||||
static const char* _vdeName(struct VDirEntry* vde);
|
static const char* _vdeName(struct VDirEntry* vde);
|
||||||
static enum VFSType _vdeType(struct VDirEntry* vde);
|
static enum VFSType _vdeType(struct VDirEntry* vde);
|
||||||
|
@ -48,6 +49,7 @@ struct VDir* VDirOpen(const char* path) {
|
||||||
vd->d.rewind = _vdRewind;
|
vd->d.rewind = _vdRewind;
|
||||||
vd->d.listNext = _vdListNext;
|
vd->d.listNext = _vdListNext;
|
||||||
vd->d.openFile = _vdOpenFile;
|
vd->d.openFile = _vdOpenFile;
|
||||||
|
vd->d.openDir = _vdOpenDir;
|
||||||
vd->path = strdup(path);
|
vd->path = strdup(path);
|
||||||
vd->de = de;
|
vd->de = de;
|
||||||
|
|
||||||
|
@ -97,6 +99,23 @@ struct VFile* _vdOpenFile(struct VDir* vd, const char* path, int mode) {
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct VDir* _vdOpenDir(struct VDir* vd, const char* path) {
|
||||||
|
struct VDirDE* vdde = (struct VDirDE*) vd;
|
||||||
|
if (!path) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const char* dir = vdde->path;
|
||||||
|
char* combined = malloc(sizeof(char) * (strlen(path) + strlen(dir) + 2));
|
||||||
|
sprintf(combined, "%s%s%s", dir, PATH_SEP, path);
|
||||||
|
|
||||||
|
struct VDir* vd2 = VDirOpen(combined);
|
||||||
|
if (!vd2) {
|
||||||
|
vd2 = VDirOpenArchive(combined);
|
||||||
|
}
|
||||||
|
free(combined);
|
||||||
|
return vd2;
|
||||||
|
}
|
||||||
|
|
||||||
const char* _vdeName(struct VDirEntry* vde) {
|
const char* _vdeName(struct VDirEntry* vde) {
|
||||||
struct VDirEntryDE* vdede = (struct VDirEntryDE*) vde;
|
struct VDirEntryDE* vdede = (struct VDirEntryDE*) vde;
|
||||||
if (vdede->ent) {
|
if (vdede->ent) {
|
||||||
|
|
|
@ -62,6 +62,7 @@ static bool _vd7zClose(struct VDir* vd);
|
||||||
static void _vd7zRewind(struct VDir* vd);
|
static void _vd7zRewind(struct VDir* vd);
|
||||||
static struct VDirEntry* _vd7zListNext(struct VDir* vd);
|
static struct VDirEntry* _vd7zListNext(struct VDir* vd);
|
||||||
static struct VFile* _vd7zOpenFile(struct VDir* vd, const char* path, int mode);
|
static struct VFile* _vd7zOpenFile(struct VDir* vd, const char* path, int mode);
|
||||||
|
static struct VDir* _vd7zOpenDir(struct VDir* vd, const char* path);
|
||||||
|
|
||||||
static const char* _vde7zName(struct VDirEntry* vde);
|
static const char* _vde7zName(struct VDirEntry* vde);
|
||||||
static enum VFSType _vde7zType(struct VDirEntry* vde);
|
static enum VFSType _vde7zType(struct VDirEntry* vde);
|
||||||
|
@ -111,6 +112,7 @@ struct VDir* VDirOpen7z(const char* path, int flags) {
|
||||||
vd->d.rewind = _vd7zRewind;
|
vd->d.rewind = _vd7zRewind;
|
||||||
vd->d.listNext = _vd7zListNext;
|
vd->d.listNext = _vd7zListNext;
|
||||||
vd->d.openFile = _vd7zOpenFile;
|
vd->d.openFile = _vd7zOpenFile;
|
||||||
|
vd->d.openDir = _vd7zOpenDir;
|
||||||
|
|
||||||
return &vd->d;
|
return &vd->d;
|
||||||
}
|
}
|
||||||
|
@ -301,6 +303,12 @@ struct VFile* _vd7zOpenFile(struct VDir* vd, const char* path, int mode) {
|
||||||
return &vf->d;
|
return &vf->d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct VDir* _vd7zOpenDir(struct VDir* vd, const char* path) {
|
||||||
|
UNUSED(vd);
|
||||||
|
UNUSED(path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool _vf7zSync(struct VFile* vf, const void* memory, size_t size) {
|
bool _vf7zSync(struct VFile* vf, const void* memory, size_t size) {
|
||||||
UNUSED(vf);
|
UNUSED(vf);
|
||||||
UNUSED(memory);
|
UNUSED(memory);
|
||||||
|
|
|
@ -49,6 +49,7 @@ static bool _vdzClose(struct VDir* vd);
|
||||||
static void _vdzRewind(struct VDir* vd);
|
static void _vdzRewind(struct VDir* vd);
|
||||||
static struct VDirEntry* _vdzListNext(struct VDir* vd);
|
static struct VDirEntry* _vdzListNext(struct VDir* vd);
|
||||||
static struct VFile* _vdzOpenFile(struct VDir* vd, const char* path, int mode);
|
static struct VFile* _vdzOpenFile(struct VDir* vd, const char* path, int mode);
|
||||||
|
static struct VDir* _vdzOpenDir(struct VDir* vd, const char* path);
|
||||||
|
|
||||||
static const char* _vdezName(struct VDirEntry* vde);
|
static const char* _vdezName(struct VDirEntry* vde);
|
||||||
static enum VFSType _vdezType(struct VDirEntry* vde);
|
static enum VFSType _vdezType(struct VDirEntry* vde);
|
||||||
|
@ -72,6 +73,7 @@ struct VDir* VDirOpenZip(const char* path, int flags) {
|
||||||
vd->d.rewind = _vdzRewind;
|
vd->d.rewind = _vdzRewind;
|
||||||
vd->d.listNext = _vdzListNext;
|
vd->d.listNext = _vdzListNext;
|
||||||
vd->d.openFile = _vdzOpenFile;
|
vd->d.openFile = _vdzOpenFile;
|
||||||
|
vd->d.openDir = _vdzOpenDir;
|
||||||
vd->z = z;
|
vd->z = z;
|
||||||
|
|
||||||
vd->dirent.d.name = _vdezName;
|
vd->dirent.d.name = _vdezName;
|
||||||
|
@ -297,6 +299,12 @@ struct VFile* _vdzOpenFile(struct VDir* vd, const char* path, int mode) {
|
||||||
return &vfz->d;
|
return &vfz->d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct VDir* _vdzOpenDir(struct VDir* vd, const char* path) {
|
||||||
|
UNUSED(vd);
|
||||||
|
UNUSED(path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool _vfzSync(struct VFile* vf, const void* memory, size_t size) {
|
bool _vfzSync(struct VFile* vf, const void* memory, size_t size) {
|
||||||
UNUSED(vf);
|
UNUSED(vf);
|
||||||
UNUSED(memory);
|
UNUSED(memory);
|
||||||
|
|
Loading…
Reference in New Issue