/*
 * 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 includes but is not limited to warranties of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Martin Otter, 2001/01/06:
 *    Removed:   #ifndef __STRICT_ANSI__
 *               #include <_mingw.h>
 *    since not needed in Modelica
 */

#ifndef _WIN32_DIRENT_H_
#define _WIN32_DIRENT_H_

#include <io.h>

#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. */
};

#if (defined(_MSC_VER) && _MSC_VER >= 1300) || defined(__MINGW32__)
typedef intptr_t find_t;
#else
typedef long find_t;
#endif

/*
 * 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 _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 */
    find_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
     */
    short 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);

#ifdef __cplusplus
}
#endif

#endif /* Not _WIN32_DIRENT_H_ */
