%% options copyright owner = Dirk Krause copyright year = 2015-xxxx license = bsd %% header /** @file String operations for path names (dkChar characters). */ #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_HAVE_WCHAR_H #ifndef WCHAR_H_INCLUDED #include #define WCHAR_H_INCLUDED 1 #endif #endif #ifdef __cplusplus extern "C" { #endif /** Check whether a file name is an absolute path. CRT on Windows: Not used. @param path Path name to check. @return 1 for absolute path, 0 for other path. */ int dk4path_is_absolute(const dkChar *path); /** Check whether a file name is a relative path. CRT on Windows: Not used. @param path Path name to check. @return 1 for absolute path, 0 for other path. */ int dk4path_is_relative(const dkChar *path); /** Append path filename to path name already stored in buffer. CRT on Windows: Optional, disabling CRT degrades performance. @param buffer Buffer already containing a path. @param sz Buffer size. @param filename Relative file name to append to buffer. @param erp Error report, may be NULL. @return 1 on success, 0 on error. Error codes: - DK4_E_INVALID_ARGUMENTS
if buffer or filename is NULL or sz is 0, - DK4_E_MATH_OVERFLOW
if filename is too long, - DK4_E_MEMORY
if allocation of a filename copy fails, - DK4_E_SYNTAX
if too many .. in filename, - DK4_E_BUFFER_TOO_SMALL
if buffer size is too small. */ int dk4path_append( dkChar *buffer, size_t sz, const dkChar *filename, dk4_er_t *erp ); /** Find pointer to suffix. CRT on Windows: Not used. @param filename File name to find suffix for. @param erp Error report, may be NULL. @return Pointer to suffix dot if found, NULL otherwise. Error codes: - DK4_E_INVALID_ARGUMENTS
if filename is NULL, - DK4_E_NOT_FOUND
if the file name does not contain a suffix. */ dkChar * dk4path_get_suffix(const dkChar *filename, dk4_er_t *erp); /** Correct file name separators from slash to backslash on Windows, vice versa on other systems. CRT on Windows: Not used. @param filename File name to correct. */ void dk4path_correct_sep(dkChar *filename); /** Check whether file name needs expansion on Windows. CRT on Windows: Not used. @param filename File name to check. @return 1 if expansion is necessary, 0 otherwise. */ int dk4path_must_expand(const dkChar *filename); /** Check whether filename is in the specified parent directory. It may be equal to parent or below the parent directory. @param filename File or directory name to check. @param parent Parent directory. @param erp Error report, may be NULL. @return 1 for true, 0 for false. Error codes: - DK4_E_INVALID_ARGUMENTS
if filename or parent is NULL, - DK4_E_BUFFER_TOO_SMALL
if filename is too long for an internal buffer. */ int dk4path_is_in_subdir(const dkChar *filename,const dkChar *parent,dk4_er_t *erp); #ifdef __cplusplus } #endif %% module #include "dk4pathd.h" #if DK4_CHAR_SIZE > 1 #include "dk4pathw.h" #else #include "dk4path8.h" #endif #include "dk4mem.h" #include "dk4mpl.h" #include "dk4strd.h" $!trace-include int dk4path_is_absolute(const dkChar *path) { #if DK4_CHAR_SIZE > 1 return (dk4pathw_is_absolute(path)); #else return (dk4path8_is_absolute(path)); #endif } int dk4path_is_relative(const dkChar *path) { #if DK4_CHAR_SIZE > 1 return (dk4pathw_is_relative(path)); #else return (dk4path8_is_relative(path)); #endif } int dk4path_append( dkChar *buffer, size_t sz, const dkChar *filename, dk4_er_t *erp ) { #if DK4_CHAR_SIZE > 1 return (dk4pathw_append(buffer, sz, filename, erp)); #else return (dk4path8_append(buffer, sz, filename, erp)); #endif } dkChar * dk4path_get_suffix(const dkChar *filename, dk4_er_t *erp) { #if DK4_CHAR_SIZE > 1 return (dk4pathw_get_suffix(filename, erp)); #else return (dk4path8_get_suffix(filename, erp)); #endif } void dk4path_correct_sep(dkChar *filename) { #if DK4_CHAR_SIZE > 1 dk4pathw_correct_sep(filename); #else dk4path8_correct_sep(filename); #endif } int dk4path_must_expand(const dkChar *filename) { #if DK4_CHAR_SIZE > 1 return (dk4pathw_must_expand(filename)); #else return (dk4path8_must_expand(filename)); #endif } int dk4path_is_in_subdir(const dkChar *filename,const dkChar *parent,dk4_er_t *erp) { dkChar buf[DK4_MAX_PATH]; size_t szf; size_t szp; int back = 0; $? "+ dk4path_is_in_subdir f=\"%!ds\" p=\"%!ds\"", filename, parent if ((NULL != filename) && (NULL != parent)) { if (0 != dk4str_cpy_s(buf, DK4_SIZEOF(buf,dkChar), filename, erp)) { szf = dk4str_len(buf); szp = dk4str_len(parent); if (szf > szp) { $? ". filename larger than parent" #if DK4_ON_WINDOWS if (buf[szp] == dkT('\\')) #else if (buf[szp] == dkT('/')) #endif { $? ". separator at right place" buf[szp] = dkT('\0'); if (0 == dk4str_pathcmp(buf, parent)) { back = 1; $? ". match" } #if DK4_ON_WINDOWS buf[szp] = dkT('\\'); #else buf[szp] = dkT('/'); #endif } } else { if (szf == szp) { $? ". equal lengths" if (0 == dk4str_pathcmp(buf, parent)) { back = 1; $? ". match" } } } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } $? "- dk4path_is_in_subdir %d", back return back; }