/* 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 #include #include #include #include #include #include #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; }