/*

 * DIRENT.H (formerly DIRLIB.H)

 *

 * by M. J. Weinstein   Released to public domain 1-Jan-89

 *

 * Because I have heard that this feature (opendir, readdir, closedir)

 * it so useful for programmers coming from UNIX or attempting to port

 * UNIX code, and because it is reasonably light weight, I have included

 * it in the Mingw32 package. I have also added an implementation of

 * rewinddir, seekdir and telldir.

 *   - Colin Peters <colin@bird.fu.is.saga-u.ac.jp>

 *

 *  This code is distributed in the hope that is will be useful but

 *  WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY

 *  DISCLAIMED. This includeds but is not limited to warranties of

 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 *

 * $Revision$

 * $Author$

 * $Date$

 *

 */



#ifndef	__STRICT_ANSI__



#ifndef _DIRENT_H_

#define _DIRENT_H_



/* All the headers include this file. */

/*#include <_mingw.h>*/



#include <io.h>



#ifndef RC_INVOKED



#ifdef __cplusplus

extern "C" {

#endif



struct dirent

{

	long		d_ino;		/* Always zero. */

	unsigned short	d_reclen;	/* Always zero. */

	unsigned short	d_namlen;	/* Length of name in d_name. */

	char*		d_name;		/* File name. */

	/* NOTE: The name in the dirent structure points to the name in the

	 *       finddata_t structure in the DIR. */

};



/*

 * This is an internal data structure. Good programmers will not use it

 * except as an argument to one of the functions below.

 * dd_stat field is now int (was short in older versions).

 */

typedef struct

{

	/* disk transfer area for this dir */

	struct _finddata_t	dd_dta;



	/* dirent struct to return from dir (NOTE: this makes this thread

	 * safe as long as only one thread uses a particular DIR struct at

	 * a time) */

	struct dirent		dd_dir;



	/* _findnext handle */

	long			dd_handle;



	/*

         * Status of search:

	 *   0 = not started yet (next entry to read is first entry)

	 *  -1 = off the end

	 *   positive = 0 based index of next entry

	 */

	int			dd_stat;



	/* given path for dir with search pattern (struct is extended) */

	char			dd_name[1];

} DIR;



DIR*		opendir (const char*);

struct dirent*	readdir (DIR*);

int		closedir (DIR*);

void		rewinddir (DIR*);

long		telldir (DIR*);

void		seekdir (DIR*, long);





/* wide char versions */



struct _wdirent

{

	long		d_ino;		/* Always zero. */

	unsigned short	d_reclen;	/* Always zero. */

	unsigned short	d_namlen;	/* Length of name in d_name. */

	wchar_t*	d_name;		/* File name. */

	/* NOTE: The name in the dirent structure points to the name in the	 *       wfinddata_t structure in the _WDIR. */

};



/*

 * This is an internal data structure. Good programmers will not use it

 * except as an argument to one of the functions below.

 */

typedef struct

{

	/* disk transfer area for this dir */

	struct _wfinddata_t	dd_dta;



	/* dirent struct to return from dir (NOTE: this makes this thread

	 * safe as long as only one thread uses a particular DIR struct at

	 * a time) */

	struct _wdirent		dd_dir;



	/* _findnext handle */

	long			dd_handle;



	/*

         * Status of search:

	 *   0 = not started yet (next entry to read is first entry)

	 *  -1 = off the end

	 *   positive = 0 based index of next entry

	 */

	int			dd_stat;



	/* given path for dir with search pattern (struct is extended) */

	wchar_t			dd_name[1];

} _WDIR;







_WDIR*		_wopendir (const wchar_t*);

struct _wdirent* _wreaddir (_WDIR*);

int		_wclosedir (_WDIR*);

void		_wrewinddir (_WDIR*);

long		_wtelldir (_WDIR*);

void		_wseekdir (_WDIR*, long);





#ifdef	__cplusplus

}

#endif



#endif	/* Not RC_INVOKED */



#endif	/* Not _DIRENT_H_ */



#endif	/* Not __STRICT_ANSI__ */