home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * 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 "protos.h"
- #include "version.h"
-
- IDENT(".01");
-
- Prototype DIR *opendir(const char *);
- Prototype void rewinddir(DIR *);
- Prototype struct direct *readdir(DIR *);
- Prototype void closedir(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
-
-