diff options
author | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-09-20 03:03:26 +0000 |
commit | 1f457376b478257b88d4a857f5ec1b6155442dd7 (patch) | |
tree | 2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/dk4strx.cpt | |
parent | ac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff) |
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/dk4strx.cpt')
-rw-r--r-- | support/dktools/dk4strx.cpt | 495 |
1 files changed, 493 insertions, 2 deletions
diff --git a/support/dktools/dk4strx.cpt b/support/dktools/dk4strx.cpt index cf8b9c8ea9..7ac7d0bff1 100644 --- a/support/dktools/dk4strx.cpt +++ b/support/dktools/dk4strx.cpt @@ -2,7 +2,7 @@ copyright owner = Dirk Krause copyright year = 2015-xxxx -license = bsd +SPDX-License-Identifier: BSD-3-Clause %% header @@ -10,23 +10,43 @@ license = bsd */ #ifndef DK4CONF_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" +#else +#include <dktools-4/dk4conf.h> +#endif #endif #ifndef DK4TYPES_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" +#else +#include <dktools-4/dk4types.h> +#endif #endif #ifndef DK4CONST_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4const.h" +#else +#include <dktools-4/dk4const.h> +#endif #endif #ifndef DK4ERROR_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" +#else +#include <dktools-4/dk4error.h> +#endif #endif #ifndef DK4WXCS_H_INCLUDED +#if DK4_BUILDING_DKTOOLS4 #include "dk4wxcs.h" +#else +#include <dktools-4/dk4wxcs.h> +#endif #endif @@ -58,6 +78,20 @@ license = bsd #endif #endif + + +#if DK4_ON_WINDOWS || DK4_HAVE_BACKSLASH +/** File name separator. +*/ +#define DK4_WX_CHAR_SEP wxT('\\') +#else +/** File name separator. +*/ +#define DK4_WX_CHAR_SEP wxT('/') +#endif + + + #ifdef __cplusplus extern "C" { #endif @@ -303,21 +337,258 @@ dk4strx_rtwh(wxChar *str, const wxChar *whsp); void dk4strx_delnl(wxChar *lptr); +/** Find file name suffix. + @param filename File name to find suffix from. + @param erp Error report, may be NULL. + @return Valid pointer on success, NULL on error. +*/ +wxChar const * +dk4strx_get_path_suffix(wxChar const *filename, dk4_er_t *erp); + +/** 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 +dk4strx_path_is_absolute(const wxChar *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 +dk4strx_path_is_relative(const wxChar *path); + +/** Append path filename to path name already stored in buffer. + Resolve . and .. for current directory and parent directory. + 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<br> + if buffer or filename is NULL or sz is 0, + - DK4_E_MATH_OVERFLOW<br> + if filename is too long, + - DK4_E_MEMORY<br> + if allocation of a filename copy fails, + - DK4_E_SYNTAX<br> + if too many .. in filename, + - DK4_E_BUFFER_TOO_SMALL<br> + if buffer size is too small. +*/ +int +dk4strx_path_append( + wxChar *buffer, size_t sz, const wxChar *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<br> + if filename is NULL, + - DK4_E_NOT_FOUND<br> + if the file name does not contain a suffix. +*/ +wxChar * +dk4strx_path_get_suffix(const wxChar *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 +dk4strx_path_correct_sep(wxChar *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 +dk4strx_path_must_expand(const wxChar *filename); + +/** Create file name with specified suffix. + @param pdst Destination buffer. + @param szdst Size of pdst (number of wxChar). + @param srcname Source file name. + @param newsu New file suffix. + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if pdst or srcname or newsu is NULL or szdst is 0, + - DK4_E_BUFFER_TOO_SMALL<br> + if the dst buffer is too small. + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overflow occured in size calculation, +*/ +int +dk4strx_path_set_suffix( + wxChar *pdst, + size_t szdst, + wxChar const *srcname, + wxChar const *newsu, + dk4_er_t *erp +); + +/** Create a dynamic copy of a file name with changed suffix. + @param srcname Old file name. + @param newsu New suffix. + @param erp Error report, may be NULL. + @return Valid pointer to changed file name on success, NULL on error. + On success call dk4mem_free() on the pointer when no longer needed + to release the memory. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if srcname or newsu is NULL, + - DK4_E_BUG<br> + if a bug occured, + - DK4_E_MATH_OVERFLOW<br> + if a mathematical overflow occured in size calculation, + - DK4_E_MEMORY_ALLOCATION_FAILED<br> + with mem.elsize and mem.nelem set if there is not enough memory + available. +*/ +wxChar * +dk4strx_path_dup_change_suffix( + wxChar const *srcname, + wxChar const *newsu, + dk4_er_t *erp +); + +/** Calculate buffer size required to concatenate a directory + name and a file name. + @param dirname Directory name. + @param filename File name. + @param erp Error report, may be NULL. + @return Buffer size for concatenated names including the finalizer + byte on success, 0 on error. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if dirname or filename is NULL, + - DK4_E_MATH_OVERFLOW<br> + if the calculation results in a numeric overflow. +*/ +size_t +dk4strx_path_concatenate_size( + wxChar const *dirname, + wxChar const *filename, + dk4_er_t *erp +); + +/** Concatenate a directory name and a file name into an existing buffer. + This function simply concatenates directory name and file name, + . and .. for current and parent directory are not resolved. + @param buffer Result buffer for combined file name. + @param szbuf Buffer size (number of wxChar). + @param dirn Directory name. + @param filen File name. + @param erp Error report, may be NULL. + @return 1 on success, 0 on error. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if buffer, dirn or filen is NULL or szbuf is 0, + - DK4_E_BUFFER_TOO_SMALL<br> + if the buffer is too small. +*/ +int +dk4strx_path_concatenate_buffer( + wxChar *buffer, + size_t szbuf, + wxChar const *dirn, + wxChar const *filen, + dk4_er_t *erp +); + +/** Concatenate a directory name and a file name into newly + allocated memory. + This function simply concatenates directory name and file name, + . and .. for current and parent directory are not resolved. + @param dirn Directory name. + @param filen File name. + @param erp Error report, may be NULL. + @return Valid pointer to newly allocated memory containing the + concatenation on success, NULL on error. + On success use dk4mem_free() to release the memory when done + with it. + + Error codes: + - DK4_E_INVALID_ARGUMENTS<br> + if dirn or filen is NULL, + - DK4_E_MATH_OVERFLOW<br> + if the size calculation results in a numeric overflow. + - DK4_E_MEMORY_ALLOCATION_FAILED<br> + if the memory allocation failed, + - DK4_E_BUFFER_TOO_SMALL<br> + if the buffer is too small. +*/ +wxChar * +dk4strx_path_concatenate_new( + wxChar const *dirn, + wxChar const *filen, + dk4_er_t *erp +); + + +/** Check whether a file name is in specified directory. + There is no check for the presence of the file, just + a name check. + @param filename File name to check. + @param parent Directory the file should be in. + @param erp Error report, may be NULL. + @return Non-zero value if file is in directory, 0 otherwise. +*/ +int +dk4strx_path_is_in_subdir( + const wxChar *filename, + const wxChar *parent, + dk4_er_t *erp +); + #ifdef __cplusplus } #endif +/* vim: set ai sw=4 ts=4 : */ %% module -#include "dk4strx.h" +#include "dk4conf.h" +#ifndef DK4_SIZEOF_WXCHAR +#ifndef DK4WXCS_H_INCLUDED +#include "dk4wxcs.h" +#endif +#endif + +#include "dk4strx.h" +#include "dk4mem.h" +#include "dk4mpl.h" #if DK4_SIZEOF_WXCHAR > 1 #include "dk4strw.h" +#include "dk4pathw.h" #else #include "dk4str8.h" +#include "dk4path8.h" #endif @@ -599,3 +870,223 @@ dk4strx_delnl(wxChar *lptr) #endif } + +wxChar const * +dk4strx_get_path_suffix(wxChar const *filename, dk4_er_t *erp) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_get_suffix(filename, erp)); +#else + return (dk4path8_get_suffix(filename, erp)); +#endif +} + + + +int +dk4strx_path_is_absolute(const wxChar *path) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_is_absolute(path)); +#else + return (dk4path8_is_absolute(path)); +#endif +} + + + +int +dk4strx_path_is_relative(const wxChar *path) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_is_relative(path)); +#else + return (dk4path8_is_relative(path)); +#endif +} + + + +int +dk4strx_path_append( + wxChar *buffer, size_t sz, const wxChar *filename, dk4_er_t *erp +) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_append(buffer, sz, filename, erp)); +#else + return (dk4path8_append(buffer, sz, filename, erp)); +#endif +} + + + +wxChar * +dk4strx_path_get_suffix(const wxChar *filename, dk4_er_t *erp) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_get_suffix(filename, erp)); +#else + return (dk4path8_get_suffix(filename, erp)); +#endif +} + + + +void +dk4strx_path_correct_sep(wxChar *filename) +{ +#if DK4_SIZEOF_WXCHAR > 1 + dk4pathw_correct_sep(filename); +#else + dk4path8_correct_sep(filename); +#endif +} + + + +int +dk4strx_path_must_expand(const wxChar *filename) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_must_expand(filename)); +#else + return (dk4path8_must_expand(filename)); +#endif +} + + + +int +dk4strx_path_set_suffix( + wxChar *pdst, + size_t szdst, + wxChar const *srcname, + wxChar const *newsu, + dk4_er_t *erp +) +{ + +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_set_suffix(pdst, szdst, srcname, newsu, erp)); +#else + return (dk4path8_set_suffix(pdst, szdst, srcname, newsu, erp)); +#endif +} + + + +wxChar * +dk4strx_path_dup_change_suffix( + wxChar const *srcname, + wxChar const *newsu, + dk4_er_t *erp +) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_dup_change_suffix(srcname, newsu, erp)); +#else + return (dk4path8_dup_change_suffix(srcname, newsu, erp)); +#endif +} + + + +size_t +dk4strx_path_concatenate_size( + wxChar const *dirname, + wxChar const *filename, + dk4_er_t *erp +) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_concatenate_size(dirname, filename, erp)); +#else + return (dk4path8_concatenate_size(dirname, filename, erp)); +#endif +} + + + +int +dk4strx_path_concatenate_buffer( + wxChar *buffer, + size_t szbuf, + wxChar const *dirn, + wxChar const *filen, + dk4_er_t *erp +) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_concatenate_buffer(buffer, szbuf, dirn, filen, erp)); +#else + return (dk4path8_concatenate_buffer(buffer, szbuf, dirn, filen, erp)); +#endif +} + + + +wxChar * +dk4strx_path_concatenate_new( + wxChar const *dirn, + wxChar const *filen, + dk4_er_t *erp +) +{ +#if DK4_SIZEOF_WXCHAR > 1 + return (dk4pathw_concatenate_new(dirn, filen, erp)); +#else + return (dk4path8_concatenate_new(dirn, filen, erp)); +#endif +} + + + +int +dk4strx_path_is_in_subdir( + const wxChar *filename,const wxChar *parent,dk4_er_t *erp +) +{ + wxChar buf[DK4_MAX_PATH]; + size_t szf; + size_t szp; + int back = 0; + $? "+ dk4path_is_in_subdir f=\"%!ws\" p=\"%!ws\"", filename, parent + if ((NULL != filename) && (NULL != parent)) { + if (0 != dk4strx_cpy_s(buf, DK4_SIZEOF(buf,wxChar), filename, erp)) { + szf = dk4strx_len(buf); + szp = dk4strx_len(parent); + if (szf > szp) { $? ". filename larger than parent" +#if DK4_ON_WINDOWS || DK4_HAVE_BACKSLASH_AS_SEP + if (buf[szp] == wxT('\\')) +#else + if (buf[szp] == wxT('/')) +#endif + { $? ". separator at right place" + buf[szp] = wxT('\0'); + if (0 == dk4strx_pathcmp(buf, parent)) { + back = 1; $? ". match" + } +#if DK4_ON_WINDOWS || DK4_HAVE_BACKSLASH_AS_SEP + buf[szp] = wxT('\\'); +#else + buf[szp] = wxT('/'); +#endif + } + } else { + if (szf == szp) { $? ". equal lengths" + if (0 == dk4strx_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; +} + + + +/* vim: set ai sw=4 ts=4 : */ |