summaryrefslogtreecommitdiff
path: root/dmake/msdos/find.c
diff options
context:
space:
mode:
Diffstat (limited to 'dmake/msdos/find.c')
-rw-r--r--dmake/msdos/find.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/dmake/msdos/find.c b/dmake/msdos/find.c
new file mode 100644
index 000000000000..d35cc477ec9e
--- /dev/null
+++ b/dmake/msdos/find.c
@@ -0,0 +1,130 @@
+/*
+ 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;
+}