summaryrefslogtreecommitdiff
path: root/support/dktools/dk4strx.cpt
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
committerNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
commit1f457376b478257b88d4a857f5ec1b6155442dd7 (patch)
tree2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/dk4strx.cpt
parentac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff)
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/dk4strx.cpt')
-rw-r--r--support/dktools/dk4strx.cpt495
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 : */