#ifdef	MSDOS	/* { */
#include "ndir.h"
#include <dos.h>

char    *malloc();

#define	MAX_PATH	(64+3)	/* maximum path length in msdos */
				/* +3 for the drive selector */

	DIR     *
opendir(dir)
	char    *dir;
	{
	register DIR   *dirp;
	register char	*p;
	short	cf, ecode;
	union   REGS    r;
	struct  SREGS   s;
	static	char	add[] = "\\*.*";
	char	nbuf[MAX_PATH];

	if(strlen(dir) + 5 >= MAX_PATH)	/* check max path length */
		return(NULL);
	dirp = (DIR *)malloc(sizeof(DIR));
	if(dirp == NULL) return(NULL);
	/* convert / to backslash */
	for(p = nbuf ; *dir ; dir++)
		if(*dir == '/') *p++ = '\\';
		else *p++ = *dir;
	dir = add;
	if(*(p-1) == '\\' || *(p-1) == ':') dir++;
	while(*p++ = *dir++);
	segread(&s);
	dirp->_dta_dtaseg = s.ds;
	dirp->_dta_set = 1;
	r.h.ah = 0x2f; /* get dta */
	intdosx(&r, &r, &s);
	dirp->_dta_adr = r.x.bx;
	dirp->_dta_seg = s.es;
	r.h.ah = 0x1a;  /* set dta */
	r.x.dx = (int)&dirp->msdos_info;
	s.ds = dirp->_dta_dtaseg;
	intdosx(&r, &r, &s);
	/*
	 * now get first match
	 */
	r.h.ah = 0x4e;
	r.x.cx = 0x37;	/* all attributes */
	r.x.dx = (int)nbuf;
	s.ds = dirp->_dta_dtaseg;
	intdosx(&r, &r, &s);
	cf = r.x.cflag;	/* get error status */
	r.x.bx = dirp->_dta_adr;
	s.es = dirp->_dta_seg;
	r.h.ah = 0x1a;	/* set dta back */
	intdosx(&r, &r, &s);
	if (cf)	{	/* error */
		free( (char *)dirp);
		return(NULL);
		}
	dirp->msdos_info.dta_fname[13] = 0;	/* zap for later */
	return(dirp);
	}

	struct	direct	*
readdir(dirp)
	DIR	*dirp;
	{
	union	REGS	r;
	struct	SREGS	s;
	short	cf;
	register struct	direct	*dp;
	char	*p, *q;

	/* if first call to readdir then just return info */
	dp = &dirp->_u;
	if(dirp->_dta_set)
		{
		dirp->_dta_set = 0;
		goto out;
		}
	
	/* set dta address */
	r.h.ah = 0x1a;
	r.x.dx = (int)&dirp->msdos_info;
	s.ds = dirp->_dta_dtaseg;
	intdosx(&r, &r, &s);
	r.h.ah = 0x4f;	/* search for next match */
	intdos(&r, &r);
	cf = r.x.cflag;
	/* * set dta back */
	r.x.bx = dirp->_dta_adr;
	s.es = dirp->_dta_seg;
	r.h.ah = 0x1a;	
	intdosx(&r, &r, &s);

	if (cf)	/* error = end of directory */ return(NULL);
out:
	for(p = dp->d_name, q = dirp->msdos_info.dta_fname ; *q ; p++, q++)
		if(*q >= 'A' && *q <= 'Z') *p = *q - 'A' + 'a';
		else *p = *q;
	*p = 0;
	dp->d_namlen = strlen(dp->d_name);
	dp->d_reclen = DIRSIZ(dp);
	return(dp);
	}

	void
closedir(dirp)
	DIR	*dirp;
	{
	free( (char *)dirp);
	}
#endif	/* } */
