/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

/* All the headers include this file. */
#include <_mingw.h>

#ifndef _DIRENT_H_
#define _DIRENT_H_

#pragma pack(push,_CRT_PACKING)

#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[260]; /* [FILENAME_MAX] */ /* File name. */
  };

  /*
  * 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* __cdecl __MINGW_NOTHROW opendir (const char*);
  struct dirent* __cdecl __MINGW_NOTHROW readdir (DIR*);
  int __cdecl __MINGW_NOTHROW closedir (DIR*);
  void __cdecl __MINGW_NOTHROW rewinddir (DIR*);
  long __cdecl __MINGW_NOTHROW telldir (DIR*);
  void __cdecl __MINGW_NOTHROW 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[260]; /* [FILENAME_MAX] */ /* File name. */
  };

  /*
  * 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* __cdecl __MINGW_NOTHROW _wopendir (const wchar_t*);
  struct _wdirent*  __cdecl __MINGW_NOTHROW _wreaddir (_WDIR*);
  int __cdecl __MINGW_NOTHROW _wclosedir (_WDIR*);
  void __cdecl __MINGW_NOTHROW _wrewinddir (_WDIR*);
  long __cdecl __MINGW_NOTHROW _wtelldir (_WDIR*);
  void __cdecl __MINGW_NOTHROW _wseekdir (_WDIR*, long);


#ifdef	__cplusplus
}
#endif

#endif	/* Not RC_INVOKED */

#pragma pack(pop)

#endif	/* Not _DIRENT_H_ */

