summaryrefslogtreecommitdiff
path: root/src/analysis/scan/items/count.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/items/count.c')
-rw-r--r--src/analysis/scan/items/count.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/analysis/scan/items/count.c b/src/analysis/scan/items/count.c
index 9040ec4..1d01867 100644
--- a/src/analysis/scan/items/count.c
+++ b/src/analysis/scan/items/count.c
@@ -64,7 +64,7 @@ static bool g_scan_count_function_run_call(GScanCountFunction *, GScanExpression
/* Indique le type défini pour un décompte d'ensemble. */
-G_DEFINE_TYPE(GScanCountFunction, g_scan_count_function, G_TYPE_REGISTERED_ITEM);
+G_DEFINE_TYPE(GScanCountFunction, g_scan_count_function, G_TYPE_SCAN_REGISTERED_ITEM);
/******************************************************************************
@@ -82,14 +82,14 @@ G_DEFINE_TYPE(GScanCountFunction, g_scan_count_function, G_TYPE_REGISTERED_ITEM)
static void g_scan_count_function_class_init(GScanCountFunctionClass *klass)
{
GObjectClass *object; /* Autre version de la classe */
- GRegisteredItemClass *registered; /* Version de classe parente */
+ GScanRegisteredItemClass *registered; /* Version de classe parente */
object = G_OBJECT_CLASS(klass);
object->dispose = (GObjectFinalizeFunc/* ! */)g_scan_count_function_dispose;
object->finalize = (GObjectFinalizeFunc)g_scan_count_function_finalize;
- registered = G_REGISTERED_ITEM_CLASS(klass);
+ registered = G_SCAN_REGISTERED_ITEM_CLASS(klass);
registered->get_name = (get_registered_item_name_fc)g_scan_count_function_get_name;
registered->run_call = (run_registered_item_call_fc)g_scan_count_function_run_call;
@@ -165,9 +165,9 @@ static void g_scan_count_function_finalize(GScanCountFunction *func)
* *
******************************************************************************/
-GRegisteredItem *g_scan_count_function_new(void)
+GScanRegisteredItem *g_scan_count_function_new(void)
{
- GScanCountFunction *result; /* Structure à retourner */
+ GScanRegisteredItem *result; /* Structure à retourner */
result = g_object_new(G_TYPE_SCAN_COUNT_FUNCTION, NULL);
@@ -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 }));
}