diff options
Diffstat (limited to 'perf/dirent-win32.h')
-rw-r--r-- | perf/dirent-win32.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/perf/dirent-win32.h b/perf/dirent-win32.h new file mode 100644 index 000000000..0f2ed05e5 --- /dev/null +++ b/perf/dirent-win32.h @@ -0,0 +1,102 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Andrea Canciani <ranma42@gmail.com> + */ + +#include "cairo-compiler-private.h" + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +#define stat _stat + +#define S_ISDIR(s) ((s) & _S_IFDIR) + +struct dirent { + ino_t d_ino; + char d_name[FILENAME_MAX + 1]; +}; + +typedef struct _DIR { + HANDLE handle; + cairo_bool_t has_next; + WIN32_FIND_DATA data; + struct dirent de; +} DIR; + +static DIR * +opendir(const char *dirname) +{ + DIR *dirp; + + dirp = malloc (sizeof (*dirp)); + if (unlikely (dirp == NULL)) + return NULL; + + dirp->handle = FindFirstFile(dirname, &dirp->data); + + if (unlikely (dirp->handle == INVALID_HANDLE_VALUE)) { + free (dirp); + return NULL; + } + + memcpy (dirp->de.d_name, dirp->data.cFileName, + sizeof (dirp->data.cFileName)); + dirp->de.d_name[FILENAME_MAX] = '\0'; + + dirp->has_next = TRUE; + + return dirp; +} + +static int +closedir(DIR *dirp) +{ + int ret; + + ret = ! FindClose (dirp->handle); + + free (dirp); + + /* TODO: set errno */ + + return ret; +} + +static struct dirent * +readdir(DIR *dirp) +{ + if (! dirp->has_next) + return NULL; + + /* COMPILE_TIME_ASSERT (FILENAME_MAX == sizeof (dirp->data.cFileName)); */ + + memcpy (dirp->de.d_name, dirp->data.cFileName, + sizeof (dirp->data.cFileName)); + dirp->de.d_name[FILENAME_MAX] = '\0'; + + dirp->has_next = FindNextFile (dirp->handle, &dirp->data); + + return &dirp->de; +} |