gwenhywfar 5.14.1
directory_all.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Sun Nov 23 2003
3 copyright : (C) 2019 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * *
8 * This library is free software; you can redistribute it and/or *
9 * modify it under the terms of the GNU Lesser General Public *
10 * License as published by the Free Software Foundation; either *
11 * version 2.1 of the License, or (at your option) any later version. *
12 * *
13 * This library is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16 * Lesser General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU Lesser General Public *
19 * License along with this library; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 * *
23 ***************************************************************************/
24
25
26#ifdef HAVE_CONFIG_H
27# include <config.h>
28#endif
29
30
31#include <gwenhywfar/directory.h>
32#include <gwenhywfar/debug.h>
33#include <gwenhywfar/path.h>
34#include <gwenhywfar/buffer.h>
35#include <gwenhywfar/text.h>
36
37#ifdef HAVE_UNISTD_H
38# include <unistd.h>
39#endif
40#ifdef HAVE_SYS_STAT_H
41# include <sys/stat.h>
42#endif
43#include <sys/types.h>
44#ifdef HAVE_FCNTL_H
45# include <fcntl.h>
46#endif
47#include <string.h>
48#include <errno.h>
49#include <assert.h>
50#include <stdlib.h>
51#include <ctype.h>
52
53#ifdef OS_WIN32
54# define DIRSEP "\\"
55#else
56# define DIRSEP "/"
57#endif
58
59#define DISABLE_DEBUGLOG
60
61
62
63/* ------------------------------------------------------------------------------------------------
64 * forward declarations
65 * ------------------------------------------------------------------------------------------------
66 */
67
68
69static void *GWEN_Directory_HandlePathElement(const char *entry, void *data, unsigned int flags);
70
71
72
73/* ------------------------------------------------------------------------------------------------
74 * implementations
75 * ------------------------------------------------------------------------------------------------
76 */
77
78
79
80void *GWEN_Directory_HandlePathElement(const char *entry,
81 void *data,
82 unsigned int flags)
83{
84 char *p;
85 struct stat st;
86 int exists;
87 int withDrive;
88 GWEN_BUFFER *buf;
89 GWEN_BUFFER *ebuf = 0;
90
91 withDrive=0;
92
93#ifdef OS_WIN32
94 if (entry && isalpha(*entry)) {
95 int len;
96
97 /* append backslash if entry only consists of a drive specification */
98 len=strlen(entry);
99 if ((len==2) && (entry[1] == ':')) {
100 ebuf=GWEN_Buffer_new(0, len+2, 0, 1);
101 GWEN_Buffer_AppendString(ebuf, entry);
102 GWEN_Buffer_AppendByte(ebuf, '\\');
103 withDrive=1;
104 entry=GWEN_Buffer_GetStart(ebuf);
105 }
106 }
107#endif /* OS_WIN32 */
108
109 if (strcasecmp(entry, "..")==0) {
110 DBG_ERROR(GWEN_LOGDOMAIN, "\"..\" detected");
111 GWEN_Buffer_free(ebuf);
112 return 0;
113 }
114
115 buf=(GWEN_BUFFER *)data;
116 if (GWEN_Buffer_GetUsedBytes(buf) && !withDrive) {
117 char c;
118
120#ifdef OS_WIN32
121 if (c!='\\')
122 GWEN_Buffer_AppendByte(buf, '\\');
123#else
124 if (c!='/')
125 GWEN_Buffer_AppendByte(buf, '/');
126#endif /* OS_WIN32 */
127 }
128 GWEN_Buffer_AppendString(buf, entry);
129
130 /* check for existence of the file/folder */
132 DBG_VERBOUS(GWEN_LOGDOMAIN, "Checking path \"%s\"", p);
133 if (stat(p, &st)) {
134 exists=0;
135 DBG_DEBUG(GWEN_LOGDOMAIN, "stat: %s (%s)", strerror(errno), p);
136 if ((flags & GWEN_PATH_FLAGS_PATHMUSTEXIST) ||
137 ((flags & GWEN_PATH_FLAGS_LAST) &&
139 DBG_INFO(GWEN_LOGDOMAIN, "Path \"%s\" does not exist (it should)", p);
140 GWEN_Buffer_free(ebuf);
141 return 0;
142 }
143 }
144 else {
145 DBG_VERBOUS(GWEN_LOGDOMAIN, "Checking for type");
146 exists=1;
147 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
148 if (!S_ISREG(st.st_mode)) {
149 DBG_INFO(GWEN_LOGDOMAIN, "%s not a regular file", p);
150 GWEN_Buffer_free(ebuf);
151 return 0;
152 }
153 }
154 else {
155 if (!S_ISDIR(st.st_mode)) {
156 DBG_INFO(GWEN_LOGDOMAIN, "%s not a directory", p);
157 GWEN_Buffer_free(ebuf);
158 return 0;
159 }
160 }
161 if ((flags & GWEN_PATH_FLAGS_PATHMUSTNOTEXIST) ||
162 ((flags & GWEN_PATH_FLAGS_LAST) &&
164 DBG_INFO(GWEN_LOGDOMAIN, "Path \"%s\" exists (it should not)", p);
165 GWEN_Buffer_free(ebuf);
166 return 0;
167 }
168 } /* if stat is ok */
169
170 if (!exists) {
171 int isPublic;
172
173 DBG_DEBUG(GWEN_LOGDOMAIN, "Entry \"%s\" does not exist", p);
174
175 isPublic=(
176 ((flags & GWEN_PATH_FLAGS_LAST) &&
177 (flags & GWEN_DIR_FLAGS_PUBLIC_NAME)) ||
178 (!(flags & GWEN_PATH_FLAGS_LAST) &&
180 );
181
182 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
183 /* create file */
184 int fd;
185
186 DBG_DEBUG(GWEN_LOGDOMAIN, "Creating file \"%s\"", p);
187 if (isPublic)
188 fd=open(p, O_RDWR | O_CREAT | O_TRUNC,
189 S_IRUSR | S_IWUSR
190#ifdef S_IRGRP
191 | S_IRGRP
192#endif
193#ifdef S_IROTH
194 | S_IROTH
195#endif
196 );
197 else
198 fd=open(p, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
199 if (fd==-1) {
200 DBG_ERROR(GWEN_LOGDOMAIN, "open: %s (%s)", strerror(errno), p);
201 GWEN_Buffer_free(ebuf);
202 return 0;
203 }
204 close(fd);
205 DBG_VERBOUS(GWEN_LOGDOMAIN, "Successfully created");
206 }
207 else {
208 /* create dir */
209 DBG_VERBOUS(GWEN_LOGDOMAIN, "Creating folder \"%s\"", p);
210
211 if (isPublic) {
213 DBG_ERROR(GWEN_LOGDOMAIN, "Could not create directory \"%s\"", p);
214 GWEN_Buffer_free(ebuf);
215 return 0;
216 }
217 }
218 else {
219 if (GWEN_Directory_Create(p)) {
220 DBG_ERROR(GWEN_LOGDOMAIN, "Could not create directory \"%s\"", p);
221 GWEN_Buffer_free(ebuf);
222 return 0;
223 }
224 }
225 }
226 } /* if exists */
227 else {
228 DBG_VERBOUS(GWEN_LOGDOMAIN, "Entry \"%s\" exists", p);
229 }
230 DBG_VERBOUS(GWEN_LOGDOMAIN, "Returning this: %s", p);
231 GWEN_Buffer_free(ebuf);
232 return buf;
233}
234
235
236
237int GWEN_Directory_GetPath(const char *path,
238 unsigned int flags)
239{
240 GWEN_BUFFER *buf;
241 void *p;
242
243 assert(path);
244 buf=GWEN_Buffer_new(0, strlen(path)+10, 0, 1);
245 p=GWEN_Path_Handle(path, buf,
248 if (!p) {
249 DBG_INFO(GWEN_LOGDOMAIN, "Path so far: \"%s\"", GWEN_Buffer_GetStart(buf));
250 GWEN_Buffer_free(buf);
251 return -1;
252 }
253 GWEN_Buffer_free(buf);
254 return 0;
255}
256
257
258
259int GWEN_Directory_OsifyPath(const char *path, GWEN_BUFFER *pbuf,
260#ifndef OS_WIN32
262#endif
263 int transformDriveElement)
264{
265 const char *p;
266
267 p=path;
268
269 /* handle drive letters (only check for normal slashes here) */
270#ifdef OS_WIN32
271 if (transformDriveElement) {
272 if (*p=='/')
273 if (isalpha(p[1]))
274 if (p[2]=='/' || p[2]==0) {
275 GWEN_Buffer_AppendByte(pbuf, p[0]);
276 GWEN_Buffer_AppendByte(pbuf, ':');
277 p+=2;
278 }
279 }
280#endif
281
282 while (*p) {
283 if (*p=='/' || *p=='\\') {
284 while (*p=='/' || *p=='\\')
285 p++;
286#ifdef OS_WIN32
287 GWEN_Buffer_AppendByte(pbuf, '\\');
288#else
289 GWEN_Buffer_AppendByte(pbuf, '/');
290#endif
291 }
292 else {
293 GWEN_Buffer_AppendByte(pbuf, *p);
294 p++;
295 }
296 }
297
298 return 0;
299}
300
301
302
304 const char *filePath,
305 GWEN_BUFFER *fbuf)
306{
308
310 while (se) {
311 GWEN_BUFFER *tbuf;
312 FILE *f;
313
314 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
317 GWEN_Buffer_AppendString(tbuf, filePath);
318 DBG_VERBOUS(GWEN_LOGDOMAIN, "Trying \"%s\"",
320 f=fopen(GWEN_Buffer_GetStart(tbuf), "r");
321 if (f) {
322 fclose(f);
324 "File \"%s\" found in folder \"%s\"",
325 filePath,
327 GWEN_Buffer_AppendBuffer(fbuf, tbuf);
328 GWEN_Buffer_free(tbuf);
329 return 0;
330 }
331 GWEN_Buffer_free(tbuf);
332
334 }
335
336 DBG_INFO(GWEN_LOGDOMAIN, "File \"%s\" not found", filePath);
338}
339
340
341
343 const char *filePath,
344 GWEN_BUFFER *fbuf)
345{
347
349 while (se) {
350 GWEN_BUFFER *tbuf;
351 FILE *f;
352
353 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
356 GWEN_Buffer_AppendString(tbuf, filePath);
357 DBG_VERBOUS(GWEN_LOGDOMAIN, "Trying \"%s\"",
359 f=fopen(GWEN_Buffer_GetStart(tbuf), "r");
360 if (f) {
361 fclose(f);
363 "File \"%s\" found in folder \"%s\"",
364 filePath,
367 GWEN_Buffer_free(tbuf);
368 return 0;
369 }
370 GWEN_Buffer_free(tbuf);
371
373 }
374
375 DBG_INFO(GWEN_LOGDOMAIN, "File \"%s\" not found", filePath);
377}
378
379
380
381int GWEN_Directory_GetTmpDirectory(char *buffer, unsigned int size)
382{
383 const char *tmp_dir;
384 assert(buffer);
385
386 /* Copied from http://svn.gnome.org/viewcvs/glib/trunk/glib/gutils.c */
387 tmp_dir = getenv("TMPDIR");
388 if (!tmp_dir)
389 tmp_dir = getenv("TMP");
390 if (!tmp_dir)
391 tmp_dir = getenv("TEMP");
392
393 if (!tmp_dir) {
394#ifdef OS_WIN32
395 tmp_dir = "C:\\";
396#else
397 tmp_dir = "/tmp";
398#endif /* !OS_WIN32 */
399 }
400
401 strncpy(buffer, tmp_dir, size);
402 return 0;
403}
404
405
406
407int GWEN_Directory_GetAllEntries(const char *folder,
408 GWEN_STRINGLIST *sl,
409 const char *mask)
410{
412 int rv;
413 char buffer[256];
414
416 rv=GWEN_Directory_Open(d, folder);
417 if (rv<0) {
418 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
420 return rv;
421 }
422
423 while (0==GWEN_Directory_Read(d, buffer, sizeof(buffer))) {
424 if (strcmp(buffer, ".")!=0 &&
425 strcmp(buffer, "..")!=0 &&
426 (mask==NULL ||
427 GWEN_Text_ComparePattern(buffer+1, mask, 0)!=-1))
428 GWEN_StringList_AppendString(sl, buffer, 0, 1);
429 }
430
433 return 0;
434}
435
436
437
439 GWEN_STRINGLIST *sl,
440 const char *mask)
441{
443 int rv;
444 char buffer[256];
445 GWEN_BUFFER *pbuf;
446 uint32_t pos;
447
449 rv=GWEN_Directory_Open(d, folder);
450 if (rv<0) {
451 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
453 return rv;
454 }
455
456 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
457 GWEN_Buffer_AppendString(pbuf, folder);
459 pos=GWEN_Buffer_GetPos(pbuf);
460
461 while (0==GWEN_Directory_Read(d, buffer+1, sizeof(buffer)-2)) {
462 if (strcmp(buffer, ".")!=0 &&
463 strcmp(buffer, "..")!=0 &&
464 (mask==NULL ||
465 GWEN_Text_ComparePattern(buffer+1, mask, 0)!=-1)) {
466 struct stat st;
467
468 GWEN_Buffer_AppendString(pbuf, buffer+1);
469 if (stat(GWEN_Buffer_GetStart(pbuf), &st)==0) {
470 if (S_ISREG(st.st_mode))
471 buffer[0]='f';
472 else if (S_ISDIR(st.st_mode))
473 buffer[0]='d';
474 else
475 buffer[0]='?';
476 GWEN_StringList_AppendString(sl, buffer, 0, 1);
477 }
478 GWEN_Buffer_Crop(pbuf, 0, pos);
479 }
480 }
481
484 return 0;
485}
486
487
488
489
491 const char *mask)
492{
494 int rv;
495 char buffer[256];
496 GWEN_BUFFER *pbuf;
497 uint32_t pos;
498
500 rv=GWEN_Directory_Open(d, folder);
501 if (rv<0) {
502 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
504 return rv;
505 }
506
507 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
508 GWEN_Buffer_AppendString(pbuf, folder);
510 pos=GWEN_Buffer_GetPos(pbuf);
511
512 while (0==GWEN_Directory_Read(d, buffer, sizeof(buffer))) {
513 if (strcmp(buffer, ".")!=0 &&
514 strcmp(buffer, "..")!=0 &&
515 (mask==NULL ||
516 GWEN_Text_ComparePattern(buffer+1, mask, 0)!=-1)) {
517 struct stat st;
518
519 GWEN_Buffer_AppendString(pbuf, buffer);
520 if (stat(GWEN_Buffer_GetStart(pbuf), &st)==0) {
521 if (S_ISREG(st.st_mode))
522 GWEN_StringList_AppendString(sl, buffer, 0, 1);
523 }
524 GWEN_Buffer_Crop(pbuf, 0, pos);
525 }
526 }
527
528 GWEN_Buffer_free(pbuf);
531 return 0;
532}
533
534
535
537 const char *mask)
538{
540 int rv;
541 char buffer[256];
542 GWEN_BUFFER *pbuf;
543 uint32_t pos;
544
546 rv=GWEN_Directory_Open(d, folder);
547 if (rv<0) {
548 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
550 return rv;
551 }
552
553 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
554 GWEN_Buffer_AppendString(pbuf, folder);
556 pos=GWEN_Buffer_GetPos(pbuf);
557
558 while (0==GWEN_Directory_Read(d, buffer, sizeof(buffer))) {
559 if (strcmp(buffer, ".")!=0 &&
560 strcmp(buffer, "..")!=0 &&
561 (mask==NULL ||
562 GWEN_Text_ComparePattern(buffer+1, mask, 0)!=-1)) {
563 struct stat st;
564
565 GWEN_Buffer_AppendString(pbuf, buffer);
566 if (stat(GWEN_Buffer_GetStart(pbuf), &st)==0) {
567 if (S_ISDIR(st.st_mode))
568 GWEN_StringList_AppendString(sl, buffer, 0, 1);
569 }
570 GWEN_Buffer_Crop(pbuf, 0, pos);
571 }
572 }
573
576 return 0;
577}
578
579
580
582 GWEN_STRINGLIST *sl,
583 const char *mask)
584{
586 int rv;
587 char buffer[256];
588 GWEN_BUFFER *pbuf;
589 uint32_t pos;
590 GWEN_STRINGLIST *folderList;
591
592 folderList=GWEN_StringList_new();
593
595 rv=GWEN_Directory_Open(d, folder);
596 if (rv<0) {
597 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
599 GWEN_StringList_free(folderList);
600 return rv;
601 }
602
603 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
604 GWEN_Buffer_AppendString(pbuf, folder);
606 pos=GWEN_Buffer_GetPos(pbuf);
607
608 while (0==GWEN_Directory_Read(d, buffer, sizeof(buffer)-2)) {
609 if (strcmp(buffer, ".")!=0 &&
610 strcmp(buffer, "..")!=0) {
611 struct stat st;
612
613 GWEN_Buffer_AppendString(pbuf, buffer);
614 if (stat(GWEN_Buffer_GetStart(pbuf), &st)==0) {
615 if (S_ISDIR(st.st_mode))
616 /* add folders to the folder list */
617 GWEN_StringList_AppendString(folderList, GWEN_Buffer_GetStart(pbuf), 0, 0);
618 else {
619 if (mask==NULL || GWEN_Text_ComparePattern(buffer, mask, 0)!=-1)
620 /* don't check for duplicates here (i.e. last param =0) */
622 }
623 }
624 GWEN_Buffer_Crop(pbuf, 0, pos);
625 }
626 }
627
630
631 if (GWEN_StringList_Count(folderList)) {
633
634 se=GWEN_StringList_FirstEntry(folderList);
635 while (se) {
636 const char *s;
637
639 if (s && *s)
642 }
643 }
644 GWEN_StringList_free(folderList);
645 GWEN_Buffer_free(pbuf);
646
647 return 0;
648}
649
650
651
653{
654 char savedPwd[300];
655 char dataPwd[300];
656
657 /* get current working dir */
658 if (getcwd(savedPwd, sizeof(savedPwd)-1)==NULL) {
659 DBG_ERROR(GWEN_LOGDOMAIN, "getcwd(): %s", strerror(errno));
660 return GWEN_ERROR_IO;
661 }
662
663 if (chdir(folder)) {
664 DBG_ERROR(GWEN_LOGDOMAIN, "chdir(%s): %s", folder, strerror(errno));
665 return GWEN_ERROR_IO;
666 }
667
668 /* get new current working dir */
669 if (getcwd(dataPwd, sizeof(dataPwd)-1)==NULL) {
670 DBG_ERROR(GWEN_LOGDOMAIN, "getcwd(): %s", strerror(errno));
671 return GWEN_ERROR_IO;
672 }
673 dataPwd[sizeof(dataPwd)-1]=0;
674
675 /* change back to previous pwd */
676 if (chdir(savedPwd)) {
677 DBG_ERROR(GWEN_LOGDOMAIN, "chdir(%s): %s", folder, strerror(errno));
678 return GWEN_ERROR_IO;
679 }
680
681 GWEN_Buffer_AppendString(tbuf, dataPwd);
682 return 0;
683}
684
685
686
687
688
689
#define NULL
Definition binreloc.c:300
#define DIRSEP
Definition binreloc.c:41
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition buffer.c:253
int GWEN_Buffer_AppendBuffer(GWEN_BUFFER *bf, GWEN_BUFFER *sf)
Definition buffer.c:506
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
Definition buffer.c:950
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
#define DBG_VERBOUS(dbg_logger, format,...)
Definition debug.h:224
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define DBG_DEBUG(dbg_logger, format,...)
Definition debug.h:214
GWENHYWFAR_API int GWEN_Directory_CreatePublic(const char *path)
#define GWEN_DIR_FLAGS_PUBLIC_NAME
Definition directory.h:61
GWENHYWFAR_API int GWEN_Directory_Read(GWEN_DIRECTORY *d, char *buffer, unsigned int len)
struct GWEN_DIRECTORY GWEN_DIRECTORY
Definition directory.h:41
GWENHYWFAR_API int GWEN_Directory_Open(GWEN_DIRECTORY *d, const char *n)
GWENHYWFAR_API GWEN_DIRECTORY * GWEN_Directory_new(void)
GWENHYWFAR_API void GWEN_Directory_free(GWEN_DIRECTORY *d)
GWENHYWFAR_API int GWEN_Directory_Close(GWEN_DIRECTORY *d)
GWENHYWFAR_API int GWEN_Directory_Create(const char *path)
#define GWEN_DIR_FLAGS_PUBLIC_PATH
Definition directory.h:60
int GWEN_Directory_GetMatchingFilesRecursively(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
static void * GWEN_Directory_HandlePathElement(const char *entry, void *data, unsigned int flags)
int GWEN_Directory_FindPathForFile(const GWEN_STRINGLIST *paths, const char *filePath, GWEN_BUFFER *fbuf)
int GWEN_Directory_GetTmpDirectory(char *buffer, unsigned int size)
int GWEN_Directory_GetFileEntriesWithType(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
int GWEN_Directory_FindFileInPaths(const GWEN_STRINGLIST *paths, const char *filePath, GWEN_BUFFER *fbuf)
int GWEN_Directory_GetDirEntries(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
int GWEN_Directory_GetAllEntries(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
int GWEN_Directory_GetFileEntries(const char *folder, GWEN_STRINGLIST *sl, const char *mask)
int GWEN_Directory_OsifyPath(const char *path, GWEN_BUFFER *pbuf, GWEN_UNUSED int transformDriveElement)
int GWEN_Directory_GetAbsoluteFolderPath(const char *folder, GWEN_BUFFER *tbuf)
int GWEN_Directory_GetPath(const char *path, unsigned int flags)
#define GWEN_ERROR_IO
Definition error.h:123
#define GWEN_ERROR_NOT_FOUND
Definition error.h:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
#define GWEN_UNUSED
#define GWEN_DIR_SEPARATOR_S
#define GWEN_LOGDOMAIN
Definition logger.h:32
void * GWEN_Path_Handle(const char *path, void *data, uint32_t flags, GWEN_PATHHANDLERPTR elementFunction)
Definition path.c:60
#define GWEN_PATH_FLAGS_CHECKROOT
Definition path.h:142
#define GWEN_PATH_FLAGS_PATHMUSTEXIST
Definition path.h:66
#define GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST
Definition path.h:89
#define GWEN_PATH_FLAGS_LAST
Definition path.h:166
#define GWEN_PATH_FLAGS_PATHMUSTNOTEXIST
Definition path.h:70
#define GWEN_PATH_FLAGS_VARIABLE
Definition path.h:111
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
Definition path.h:84
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition stringlist.c:62
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:406
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:398
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition stringlist.c:427
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition stringlist.c:245
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition stringlist.c:390
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition stringlist.c:50
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition stringlist.h:53
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition stringlist.h:56
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition text.c:1208