
/*
 *  NDIR.C
 *
 *  Amiga (Lattice & Manx) "ndir" Library
 */

#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dosextens.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ndir.h"
#include "config.h"
#include "version.h"

IDENT(".01");

Prototype struct DIR *opendir(const char *);
Prototype void rewinddir(struct DIR *);
Prototype struct direct *readdir(struct DIR *);
Prototype void closedir(struct DIR *);

/*
 * open a directory.
 */

DIR *
opendir(const char *name)
{
    register DIR *dirp;
    BPTR lock;

#ifdef TEST
    fprintf(stderr, "opendir: Opening \"%s\"\n", name);
#endif
    if ((lock = Lock(name, (long)ACCESS_READ)) == NULL) {
#ifdef TEST
	fprintf(stderr, "opendir: Can't open.\n");
#endif
	return NULL;
    }
    if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) {
#ifdef TEST
	fprintf(stderr, "opendir: couldn't malloc %d\n", sizeof(DIR));
#endif
	UnLock(lock);
	return NULL;
    }
#ifdef TEST
    fprintf(stderr, "FIB location is 0%lo\n", &dirp->fib);
#endif
    if (!Examine(lock, &dirp->fib)) {
#ifdef TEST
	 fprintf(stderr, "opendir: Couldn't Examine directory\n");
#endif
	 free(dirp);
	 UnLock(lock);
    }
    dirp->lock = (long)lock;
#ifdef TEST
    fputs("opendir: Sucessful\n", stderr);
#endif
    return dirp;
}

/*
 * go back to the begining of the directory
 */

void
rewinddir(DIR *dirp)
{
    Examine((BPTR)dirp->lock, &dirp->fib);
}

/*
 * get next entry in a directory.
 */

struct direct *
readdir(DIR *dirp)
{
    static struct direct dir;

    while (ExNext((BPTR)dirp->lock, &dirp->fib)) {
	if (dirp->fib.fib_DirEntryType <= 0) {
	    dir.d_ino = dirp->fib.fib_DiskKey;
	    strcpy(dir.d_name, dirp->fib.fib_FileName);
#ifdef TEST
	    fprintf(stderr, "readdir: OK \"%s\"\n",  dir.d_name);
#endif
	    dir.d_namlen = strlen(dir.d_name);
	    dir.d_reclen = DIRSIZ(&dir);
	    return &dir;
	}
    }
#ifdef TEST
    fprintf(stderr, "readdir: No More Entries.\n");
#endif
    dir.d_name[0] = '\0';
    return NULL;
}

/*
 * close a directory.
 */

void
closedir(DIR *dirp)
{
    UnLock((BPTR)dirp->lock);
    free((char *)dirp);
}

#ifdef TEST

main(void)
{
    char command[100];

    DIR *dirp;
    struct direct *dp;

    while(gets(command) != NULL) {
	fprintf(stderr, "test: %s\n", command);
	if ((dirp = opendir(command)) == NULL) {
	    fprintf(stderr, "couldn't open dir %s\n", command);
	} else {
	    while ((dp = readdir(dirp)) != NULL)
		fprintf(stderr, "%s\n", dp->d_name);
	    closedir(dirp);
	}
    }
    return 0;
}

#endif

