131 lines
2.2 KiB
C
131 lines
2.2 KiB
C
|
/*
|
||
|
Directory Access Library
|
||
|
|
||
|
FIND.C taken from DIRLIB.C by M. J. Weinstein
|
||
|
Released to public domain 1-Jan-89
|
||
|
|
||
|
The author may be contacted at:
|
||
|
matt@cs.ucla.edu -or- POB 84524, L.A., CA 90073
|
||
|
|
||
|
Modified by dvadura@watdragon.edu to work with dmake.
|
||
|
(nuked the DOS version 2 code, since dmake needs version
|
||
|
3.0 or greater to function).
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*
|
||
|
* revision history:
|
||
|
*
|
||
|
* VER MM/DD/YY COMMENTS
|
||
|
* ---- -------- --------
|
||
|
* 0.99 02/24/86 Beta release to INTERNET
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <ctype.h>
|
||
|
#include <errno.h>
|
||
|
#include <string.h>
|
||
|
#include <alloc.h>
|
||
|
#include <dos.h>
|
||
|
#include "dosdta.h"
|
||
|
|
||
|
#ifndef MK_FP
|
||
|
#define MK_FP(seg,ofs) ((void far *) \
|
||
|
(((unsigned long)(seg) << 16) | (unsigned)(ofs)))
|
||
|
#endif
|
||
|
#ifndef FP_SEG
|
||
|
#define FP_SEG(fp) ((unsigned)((unsigned long)(fp) >> 16))
|
||
|
#endif
|
||
|
#ifndef FP_OFF
|
||
|
#define FP_OFF(fp) ((unsigned)(fp))
|
||
|
#endif
|
||
|
|
||
|
int find_err;
|
||
|
|
||
|
/*
|
||
|
* get/set dta address
|
||
|
*/
|
||
|
|
||
|
static DTA far *
|
||
|
_getsetdta(newdta)
|
||
|
DTA far *newdta;
|
||
|
{
|
||
|
DTA far *olddta;
|
||
|
union REGS r;
|
||
|
struct SREGS s;
|
||
|
|
||
|
/* get old dta */
|
||
|
r.h.ah = 0x2f;
|
||
|
intdos(&r, &r);
|
||
|
segread(&s);
|
||
|
olddta = (DTA far *) MK_FP(s.es, r.x.bx);
|
||
|
|
||
|
/* conditionally set new dta */
|
||
|
if (newdta) {
|
||
|
r.h.ah = 0x1a;
|
||
|
s.ds = FP_SEG(newdta);
|
||
|
r.x.dx = FP_OFF(newdta);
|
||
|
intdosx(&r, &r, &s);
|
||
|
}
|
||
|
|
||
|
return olddta;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* dos findfirst
|
||
|
*/
|
||
|
|
||
|
DTA *
|
||
|
findfirst(name, dta)
|
||
|
char *name;
|
||
|
DTA *dta;
|
||
|
{
|
||
|
union REGS r;
|
||
|
struct SREGS s;
|
||
|
DTA far *dtasave;
|
||
|
char far *nmp = (char far *)name;
|
||
|
|
||
|
dtasave = _getsetdta((DTA far *)dta);
|
||
|
|
||
|
/* do directory lookup */
|
||
|
segread(&s);
|
||
|
r.h.ah = 0x4e;
|
||
|
r.x.cx = 0x10;
|
||
|
r.x.dx = FP_OFF(nmp);
|
||
|
s.ds = FP_SEG(nmp);
|
||
|
intdosx(&r, &r, &s);
|
||
|
/* restore dta */
|
||
|
_getsetdta(dtasave);
|
||
|
find_err = r.x.ax;
|
||
|
if (r.x.cflag)
|
||
|
return(NULL);
|
||
|
|
||
|
return dta;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* dos findnext
|
||
|
*/
|
||
|
|
||
|
DTA *
|
||
|
findnext(dta)
|
||
|
DTA *dta;
|
||
|
{
|
||
|
union REGS r;
|
||
|
DTA far *dtasave;
|
||
|
|
||
|
dtasave = _getsetdta((DTA far *)dta);
|
||
|
|
||
|
/* do directory lookup */
|
||
|
r.h.ah = 0x4f;
|
||
|
intdos(&r, &r);
|
||
|
/* restore old dta */
|
||
|
_getsetdta(dtasave);
|
||
|
find_err = r.x.ax;
|
||
|
if (r.x.cflag)
|
||
|
return(NULL);
|
||
|
|
||
|
return dta;
|
||
|
}
|