1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5 
6 /*
7 	WARNING: This file was generated by the dkct program (see
8 	http://dktools.sourceforge.net/ for details).
9 	Changes you make here will be lost if dkct is run again!
10 	You should modify the original source and run dkct on it.
11 	Original source: dk4pathd.ctr
12 */
13 
14 /**	@file dk4pathd.c The dk4pathd module.
15 */
16 
17 
18 
19 #include "dk4conf.h"
20 
21 #include <libdk4c/dk4pathd.h>
22 #if DK4_CHAR_SIZE > 1
23 #include <libdk4c/dk4pathw.h>
24 #else
25 #include <libdk4c/dk4path8.h>
26 #endif
27 
28 #if	DK4_HAVE_ASSERT_H
29 #ifndef	ASSERT_H_INCLUDED
30 #include <assert.h>
31 #define	ASSERT_H_INCLUDED 1
32 #endif
33 #endif
34 
35 #include <libdk4base/dk4mem.h>
36 #include <libdk4base/dk4mpl.h>
37 #include <libdk4base/dk4strd.h>
38 
39 
40 
41 
42 
43 
44 
45 int
dk4path_is_absolute(const dkChar * path)46 dk4path_is_absolute(const dkChar *path)
47 {
48 #if	DK4_USE_ASSERT
49   assert(NULL != path);
50 #endif
51 #if DK4_CHAR_SIZE > 1
52   return (dk4pathw_is_absolute(path));
53 #else
54   return (dk4path8_is_absolute(path));
55 #endif
56 }
57 
58 
59 
60 int
dk4path_is_relative(const dkChar * path)61 dk4path_is_relative(const dkChar *path)
62 {
63 #if	DK4_USE_ASSERT
64   assert(NULL != path);
65 #endif
66 #if DK4_CHAR_SIZE > 1
67   return (dk4pathw_is_relative(path));
68 #else
69   return (dk4path8_is_relative(path));
70 #endif
71 }
72 
73 
74 
75 int
dk4path_append(dkChar * buffer,size_t sz,const dkChar * filename,dk4_er_t * erp)76 dk4path_append(
77   dkChar *buffer, size_t sz, const dkChar *filename, dk4_er_t *erp
78 )
79 {
80 #if	DK4_USE_ASSERT
81   assert(NULL != buffer);
82   assert(0 < sz);
83   assert(NULL != filename);
84 #endif
85 #if DK4_CHAR_SIZE > 1
86   return (dk4pathw_append(buffer, sz, filename, erp));
87 #else
88   return (dk4path8_append(buffer, sz, filename, erp));
89 #endif
90 }
91 
92 
93 
94 dkChar *
dk4path_get_suffix(const dkChar * filename,dk4_er_t * erp)95 dk4path_get_suffix(const dkChar *filename, dk4_er_t *erp)
96 {
97 #if	DK4_USE_ASSERT
98   assert(NULL != filename);
99 #endif
100 #if DK4_CHAR_SIZE > 1
101   return (dk4pathw_get_suffix(filename, erp));
102 #else
103   return (dk4path8_get_suffix(filename, erp));
104 #endif
105 }
106 
107 
108 
109 void
dk4path_correct_sep(dkChar * filename)110 dk4path_correct_sep(dkChar *filename)
111 {
112 #if	DK4_USE_ASSERT
113   assert(NULL != filename);
114 #endif
115 #if DK4_CHAR_SIZE > 1
116   dk4pathw_correct_sep(filename);
117 #else
118   dk4path8_correct_sep(filename);
119 #endif
120 }
121 
122 
123 
124 int
dk4path_must_expand(const dkChar * filename)125 dk4path_must_expand(const dkChar *filename)
126 {
127 #if	DK4_USE_ASSERT
128   assert(NULL != filename);
129 #endif
130 #if DK4_CHAR_SIZE > 1
131   return (dk4pathw_must_expand(filename));
132 #else
133   return (dk4path8_must_expand(filename));
134 #endif
135 }
136 
137 
138 
139 int
dk4path_is_in_subdir(const dkChar * filename,const dkChar * parent,dk4_er_t * erp)140 dk4path_is_in_subdir(const dkChar *filename,const dkChar *parent,dk4_er_t *erp)
141 {
142   dkChar	 buf[DK4_MAX_PATH];
143   size_t	 szf;
144   size_t	 szp;
145   int		 back = 0;
146 
147 #if	DK4_USE_ASSERT
148   assert(NULL != filename);
149   assert(NULL != parent);
150 #endif
151   if ((NULL != filename) && (NULL != parent)) {
152     if (0 != dk4str_cpy_s(buf, DK4_SIZEOF(buf,dkChar), filename, erp)) {
153       szf = dk4str_len(buf);
154       szp = dk4str_len(parent);
155       if (szf > szp) {
156 #if DK4_ON_WINDOWS || DK4_HAVE_BACKSLASH_AS_SEP
157 	if (buf[szp] == dkT('\\'))
158 #else
159         if (buf[szp] == dkT('/'))
160 #endif
161 	{
162 	  buf[szp] = dkT('\0');
163 	  if (0 == dk4str_pathcmp(buf, parent)) {
164 	    back = 1;
165 	  }
166 #if DK4_ON_WINDOWS || DK4_HAVE_BACKSLASH_AS_SEP
167 	  buf[szp] = dkT('\\');
168 #else
169           buf[szp] = dkT('/');
170 #endif
171 	}
172       } else {
173         if (szf == szp) {
174 	  if (0 == dk4str_pathcmp(buf, parent)) {
175 	    back = 1;
176 	  }
177 	}
178       }
179     }
180   } else {
181     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
182   }
183   return back;
184 }
185 
186 
187 
188 int
dk4path_set_suffix(dkChar * pdst,size_t szdst,dkChar const * srcname,dkChar const * newsu,dk4_er_t * erp)189 dk4path_set_suffix(
190   dkChar	*pdst,
191   size_t	 szdst,
192   dkChar const	*srcname,
193   dkChar const	*newsu,
194   dk4_er_t	*erp
195 )
196 {
197 #if	DK4_USE_ASSERT
198   assert(NULL != pdst);
199   assert(0 < szdst);
200   assert(NULL != srcname);
201   assert(NULL != newsu);
202 #endif
203 #if	DK4_CHAR_SIZE > 1
204   return (dk4pathw_set_suffix(pdst, szdst, srcname, newsu, erp));
205 #else
206   return (dk4path8_set_suffix(pdst, szdst, srcname, newsu, erp));
207 #endif
208 }
209 
210 
211 
212 dkChar *
dk4path_dup_change_suffix(dkChar const * srcname,dkChar const * newsu,dk4_er_t * erp)213 dk4path_dup_change_suffix(
214   dkChar const	*srcname,
215   dkChar const	*newsu,
216   dk4_er_t	*erp
217 )
218 {
219 #if	DK4_USE_ASSERT
220   assert(NULL != srcname);
221   assert(NULL != newsu);
222 #endif
223 #if	DK4_CHAR_SIZE > 1
224   return (dk4pathw_dup_change_suffix(srcname, newsu, erp));
225 #else
226   return (dk4path8_dup_change_suffix(srcname, newsu, erp));
227 #endif
228 }
229 
230 
231 
232 size_t
dk4path_concatenate_size(dkChar const * dirname,dkChar const * filename,dk4_er_t * erp)233 dk4path_concatenate_size(
234   dkChar const	*dirname,
235   dkChar const	*filename,
236   dk4_er_t	*erp
237 )
238 {
239 #if	DK4_USE_ASSERT
240   assert(NULL != dirname);
241   assert(NULL != filename);
242 #endif
243 #if	DK4_CHAR_SIZE > 1
244   return (dk4pathw_concatenate_size(dirname, filename, erp));
245 #else
246   return (dk4path8_concatenate_size(dirname, filename, erp));
247 #endif
248 }
249 
250 
251 
252 int
dk4path_concatenate_buffer(dkChar * buffer,size_t szbuf,dkChar const * dirn,dkChar const * filen,dk4_er_t * erp)253 dk4path_concatenate_buffer(
254   dkChar	*buffer,
255   size_t	 szbuf,
256   dkChar const	*dirn,
257   dkChar const	*filen,
258   dk4_er_t	*erp
259 )
260 {
261 #if	DK4_USE_ASSERT
262   assert(NULL != buffer);
263   assert(0 < szbuf);
264   assert(NULL != dirn);
265   assert(NULL != filen);
266 #endif
267 #if	DK4_CHAR_SIZE > 1
268   return (dk4pathw_concatenate_buffer(buffer, szbuf, dirn, filen, erp));
269 #else
270   return (dk4path8_concatenate_buffer(buffer, szbuf, dirn, filen, erp));
271 #endif
272 }
273 
274 
275 
276 dkChar *
dk4path_concatenate_new(dkChar const * dirn,dkChar const * filen,dk4_er_t * erp)277 dk4path_concatenate_new(
278   dkChar const	*dirn,
279   dkChar const	*filen,
280   dk4_er_t	*erp
281 )
282 {
283 #if	DK4_USE_ASSERT
284   assert(NULL != dirn);
285   assert(NULL != filen);
286 #endif
287 #if	DK4_CHAR_SIZE > 1
288   return (dk4pathw_concatenate_new(dirn, filen, erp));
289 #else
290   return (dk4path8_concatenate_new(dirn, filen, erp));
291 #endif
292 }
293 
294 
295 
296