119 lines
2.1 KiB
C
Executable file
119 lines
2.1 KiB
C
Executable file
#include "sysincludes.h"
|
|
#include "msdos.h"
|
|
#include "stream.h"
|
|
#include "file.h"
|
|
#include "mtoolsDirent.h"
|
|
|
|
void initializeDirentry(direntry_t *entry, Stream_t *Dir)
|
|
{
|
|
entry->entry = -1;
|
|
/* entry->parent = getDirentry(Dir);*/
|
|
entry->Dir = Dir;
|
|
entry->beginSlot = 0;
|
|
entry->endSlot = 0;
|
|
}
|
|
|
|
int isNotFound(direntry_t *entry)
|
|
{
|
|
return entry->entry == -2;
|
|
}
|
|
|
|
void rewindEntry(direntry_t *entry)
|
|
{
|
|
entry->entry = -1;
|
|
}
|
|
|
|
|
|
direntry_t *getParent(direntry_t *entry)
|
|
{
|
|
return getDirentry(entry->Dir);
|
|
}
|
|
|
|
|
|
static int getPathLen(direntry_t *entry)
|
|
{
|
|
int length=0;
|
|
|
|
while(1) {
|
|
if(entry->entry == -3) /* rootDir */
|
|
return strlen(getDrive(entry->Dir)) + 1 + length + 1;
|
|
|
|
length += 1 + strlen(entry->name);
|
|
entry = getDirentry(entry->Dir);
|
|
}
|
|
}
|
|
|
|
static char *sprintPwd(direntry_t *entry, char *ptr)
|
|
{
|
|
if(entry->entry == -3) {
|
|
strcpy(ptr, getDrive(entry->Dir));
|
|
strcat(ptr, ":/");
|
|
ptr = strchr(ptr, 0);
|
|
} else {
|
|
ptr = sprintPwd(getDirentry(entry->Dir), ptr);
|
|
if(ptr[-1] != '/')
|
|
*ptr++ = '/';
|
|
strcpy(ptr, entry->name);
|
|
ptr += strlen(entry->name);
|
|
}
|
|
return ptr;
|
|
}
|
|
|
|
|
|
#define NEED_ESCAPE "\"$\\"
|
|
|
|
static void _fprintPwd(FILE *f, direntry_t *entry, int recurs, int escape)
|
|
{
|
|
if(entry->entry == -3) {
|
|
fputs(getDrive(entry->Dir), f);
|
|
putc(':', f);
|
|
if(!recurs)
|
|
putc('/', f);
|
|
} else {
|
|
_fprintPwd(f, getDirentry(entry->Dir), 1, escape);
|
|
if (escape && strpbrk(entry->name, NEED_ESCAPE)) {
|
|
char *ptr;
|
|
for(ptr = entry->name; *ptr; ptr++) {
|
|
if (strchr(NEED_ESCAPE, *ptr))
|
|
putc('\\', f);
|
|
putc(*ptr, f);
|
|
}
|
|
} else {
|
|
fprintf(f, "/%s", entry->name);
|
|
}
|
|
}
|
|
}
|
|
|
|
void fprintPwd(FILE *f, direntry_t *entry, int escape)
|
|
{
|
|
if (escape)
|
|
putc('"', f);
|
|
_fprintPwd(f, entry, 0, escape);
|
|
if(escape)
|
|
putc('"', f);
|
|
}
|
|
|
|
char *getPwd(direntry_t *entry)
|
|
{
|
|
int size;
|
|
char *ret;
|
|
|
|
size = getPathLen(entry);
|
|
ret = malloc(size+1);
|
|
if(!ret)
|
|
return 0;
|
|
sprintPwd(entry, ret);
|
|
return ret;
|
|
}
|
|
|
|
int isSubdirOf(Stream_t *inside, Stream_t *outside)
|
|
{
|
|
while(1) {
|
|
if(inside == outside) /* both are the same */
|
|
return 1;
|
|
if(getDirentry(inside)->entry == -3) /* root directory */
|
|
return 0;
|
|
/* look further up */
|
|
inside = getDirentry(inside)->Dir;
|
|
}
|
|
}
|