%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file Directory traversal using dkChar file names. CRT on Windows: Optional. */ #ifndef DK4CONF_H_INCLUDED #include "dk4conf.h" #endif #ifndef DK4TYPES_H_INCLUDED #include "dk4types.h" #endif #ifndef DK4ERROR_H_INCLUDED #include "dk4error.h" #endif #if DK4_CHAR_SIZE > 1 #ifndef DK4DIRWC_H_INCLUDED #include "dk4dirwc.h" #endif #else #ifndef DK4DIR08_H_INCLUDED #include "dk4dir08.h" #endif #endif #if DK4_CHAR_SIZE > 1 /** Directory listing. */ typedef dk4_dir_wc_t dk4_dir_t; #else /** Directory listing. */ typedef dk4_dir_c8_t dk4_dir_t; #endif #ifdef __cplusplus extern "C" { #endif /** Open directory, create directory structure. @param path Directory path name. @param om Opening mode. @param erp Error report, may be NULL. @return Pointer to new directory structure on success, NULL on error. On success use dk4dir_close() to destroy the directory structure. Error codes: - DK4_E_INVALID_ARGUMENTS
if path is NULL, - DK4_E_NOT_SUPPORTED
if no function to traverse directories was found during build process, - DK4_E_MEMORY_ALLOCATION_FAILED
if a memory allocation failed, - DK4_E_MATH_OVERFLOW
if a mathematical overflow occured in a size calculation, - DK4_E_BUFFER_TOO_SMALL
if one of the involved directory or file names is too long for an internal buffer, - DK4_E_OPENDIR_FAILED
with errno value in iDetails1 if the attempt to open the directory failed, - DK4_E_FINDFIRSTFILE_FAILED
with GetLastError() value in lDetails1 if the FindFirstFile() function failed on Windows, - DK4_E_SYSTEM
if the stat() or lstat() function failed for one of the directory items. */ dk4_dir_t * dk4dir_open(const dkChar *path, int om, dk4_er_t *erp); /** Destroy directory structure. @param dptr Structure to destroy. */ void dk4dir_close(dk4_dir_t *dptr); /** Reset directory traversal. @param dptr Directory structure. */ void dk4dir_reset(dk4_dir_t *dptr); /** Retrieve directory path. @param dptr Directory structure. @return Directory path on success, NULL on error or if no directory was specified for a file name expansion. */ const dkChar * dk4dir_get_path(dk4_dir_t *dptr); /** Retrieve next directory name. @param dptr Directory structure. @return Pointer to short name on success, NULL if there are no more directories. */ const dkChar * dk4dir_next_dir(dk4_dir_t *dptr); /** Retrieve next file (non-directory) name. @param dptr Directory structure. @return Pointer to short name on success, NULL if there are no more files. */ const dkChar * dk4dir_next_file(dk4_dir_t *dptr); /** Skip files (remove information about files, release memory). @param dptr Directory structure. */ void dk4dir_skip_files(dk4_dir_t *dptr); /** Get maximum entry name length. @param dptr Directory. @return Maximum name length. */ size_t dk4dir_get_max_entry_length(dk4_dir_t *dptr); #ifdef __cplusplus } #endif /** Open modes for directories. */ enum { /* Value definitions */ /** Sort file names. */ DK4_DIR_OPEN_SORTED = 1, /** Treat symbolic links pointing to directories as files. */ DK4_DIR_SYMLINK_DIR_AS_FILE = 2, /* Default modes for special purposes */ /** For deltree we do not follow symbolic links, no need for sorting. */ DK4_DIR_OPEN_DELTREE = DK4_DIR_SYMLINK_DIR_AS_FILE }; %% module #include "dk4dir.h" #if DK4_CHAR_SIZE > 1 #include "dk4dirwc.h" #else #include "dk4dir08.h" #endif dk4_dir_t * dk4dir_open(const dkChar *path, int om, dk4_er_t *erp) { #if DK4_CHAR_SIZE > 1 return (dk4dir_wc_open(path, om, erp)); #else return (dk4dir_c8_open(path, om, erp)); #endif } void dk4dir_close(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 dk4dir_wc_close(dptr); #else dk4dir_c8_close(dptr); #endif } void dk4dir_reset(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 dk4dir_wc_reset(dptr); #else dk4dir_c8_reset(dptr); #endif } const dkChar * dk4dir_get_path(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 return (dk4dir_wc_get_path(dptr)); #else return (dk4dir_c8_get_path(dptr)); #endif } const dkChar * dk4dir_next_dir(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 return (dk4dir_wc_next_dir(dptr)); #else return (dk4dir_c8_next_dir(dptr)); #endif } const dkChar * dk4dir_next_file(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 return (dk4dir_wc_next_file(dptr)); #else return (dk4dir_c8_next_file(dptr)); #endif } void dk4dir_skip_files(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 dk4dir_wc_skip_files(dptr); #else dk4dir_c8_skip_files(dptr); #endif } size_t dk4dir_get_max_entry_length(dk4_dir_t *dptr) { #if DK4_CHAR_SIZE > 1 return (dk4dir_wc_get_max_entry_length(dptr)); #else return (dk4dir_c8_get_max_entry_length(dptr)); #endif }