/**
 * 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 */
    intptr_t			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 */
    intptr_t			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_ */

