home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
telecom
/
uucp_442
/
src
/
lib
/
ndir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-08
|
2KB
|
143 lines
/*
* 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 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