home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d03xx
/
d0353.lha
/
AztecArp
/
scdir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-06-02
|
2KB
|
127 lines
/* Copyright (C) 1986,1987 Manx Software Systems, Inc. */
/* not exactly re-entrant, is it? it does make a simple directory scanner though */
#define MAXNAMELEN 256
struct AnchorPath *findfirst(), *findnext();
/* Olsen: these two defines were MISSING - nothing worked! */
#define SET_ID(t,i) ((SHORT *) t)[-1]=i
#define arpisdir(ap) (ap -> ap_Info . fib_DirEntryType > 0)
char *scdir (pat)
char *pat;
{
register struct AnchorPath *ap;
static char time = 0;
Chk_Abort();
do {
if (!time) { /* new pattern */
time = 1;
ap = findfirst(pat);
}
else { /* continue pattern */
ap = findnext();
}
} while (ap && arpisdir(ap));
if (!ap) { /* no more (return null) */
time = 0;
return NULL;
}
return ap->ap_Buf; /* return ptr to name */
}
/* static struct DefaultTracker *_tr,*_tr2; */
static struct AnchorPath *_ap;
static
struct AnchorPath *findfirst(path)
char *path;
{
struct AnchorPath *findrtn();
struct AnchorPath *allocap();
if (!_ap && !allocap()) return NULL;
return findrtn (FindFirst (path,_ap));
}
static
struct AnchorPath *findnext()
{
struct AnchorPath *findrtn();
return findrtn (FindNext (_ap));
}
static
struct AnchorPath *findrtn(rc)
ULONG rc;
{
switch (rc) {
case 0:
return _ap;
case ERROR_BREAK:
_abort();
case ERROR_NO_MORE_ENTRIES:
errno = 0;
break;
default:
errno = rc;
break;
}
FreeAnchorChain (_ap);
return NULL;
}
static
struct AnchorPath *allocap()
{
register struct AnchorPath *ap = NULL;
if ( (ap = ArpAlloc((long)sizeof *ap + MAXNAMELEN)) ) {
SET_ID(ap,TRAK_ANCHOR);
if (Enable_Abort) ap->ap_BreakBits = SIGBREAKF_CTRL_C;
ap->ap_StrLen = MAXNAMELEN;
_ap = ap;
}
else errno = ENOMEM;
return ap;
#if 0
register struct DefaultTracker *tr;
register struct AnchorPath *ap = NULL;
/* !!! the order of these two allocations is VERY important -
unless done in this order, FreeTaskResList() will not be
able to call FreeAnchorChain() correctly */
if ( (ap = ArpAlloc((long)sizeof *ap + MAXNAMELEN)) && (tr = GetTracker(TRAK_ANCHOR)) ) {
tr->dt_Object.dt_Resource = (CPTR)ap;
if (Enable_Abort) ap->ap_BreakBits = SIGBREAKF_CTRL_C;
ap->ap_StrLen = MAXNAMELEN;
_ap = ap;
}
else {
if (tr) FreeTrackedItem(tr);
errno = ENOMEM;
}
return ap;
#endif
}