diff --git a/qse/include/qse/fs/dir.h b/qse/include/qse/fs/dir.h index 03bfea11..ec3fd3e2 100644 --- a/qse/include/qse/fs/dir.h +++ b/qse/include/qse/fs/dir.h @@ -24,14 +24,26 @@ #include #include +typedef struct qse_dir_ent_t qse_dir_ent_t; + +struct qse_dir_ent_t +{ + enum + { + QSE_DIR_ENT_UNKNOWN, + QSE_DIR_ENT_DIRECTORY, + QSE_DIR_ENT_REGULAR, + QSE_DIR_ENT_FIFO, + QSE_DIR_ENT_CHAR, + QSE_DIR_ENT_BLOCK, + QSE_DIR_ENT_LINK + } type; + qse_foff_t size; + const qse_char_t* name; +}; typedef struct qse_dir_t qse_dir_t; -struct qse_dir_t -{ - QSE_DEFINE_COMMON_FIELDS (dir) -}; - #ifdef __cplusplus extern "C" { #endif diff --git a/qse/lib/fs/dir.c b/qse/lib/fs/dir.c new file mode 100644 index 00000000..3a9143b9 --- /dev/null +++ b/qse/lib/fs/dir.c @@ -0,0 +1,114 @@ +/* + * $Id$ + * + Copyright 2006-2011 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + +#include +#include "../cmn/mem.h" +#include + +#if defined(_WIN32) +# include +#endif + +struct qse_dir_t +{ + QSE_DEFINE_COMMON_FIELDS (dir) + qse_dir_ent_t ent; + +#if defined(_WIN32) + HANDLE handle; + WIN32_FIND_DATA wfd; + int no_more; +#else + +#endif +}; + +int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* name); + +qse_dir_t* qse_dir_open ( + qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t* name) +{ + qse_dir_t* dir; + + dir = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(*dir)); + if (dir == QSE_NULL) return QSE_NULL; + + if (qse_dir_init (dir, mmgr, name) <= -1) + { + QSE_MMGR_FREE (mmgr, dir); + return QSE_NULL; + } + + return dir; +} + +int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* name) +{ + QSE_MEMSET (dir, 0, QSE_SIZEOF(*dir)); + +#if defined(_WIN32) + dir->handle = FindFirstFile (name, &dir->wfd); + if (dir->handle == INVALID_HANDLE_VALUE) return -1; + return 0; +#else + return -1; +#endif +} + +void qse_dir_fini (qse_dir_t* dir) +{ +#if defined(_WIN32) + FindClose (dir->handle); +#endif +} + +qse_dir_ent_t* qse_dir_read (qse_dir_t* dir) +{ +#if defined(_WIN32) + if (dir->no_more) return QSE_NULL; + + if (dir->wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + dir->ent.size = 0; + dir->ent.type = QSE_DIR_ENT_DIRECTORY; + } + else + { + LARGE_INTEGER li; + + li.LowPart = dir->wfd.nFileSizeLow; + li.HighPart = dir->wfd.nFileSizeHigh; + dir->ent.size = li.QuadPart; + dir->ent.type = QSE_DIR_ENT_UNKNOWN; + } + +// TODO: proper management... + dir->ent.name = qse_strdup (dir->wfd.cFileName, dir->mmgr); + + if (FindNextFile (dir->handle, &dir->wfd) == FALSE) dir->no_more = 1; +#endif + + return &dir->ent; +} + +int qse_dir_rewind (qse_dir_t* dir) +{ + return 0; +}