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