#ifndef ACL_DIR_INCLUDE_H
#define ACL_DIR_INCLUDE_H

#ifdef __cplusplus
extern "C" {
#endif

#include "acl_define.h"

#if defined(_WIN32) || defined(_WIN64)

#if !defined(_UNICODE)

/**
 * dirent structure returned by readdir().
 */
struct dirent {
	char d_name[260];
};

/**
 * DIR type returned by opendir().  The members of this structure
 * must not be accessed by application programs.
 */
typedef struct {
    HANDLE        _d_hdir;              /**< directory handle */
    char         *_d_dirname;           /**< directory name */
    unsigned      _d_magic;             /**< magic cookie for verifying handle */
    unsigned      _d_nfiles;            /**< no. of files remaining in buf */
    char          _d_buf[sizeof(WIN32_FIND_DATA)];  /**< buffer for a single file */
} DIR;

/**
 * Prototypes.
 */
ACL_API DIR *opendir(const char *dirname);
ACL_API struct dirent *readdir(DIR *dir);
ACL_API int closedir(DIR *dir);
ACL_API void rewinddir(DIR *dir);

/* @: directory functions */

#define _topendir       opendir
#define _treaddir       readdir
#define _trewinddir     rewinddir
#define _tclosedir      closedir
#define _tDIR           DIR
#define _tdirent        dirent

#else  /* _UNICODE */

/* wdirent structure returned by wreaddir().
*/
struct wdirent {
	wchar_t d_name[260];
};

typedef struct {
    unsigned long _d_hdir;              /**< directory handle */
    wchar_t      *_d_dirname;           /**< directory name */
    unsigned      _d_magic;             /**< magic cookie for verifying handle */
    unsigned      _d_nfiles;            /**< no. of files remaining in buf */
    char          _d_buf[sizeof(WIN32_FIND_DATA)];  /**< buffer for a single file */
} wDIR;

ACL_API wDIR *wopendir(const wchar_t *dirname);
ACL_API struct wdirent *wreaddir(wDIR *dir);
ACL_API int wclosedir (wDIR *dir);
ACL_API void wrewinddir(wDIR *dir);

/* @: directory functions */

#define _topendir       wopendir
#define _treaddir       wreaddir
#define _trewinddir     wrewinddir
#define _tclosedir      wclosedir
#define _tDIR           wDIR
#define _tdirent        wdirent

#endif	/* _UNICODE */

#endif /* _WIN32 */

#ifdef __cplusplus
}
#endif

#endif

