Add find condition to logically combine two find conditions.
This commit is contained in:
parent
d2a92bd0f6
commit
085f6b64a3
@ -16,9 +16,11 @@ print_dir(IsoDir *dir)
|
||||
{
|
||||
IsoDirIter *iter;
|
||||
IsoNode *node;
|
||||
IsoFindCondition *cond;
|
||||
IsoFindCondition *cond, *c1, *c2;
|
||||
|
||||
cond = iso_new_find_conditions_name("*a*");
|
||||
c1 = iso_new_find_conditions_name("*a*");
|
||||
c2 = iso_new_find_conditions_mode(S_IFREG);
|
||||
cond = iso_new_find_conditions_and(c1, c2);
|
||||
iso_dir_find_children(dir, cond, &iter);
|
||||
while (iso_dir_iter_next(iter, &node) == 1) {
|
||||
printf(" %s\n", iso_node_get_name(node));
|
||||
|
138
libisofs/find.c
138
libisofs/find.c
@ -477,3 +477,141 @@ IsoFindCondition *iso_new_find_conditions_ctime(time_t time,
|
||||
return cond;
|
||||
}
|
||||
|
||||
/*************** logical operations on conditions *****************/
|
||||
|
||||
struct logical_binary_conditions {
|
||||
IsoFindCondition *a;
|
||||
IsoFindCondition *b;
|
||||
};
|
||||
|
||||
static
|
||||
void cond_logical_binary_free(IsoFindCondition *cond)
|
||||
{
|
||||
struct logical_binary_conditions *data;
|
||||
data = cond->data;
|
||||
data->a->free(data->a);
|
||||
free(data->a);
|
||||
data->b->free(data->b);
|
||||
free(data->b);
|
||||
free(cond->data);
|
||||
}
|
||||
|
||||
static
|
||||
int cond_logical_and_matches(IsoFindCondition *cond, IsoNode *node)
|
||||
{
|
||||
struct logical_binary_conditions *data = cond->data;
|
||||
return data->a->matches(data->a, node) && data->b->matches(data->b, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new condition that check if the two given conditions are
|
||||
* valid.
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* IsoFindCondition to compare
|
||||
* @result
|
||||
* The created IsoFindCondition, NULL on error.
|
||||
*
|
||||
* @since 0.6.4
|
||||
*/
|
||||
IsoFindCondition *iso_new_find_conditions_and(IsoFindCondition *a,
|
||||
IsoFindCondition *b)
|
||||
{
|
||||
IsoFindCondition *cond;
|
||||
struct logical_binary_conditions *data;
|
||||
cond = malloc(sizeof(IsoFindCondition));
|
||||
if (cond == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
data = malloc(sizeof(struct logical_binary_conditions));
|
||||
if (data == NULL) {
|
||||
free(cond);
|
||||
return NULL;
|
||||
}
|
||||
data->a = a;
|
||||
data->b = b;
|
||||
cond->data = data;
|
||||
cond->free = cond_logical_binary_free;
|
||||
cond->matches = cond_logical_and_matches;
|
||||
return cond;
|
||||
}
|
||||
|
||||
static
|
||||
int cond_logical_or_matches(IsoFindCondition *cond, IsoNode *node)
|
||||
{
|
||||
struct logical_binary_conditions *data = cond->data;
|
||||
return data->a->matches(data->a, node) || data->b->matches(data->b, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new condition that check if at least one the two given conditions
|
||||
* is valid.
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* IsoFindCondition to compare
|
||||
* @result
|
||||
* The created IsoFindCondition, NULL on error.
|
||||
*
|
||||
* @since 0.6.4
|
||||
*/
|
||||
IsoFindCondition *iso_new_find_conditions_or(IsoFindCondition *a,
|
||||
IsoFindCondition *b)
|
||||
{
|
||||
IsoFindCondition *cond;
|
||||
struct logical_binary_conditions *data;
|
||||
cond = malloc(sizeof(IsoFindCondition));
|
||||
if (cond == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
data = malloc(sizeof(struct logical_binary_conditions));
|
||||
if (data == NULL) {
|
||||
free(cond);
|
||||
return NULL;
|
||||
}
|
||||
data->a = a;
|
||||
data->b = b;
|
||||
cond->data = data;
|
||||
cond->free = cond_logical_binary_free;
|
||||
cond->matches = cond_logical_or_matches;
|
||||
return cond;
|
||||
}
|
||||
|
||||
static
|
||||
void cond_not_free(IsoFindCondition *cond)
|
||||
{
|
||||
IsoFindCondition *negate = cond->data;
|
||||
negate->free(negate);
|
||||
free(negate);
|
||||
}
|
||||
|
||||
static
|
||||
int cond_not_matches(IsoFindCondition *cond, IsoNode *node)
|
||||
{
|
||||
IsoFindCondition *negate = cond->data;
|
||||
return !(negate->matches(negate, node));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new condition that check if the given conditions is false.
|
||||
*
|
||||
* @param negate
|
||||
* @result
|
||||
* The created IsoFindCondition, NULL on error.
|
||||
*
|
||||
* @since 0.6.4
|
||||
*/
|
||||
IsoFindCondition *iso_new_find_conditions_not(IsoFindCondition *negate)
|
||||
{
|
||||
IsoFindCondition *cond;
|
||||
cond = malloc(sizeof(IsoFindCondition));
|
||||
if (cond == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
cond->data = negate;
|
||||
cond->free = cond_not_free;
|
||||
cond->matches = cond_not_matches;
|
||||
return cond;
|
||||
}
|
||||
|
||||
|
@ -2289,6 +2289,47 @@ IsoFindCondition *iso_new_find_conditions_mtime(time_t time,
|
||||
IsoFindCondition *iso_new_find_conditions_ctime(time_t time,
|
||||
enum iso_find_comparisons comparison);
|
||||
|
||||
/**
|
||||
* Create a new condition that check if the two given conditions are
|
||||
* valid.
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* IsoFindCondition to compare
|
||||
* @result
|
||||
* The created IsoFindCondition, NULL on error.
|
||||
*
|
||||
* @since 0.6.4
|
||||
*/
|
||||
IsoFindCondition *iso_new_find_conditions_and(IsoFindCondition *a,
|
||||
IsoFindCondition *b);
|
||||
|
||||
/**
|
||||
* Create a new condition that check if at least one the two given conditions
|
||||
* is valid.
|
||||
*
|
||||
* @param a
|
||||
* @param b
|
||||
* IsoFindCondition to compare
|
||||
* @result
|
||||
* The created IsoFindCondition, NULL on error.
|
||||
*
|
||||
* @since 0.6.4
|
||||
*/
|
||||
IsoFindCondition *iso_new_find_conditions_or(IsoFindCondition *a,
|
||||
IsoFindCondition *b);
|
||||
|
||||
/**
|
||||
* Create a new condition that check if the given conditions is false.
|
||||
*
|
||||
* @param negate
|
||||
* @result
|
||||
* The created IsoFindCondition, NULL on error.
|
||||
*
|
||||
* @since 0.6.4
|
||||
*/
|
||||
IsoFindCondition *iso_new_find_conditions_not(IsoFindCondition *negate);
|
||||
|
||||
/**
|
||||
* Find all directory children that match the given condition.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user