# define WIN32_EXTRA_LEAN
# define STRICT
# include <windows.h>
+# include <io.h>
+
+#if defined(_MSC_VER)
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif
+
+#define FC_UINT64_FORMAT "I64u"
+
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+
+#ifndef S_ISDIR
+#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
#endif
+#ifndef F_OK
+#define F_OK 0
+#endif
+#ifndef X_OK
+#define X_OK 0 /* no execute bit on windows */
+#endif
+#ifndef W_OK
+#define W_OK 2
+#endif
+#ifndef R_OK
+#define R_OK 4
+#endif
+
+/* MingW provides dirent.h / openddir(), but MSVC does not */
+#ifndef HAVE_DIRENT_H
+
+#define HAVE_STRUCT_DIRENT_D_TYPE 1
+
+typedef struct DIR DIR;
+
+typedef enum {
+ DT_UNKNOWN = 0,
+ DT_DIR,
+ DT_REG,
+} DIR_TYPE;
+
+typedef struct dirent {
+ const char *d_name;
+ DIR_TYPE d_type;
+} dirent;
+
+#define opendir(dirname) FcCompatOpendirWin32(dirname)
+#define closedir(d) FcCompatClosedirWin32(d)
+#define readdir(d) FcCompatReaddirWin32(d)
+
+DIR * FcCompatOpendirWin32 (const char *dirname);
+
+struct dirent * FcCompatReaddirWin32 (DIR *dir);
+
+int FcCompatClosedirWin32 (DIR *dir);
+
+#endif /* HAVE_DIRENT_H */
+
+#endif /* _WIN32 */
+
#endif /* _FCWINDOWS_H_ */