summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-10-15 23:21:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-10-15 23:21:31 (GMT)
commitecc1db5226f6cd5fee2bb52da5fc0061b43ed0e7 (patch)
tree82e739970fde9de8d95b572c801f33af702731ee /src/analysis
parent12d33579e3916baae3f350f615c8f9de98e47d41 (diff)
Allow many arguments for the count() function.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/scan/items/count.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/analysis/scan/items/count.c b/src/analysis/scan/items/count.c
index 339c490..1d01867 100644
--- a/src/analysis/scan/items/count.c
+++ b/src/analysis/scan/items/count.c
@@ -225,17 +225,24 @@ static char *g_scan_count_function_get_name(const GScanCountFunction *item)
static bool g_scan_count_function_run_call(GScanCountFunction *item, GScanExpression **args, size_t count, GScanContext *ctx, GScanScope *scope, GObject **out)
{
bool result; /* Bilan à retourner */
+ size_t sum; /* Somme des décomptes */
+ size_t i; /* Boucle de parcours */
size_t value; /* Nouveau décompte */
- if (count != 1)
- result = false;
+ result = (count > 0);
- else
+ if (result)
{
- result = g_scan_expression_count_items(args[0], ctx, &value);
+ sum = 0;
+
+ for (i = 0; i < count && result; i++)
+ {
+ result = g_scan_expression_count_items(args[i], ctx, &value);
+ sum += value;
+ }
if (result)
- *out = G_OBJECT(g_scan_literal_expression_new(LVT_UNSIGNED_INTEGER, (unsigned long long []){ value }));
+ *out = G_OBJECT(g_scan_literal_expression_new(LVT_UNSIGNED_INTEGER, (unsigned long long []){ sum }));
}