
/*
 *  SCANDIR.C
 *
 *  SD {
 *	SD *next;
 *	char buf[];
 *  };
 *
 *  SD *sd;
 *
 *  sd = ScanDir(dir, match)
 *	 FreeDirScan(sd)
 */

#include <local/typedefs.h>

#define SD  struct _SD
#define DBLK	32
#define ALIGNL(ptr) (void *)(((long)ptr + 3) & ~3)

SD {
    SD	    *next;
    char    buf[4];
};

/*BREAKUP   ScanDir.c	*/
SD *
ScanDir(dir, match, abortflag)
char *dir, *match;
char *abortflag;
{
    char buf[sizeof(FIB)+3];
    register FIB *fib = ALIGNL(buf);
    register SD  *sd;
    SD	*sbase;
    long lock;
    char ok = 0;

    geta4();
    sd = (SD *)&sbase;
    lock = Lock(dir, SHARED_LOCK);
    if (lock && Examine(lock, fib) && fib->fib_DirEntryType > 0) {
	while (ExNext(lock, fib)) {
	    if (*abortflag)
		break;
	    if (wildcmp(match, fib->fib_FileName)) {
		sd->next = AllocMem(sizeof(SD) - 3 + strlen(fib->fib_FileName), MEMF_PUBLIC);
		sd = sd->next;
		strcpy(sd->buf, fib->fib_FileName);
	    }
	}
	UnLock(lock);
	sd->next = NULL;
	return(sbase);
    }
    if (lock)
	UnLock(lock);
    return(NULL);
}

/*BREAKUP   FreeDirScan.c   */
void
FreeDirScan(sd)
register SD *sd;
{
    register SD *nextsd;

    geta4();
    while (sd) {
	nextsd = sd->next;
	FreeMem(sd, sizeof(SD) - 3 + strlen(sd->buf));
	sd = nextsd;
    }
}

