home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
576.lha
/
kd_freq.library_v3.01
/
Programming.LZH
/
WFind.c
< prev
Wrap
C/C++ Source or Header
|
1991-11-16
|
3KB
|
166 lines
/*
* kd_freq.library NewPatMatch() Test
*
* This demonstrates the use of NewPatMatch() in reading the
* FindDB:find.codes file.
*
* You need to assemble and link glue.asm with this, or use the
* appropriate #pragmas!
*
*/
#include "KDBase.h"
struct Library *KD_FReqBase, *OpenLibrary();
main(argc,argv)
int argc;
char *argv[];
{
if (argc < 2)
{
print("WFind:\n\nUsage: WFind pattern\n");
}
else if (KD_FReqBase = OpenLibrary(KLIBNAME,KLIBVERSION))
{
FindFiles(argv[1]);
CloseLibrary(KD_FReqBase);
}
else
{
print("Can't Open 'kd_freq.library'. Make sure it is in LIBS:\n");
}
}
long FileSize(filename)
char *filename;
{
struct FileInfoBlock *FIB;
struct FileLock *lock;
long size = 0L;
FIB = (struct FileInfoBlock *)
AllocMem((long) sizeof(struct FileInfoBlock), MEMF_PUBLIC|MEMF_CLEAR);
if (FIB)
{
if (lock = (struct FileLock *) Lock(filename,ACCESS_READ))
{
if (Examine(lock,FIB))
size = FIB->fib_Size;
UnLock(lock);
}
FreeMem(FIB, (long) sizeof(struct FileInfoBlock));
}
return(size);
}
#define FILE "FindDB:find.codes"
FindFiles(pattern)
UBYTE *pattern;
{
long status, buffersize;
struct FileHandle *in, *Open();
UBYTE *buffer;
buffersize = FileSize(FILE);
if (in = (struct FileHandle *)Open(FILE,MODE_OLDFILE))
{
if (buffer = (UBYTE *) AllocMem(buffersize,MEMF_PUBLIC|MEMF_CLEAR))
{
status = Read(in,buffer,buffersize);
print("\n\nDirectories:\n------------");
ScanFiles(pattern,buffer,status,1);
print("\n\nFiles:\n------");
ScanFiles(pattern,buffer,status,2);
FreeMem(buffer,buffersize);
}
Close(in);
}
else
print("Couldn't find FindDB:find.codes!!");
}
/* pass 1 shows directories, pass 2 shows files..
this code is slow... and could be improved a lot with some
work... You are very welcome to optimize it...
I'm too busy on something else.. (grin)
*/
ScanFiles(pattern,buf,size,pass)
UBYTE *pattern;
UBYTE *buf;
LONG size;
USHORT pass;
{
UBYTE *ptr = buf, temp;
ULONG len;
UBYTE directory[128];
UBYTE path[160];
long i;
while(ptr < (buf+size))
{
len = strlen(ptr);
temp = ptr[len-1];
if ((temp == '/') || (temp == ':'))
{
strcpy(directory,ptr);
directory[strlen(directory)-1] = 0;
for (i = strlen(directory); i >= 0; i--)
{
temp = directory[i];
if ((temp == '/') || (temp == ':'))
break;
}
i++;
if (pass == 1)
if (NewPatMatch(pattern, directory+i) == 1)
print(directory);
strcpy(directory,ptr);
}
else
if (pass == 2)
if (NewPatMatch(pattern, ptr) == 1)
{
strcpy(path,directory);
strcat(path,ptr);
print(path);
}
while(*ptr++)
;
}
}
/* to save some code size... */
print(string)
UBYTE *string;
{
struct FileHandle *Output();
Write(Output(),string,strlen(string));
Write(Output(),"\n",1);
}