aboutsummaryrefslogtreecommitdiff
path: root/project/dclib
diff options
context:
space:
mode:
authorWiimm <wiimm@wiimm.de>2023-07-22 22:40:04 +0200
committerWiimm <wiimm@wiimm.de>2023-07-22 22:40:04 +0200
commit7a4ee26983b941ce0a8f72bcc02bf5566e9a7886 (patch)
tree202755942a4d5b67bedcd9f3c21eb2ababf8dd79 /project/dclib
parentb5b1fe7fc0cf460d6204c18ba7bb4c40f7597efa (diff)
SZS v2.36a
Diffstat (limited to 'project/dclib')
-rw-r--r--project/dclib/dclib-basics.h32
-rw-r--r--project/dclib/dclib-file.c90
-rw-r--r--project/dclib/dclib-file.h3
3 files changed, 104 insertions, 21 deletions
diff --git a/project/dclib/dclib-basics.h b/project/dclib/dclib-basics.h
index c03708a..ce835f5 100644
--- a/project/dclib/dclib-basics.h
+++ b/project/dclib/dclib-basics.h
@@ -660,6 +660,29 @@ extern const endian_func_t le_func;
const endian_func_t * GetEndianFunc ( const void * byte_order_mark );
uint GetTextBOMLen ( const void * data, uint data_size );
+///////////////////////////////////////////////////////////////////////////////
+/////////////// misc constants ///////////////
+///////////////////////////////////////////////////////////////////////////////
+// [[wildcard_mode_t]]
+
+typedef enum wildcard_mode_t
+{
+ WM_HIDDEN = 0x01, // allow hidden files
+ WM_SWITCH = 0x02, // allow "|+" and "|-" to enable/disable WM_HIDDEN
+ // => ignored by SearchPaths(), caller must handle it
+ WM_IGNORE = 0x04, // disable wildcard parsing if file begins with '|'
+ WM_SUBFILE = 0x08, // detect '|' as sub-file separator
+
+ WM__ALL = 0x0f,
+ WM__DEFAULT = WM_SWITCH | WM_IGNORE,
+ WM__DEFAULT_SUB = WM__DEFAULT | WM_SUBFILE,
+}
+wildcard_mode_t;
+
+#define WM_CONTROL_CHAR '|'
+#define WM_ENABLE_HIDDEN "|+"
+#define WM_DISABLE_HIDDEN "|-"
+
//
///////////////////////////////////////////////////////////////////////////////
/////////////// CopyMode_t ///////////////
@@ -864,6 +887,7 @@ static mem_t RightMem8 ( const mem_t src, int count )
// Alloc dest buffer and terminate with 0.
// If m*.len < 0, then use strlen().
+// Free with FreeMem(&m) or FreeString(m.ptr)
mem_t MemCat2A ( const mem_t m1, const mem_t m2 );
mem_t MemCat3A ( const mem_t m1, const mem_t m2, const mem_t m3 );
@@ -6278,8 +6302,8 @@ void AppendStringField ( StringField_t * sf, ccp key, bool move_key );
void AppendUniqueStringField ( StringField_t * sf, ccp key, bool move_key );
// insert or append a path (path1+path2) with optional wildcards by SearchPaths()
-uint InsertStringFieldExpand ( StringField_t * sf, ccp path1, ccp path2, bool allow_hidden );
-uint AppendStringFieldExpand ( StringField_t * sf, ccp path1, ccp path2, bool allow_hidden );
+uint InsertStringFieldExpand ( StringField_t * sf, ccp path1, ccp path2, wildcard_mode_t wc_mode );
+uint AppendStringFieldExpand ( StringField_t * sf, ccp path1, ccp path2, wildcard_mode_t wc_mode );
// re-sort field using sf->func_cmp()
void SortStringField ( StringField_t * sf );
@@ -6394,9 +6418,9 @@ ParamFieldItem_t * AppendParamField
// insert or append a path (path1+path2) with optional wildcards by SearchPaths()
uint InsertParamFieldExpand
- ( ParamField_t * pf, ccp path1, ccp path2, bool allow_hidden, uint num, cvp data );
+ ( ParamField_t * pf, ccp path1, ccp path2, wildcard_mode_t wc_mode, uint num, cvp data );
uint AppendParamFieldExpand
- ( ParamField_t * pf, ccp path1, ccp path2, bool allow_hidden, uint num, cvp data );
+ ( ParamField_t * pf, ccp path1, ccp path2, wildcard_mode_t wc_mode, uint num, cvp data );
// return the index of the (next) item
uint FindParamFieldHelper ( const ParamField_t * pf, bool * found, ccp key );
diff --git a/project/dclib/dclib-file.c b/project/dclib/dclib-file.c
index ed53eb7..081fac2 100644
--- a/project/dclib/dclib-file.c
+++ b/project/dclib/dclib-file.c
@@ -3770,8 +3770,9 @@ ccp GetBlockDeviceHolder ( ccp name, ccp sep, int *ret_level )
typedef struct search_paths_t
{
+ wildcard_mode_t wc_mode; // bit field: modes for wildcard handling
mem_t source; // path to analyse, any string outside
- bool allow_hidden; // true: allow hidden dirs and files
+ mem_t append; // append string behind search result
char *path_buf; // pointer to complete path, work buffer
char *path_star; // begin of '**' for search_paths_dir()
@@ -3790,7 +3791,16 @@ search_paths_t;
static void search_paths_hit ( search_paths_t *sp, mem_t path, uint d_type )
{
DASSERT(sp);
- enumError err = sp->func(path,d_type,sp->param);
+ enumError err;
+ if ( sp->append.len )
+ {
+ mem_t temp = MemCat2A(path,sp->append);
+ err = sp->func(temp,d_type,sp->param);
+ FreeString(temp.ptr);
+ }
+ else
+ err = sp->func(path,d_type,sp->param);
+
if ( err < 0 )
{
err = -err;
@@ -3830,7 +3840,7 @@ static void search_paths_dir
break;
if ( dent->d_name[0] == '.'
- && ( !local.allow_hidden
+ && ( !(local.wc_mode&WM_HIDDEN)
|| !dent->d_name[1]
|| dent->d_name[1] == '.' && !dent->d_name[2] ))
{
@@ -3901,7 +3911,7 @@ static void search_paths_helper ( search_paths_t *sp )
mem_t pattern;
pattern.len = next - pat;
pattern.ptr = MEMDUP(pat,pattern.len);
- const bool allow_hidden = local.allow_hidden || pattern.ptr[0] == '.';
+ const bool allow_hidden = ( local.wc_mode & WM_HIDDEN ) || pattern.ptr[0] == '.';
char *path_ptr = StringCopyEM(local.path_ptr,local.path_end,local.source.ptr,pat-local.source.ptr);
local.path_ptr = path_ptr;
@@ -4052,7 +4062,7 @@ search_paths_stat_t SearchPaths
(
ccp path1, // not NULL: part #1 of base path
ccp path2, // not NULL: part #2 of base path
- bool allow_hidden, // allow hiddent directories and files
+ wildcard_mode_t wc_mode, // bit field: modes for wildcard handling
SearchPathsFunc func, // callback function, never NULL
void *param // last param for func()
)
@@ -4065,13 +4075,19 @@ search_paths_stat_t SearchPaths
char srcbuf[PATH_MAX+2];
ccp source = PathCatPP(srcbuf,sizeof(srcbuf),path1,path2);
+ if ( source != srcbuf && wc_mode & WM_SUBFILE )
+ {
+ // we need the temporary 'srcbuf' for '||' adjustemnt
+ StringCopyS(srcbuf,sizeof(srcbuf),source);
+ source = srcbuf;
+ }
char pathbuf[PATH_MAX];
search_paths_t sp =
{
.source.ptr = source,
.source.len = strlen(source),
- .allow_hidden = allow_hidden,
+ .wc_mode = wc_mode,
.path_buf = pathbuf,
.path_ptr = pathbuf,
.path_end = pathbuf + sizeof(pathbuf) - 2,
@@ -4079,9 +4095,51 @@ search_paths_stat_t SearchPaths
.param = param,
};
- search_paths_helper(&sp);
- PRINT0("abort=%d, max_err = %d, %u dirs scanned, %u func calls, %u hits\n",
+ if ( wc_mode & WM_IGNORE && source[0] == WM_CONTROL_CHAR )
+ {
+ sp.source.ptr++;
+ sp.source.len--;
+ char *end = StringCopyEM(sp.path_ptr,sp.path_end,sp.source.ptr,sp.source.len);
+ struct stat st;
+ stat(sp.path_buf,&st);
+ mem_t path = { .ptr = sp.path_buf, .len = end - sp.path_buf };
+ search_paths_hit(&sp,path,st.st_mode);
+ }
+ else
+ {
+ if ( wc_mode & WM_SUBFILE )
+ {
+ ccp ptr = sp.source.ptr;
+ ccp end = ptr + sp.source.len;
+ while ( ptr < end )
+ {
+ char *pipe = memchr(ptr,WM_CONTROL_CHAR,end-ptr);
+ if (!pipe)
+ break;
+ if ( pipe+1 < end && pipe[1] == WM_CONTROL_CHAR )
+ {
+ PRINT0(">>> \"||\" found: [%zd] %.*s\n",end-pipe,(int)(end-pipe),pipe);
+ sp.source.len--;
+ end--;
+ memmove(pipe,pipe+1,end-pipe);
+ ptr = pipe+1;
+ }
+ else
+ {
+ PRINT0(">>> \"|\" found: [%zd] %.*s\n",end-pipe,(int)(end-pipe),pipe);
+ sp.append.ptr = pipe;
+ sp.append.len = end - pipe;
+ sp.source.len = pipe - sp.source.ptr;
+ break;
+ }
+ }
+ PRINT0(">>> »%.*s«\n",sp.source.len,sp.source.ptr);
+ }
+
+ search_paths_helper(&sp);
+ PRINT0("abort=%d, max_err = %d, %u dirs scanned, %u func calls, %u hits\n",
sp.abort, sp.max_err, sp.dir_count, sp.func_count, sp.hit_count );
+ }
return sp.status;
}
@@ -4104,10 +4162,10 @@ static enumError insert_string_field
//-----------------------------------------------------------------------------
uint InsertStringFieldExpand
- ( StringField_t * sf, ccp path1, ccp path2, bool allow_hidden )
+ ( StringField_t * sf, ccp path1, ccp path2, wildcard_mode_t wc_mode )
{
DASSERT(sf);
- search_paths_stat_t stat = SearchPaths(path1,path2,allow_hidden,insert_string_field,sf);
+ search_paths_stat_t stat = SearchPaths(path1,path2,wc_mode,insert_string_field,sf);
PRINT0("%d %d %d\n",stat.dir_count,stat.func_count,stat.hit_count);
if (!stat.hit_count)
{
@@ -4137,10 +4195,10 @@ static enumError append_string_field
//-----------------------------------------------------------------------------
uint AppendStringFieldExpand
- ( StringField_t * sf, ccp path1, ccp path2, bool allow_hidden )
+ ( StringField_t * sf, ccp path1, ccp path2, wildcard_mode_t wc_mode )
{
DASSERT(sf);
- search_paths_stat_t stat = SearchPaths(path1,path2,allow_hidden,append_string_field,sf);
+ search_paths_stat_t stat = SearchPaths(path1,path2,wc_mode,append_string_field,sf);
PRINT0("%d %d %d\n",stat.dir_count,stat.func_count,stat.hit_count);
if (!stat.hit_count)
{
@@ -4181,11 +4239,11 @@ static enumError insert_param_field
//-----------------------------------------------------------------------------
uint InsertParamFieldExpand
- ( ParamField_t * pf, ccp path1, ccp path2, bool allow_hidden, uint num, cvp data )
+ ( ParamField_t * pf, ccp path1, ccp path2, wildcard_mode_t wc_mode, uint num, cvp data )
{
DASSERT(pf);
search_param_field_t spf = { .pf = pf, .num = num, .data = data };
- search_paths_stat_t stat = SearchPaths(path1,path2,allow_hidden,insert_param_field,&spf);
+ search_paths_stat_t stat = SearchPaths(path1,path2,wc_mode,insert_param_field,&spf);
PRINT0("%d %d %d\n",stat.dir_count,stat.func_count,stat.hit_count);
if (!stat.hit_count)
{
@@ -4215,11 +4273,11 @@ static enumError append_param_field
//-----------------------------------------------------------------------------
uint AppendParamFieldExpand
- ( ParamField_t * pf, ccp path1, ccp path2, bool allow_hidden, uint num, cvp data )
+ ( ParamField_t * pf, ccp path1, ccp path2, wildcard_mode_t wc_mode, uint num, cvp data )
{
DASSERT(pf);
search_param_field_t spf = { .pf = pf, .num = num, .data = data };
- search_paths_stat_t stat = SearchPaths(path1,path2,allow_hidden,append_param_field,&spf);
+ search_paths_stat_t stat = SearchPaths(path1,path2,wc_mode,append_param_field,&spf);
PRINT0("%d %d %d\n",stat.dir_count,stat.func_count,stat.hit_count);
if (!stat.hit_count)
{
diff --git a/project/dclib/dclib-file.h b/project/dclib/dclib-file.h
index bfc85e6..2e1a209 100644
--- a/project/dclib/dclib-file.h
+++ b/project/dclib/dclib-file.h
@@ -1038,6 +1038,7 @@ typedef struct search_paths_stat_t
search_paths_stat_t;
//-----------------------------------------------------------------------------
+// [[SearchPathsFunc]]
// error codes < 0 mean: abort.
// return ERR_JOB_IGNORED if path finally not match
@@ -1055,7 +1056,7 @@ search_paths_stat_t SearchPaths
(
ccp path1, // not NULL: part #1 of base path
ccp path2, // not NULL: part #2 of base path
- bool allow_hidden, // allow hiddent directories and files
+ wildcard_mode_t wc_mode, // bit field: modes for wildcard handling
SearchPathsFunc func, // callback function, never NULL
void *param // last param for func()
);