minix/commands/i386/mtools-3.9.7/direntry.c
2005-04-21 14:53:53 +00:00

120 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;
}
}