home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 14
/
CD_ASCQ_14_0694.iso
/
maj
/
653
/
rfind1st.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-03
|
6KB
|
157 lines
/*
** RFIND1ST.C - Our own non-compiler specific find first/next calls
**
** Original Copyright 1988-1991 by Bob Stout as part of
** the MicroFirm Function Library (MFL)
**
** This subset version is functionally identical to the
** version originally published by the author in Tech Specialist
** magazine and is hereby donated to the public domain.
*/
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include "dirent.h"
#ifndef OS2
/************************************************************************/
/* */
/* rfind_1st() - Find first matching file */
/* */
/* Parameters: 1 - Drive, path and filename of file to be found. May */
/* include wildcards */
/* 2 - Attribute of file to search for. Attributes are */
/* described in the MS-DOS manual. The search strategy */
/* is described under DOS call 0x4Eh. */
/* 3 - Disk transfer area buffer. If NULL, one will be */
/* malloc'ed. */
/* Returns: Pointer to a struct DSTRUCT. If error, NULL is returned and */
/* _doserrno is set to the error #. */
/* */
/************************************************************************/
struct DSTRUCT *rfind_1st(char *name, unsigned attribute, struct DSTRUCT *dta)
{
struct DSTRUCT *my_dta;
union REGS regs;
if (NULL == dta)
my_dta = (struct DSTRUCT *)malloc(sizeof(struct DSTRUCT));
else my_dta = dta;
bdos(0x1A, (unsigned)my_dta, 0); /* set DTA to my_dta */
regs.x.ax = 0x4E00; /* find first */
regs.x.dx = (unsigned)name;
regs.x.cx = attribute;
intdos(®s, ®s);
if (regs.x.cflag) /* if error */
{
_doserrno = regs.x.ax;
if (NULL == dta && my_dta != NULL)
free(my_dta);
return (struct DSTRUCT *) NULL;
}
return my_dta;
}
/************************************************************************/
/* */
/* rfind_nxt() - Find next matching file */
/* */
/* Parameters: 1 - Pointer to DSTRUCT structure to use */
/* */
/* Returns: Pointer to struct DSTRUCT, */
/* NULL if no more matching files found */
/* */
/************************************************************************/
struct DSTRUCT *rfind_nxt(struct DSTRUCT *dta)
{
union REGS regs;
bdos(0x1A, (unsigned)dta, 0); /* set DTA to dta */
regs.x.ax = 0x4F00;
intdos(®s,®s);
if (regs.x.cflag) /* if error */
{
_doserrno = regs.x.ax;
return (struct DSTRUCT *) NULL;
}
return dta;
}
#else
/************************************************************************/
/* */
/* OS/2 Versions follow - poorly tested! */
/* */
/************************************************************************/
#if OS2 < 2
typedef USHORT UWORD
#else
typedef ULONG UWORD
#endif
static HDIR hdir_ptr = DSIR_CREATE;
#if OS2 < 2
static FILEFINDBUF flist;
#else
static FILEFINDBUF3 flist;
#endif
static PSZ fname;
static UWORD count = 1;
struct DSTRUCT *rfind_1st(char *name, unsigned attribute, struct DSTRUCT *dta)
{
struct DSTRUCT *my_dta;
short retval;
if (NULL == dta)
my_dta = (struct DSTRUCT *)malloc(sizeof(struct DSTRUCT));
else my_dta = dta;
fname = (PSZ)name;
#if OS2 < 2
if (DosFindFirst(fname, &hdir_ptr, attribute, &flist, sizeof(flist),
&count, 0L))
#else
if (DosFindFirst(fname, &hdir_ptr, attribute, &flist, sizeof(flist),
&count, FIL_STANDARD))
#endif
{
return NULL;
}
else
{
my_dta->ATTRIBUTE = (BYTE)(flist.attrFile & 0xff);
my_dta->TIME = flist.ftimeCreation;
my_dta->DATE = flist.fdateCreation;
my_dta->FSIZE = flist.cbFile;
strcpy(my_dta->NAME, flist.achName);
return my_dta;
}
}
struct DSTRUCT *rfind_nxt(struct DSTRUCT *dta)
{
struct DSTRUCT *my_dta;
if (DosFindNext(hdir_ptr, &flist, sizeof(flist), & count))
return NULL;
else
{
my_dta->ATTRIBUTE = (BYTE)(flist.attrFile & 0xff);
my_dta->TIME = flist.ftimeCreation;
my_dta->DATE = flist.fdateCreation;
my_dta->FSIZE = flist.cbFile;
strcpy(my_dta->NAME, flist.achName);
return my_dta;
}
}
#endif