summaryrefslogtreecommitdiff
path: root/src/analysis/scan/item.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/item.c')
-rw-r--r--src/analysis/scan/item.c131
1 files changed, 112 insertions, 19 deletions
diff --git a/src/analysis/scan/item.c b/src/analysis/scan/item.c
index c0b1532..d819f59 100644
--- a/src/analysis/scan/item.c
+++ b/src/analysis/scan/item.c
@@ -24,6 +24,9 @@
#include "item.h"
+#include <assert.h>
+
+
#include "item-int.h"
@@ -136,33 +139,67 @@ static void g_registered_item_finalize(GRegisteredItem *item)
/******************************************************************************
* *
+* Paramètres : item = élément d'appel à consulter. *
+* *
+* Description : Indique le nom associé à une expression d'évaluation. *
+* *
+* Retour : Désignation humaine de l'expression d'évaluation. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *g_registered_item_get_name(const GRegisteredItem *item)
+{
+ char *result; /* Désignation à retourner */
+ GRegisteredItemClass *class; /* Classe à activer */
+
+ class = G_REGISTERED_ITEM_GET_CLASS(item);
+
+ result = class->get_name(item);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : item = élément d'appel à consulter. *
* target = désignation de l'objet d'appel à identifier. *
* ctx = contexte de suivi de l'analyse courante. *
-* args = liste d'éventuels arguments fournis. *
-* count = taille de cette liste. *
-* last = l'élément est-il le dernier d'une chaîne d'appels ? *
-* final = indique une ultime conversion dans le cycle en cours.*
+* scope = portée courante des variables locales. *
+* out = zone d'enregistrement de la résolution opérée. [OUT]*
* *
-* Description : Lance une résolution d'élément à appeler. *
+* Description : Lance une résolution d'élément à solliciter. *
* *
-* Retour : Nouvel élément d'appel identifié ou NULL. *
+* Retour : Bilan de l'opération : false en cas d'erreur irrécupérable. *
* *
* Remarques : - *
* *
******************************************************************************/
-GRegisteredItem *g_registered_item_resolve(GRegisteredItem *item, const char *target, GScanContext *ctx, GScanExpression **args, size_t count, bool last, bool final)
+bool g_registered_item_resolve(GRegisteredItem *item, const char *target, GScanContext *ctx, GScanScope *scope, GRegisteredItem **out)
{
- GRegisteredItem *result; /* Instance à renvoyer */
+ bool result; /* Bilan à retourner */
GRegisteredItemClass *class; /* Classe à activer */
+ *out = NULL;
+
class = G_REGISTERED_ITEM_GET_CLASS(item);
if (class->resolve == NULL)
- result = NULL;
+ result = false;
else
- result = class->resolve(item, target, ctx, args, count, last, final);
+ {
+ result = class->resolve(item, target, ctx, scope, out);
+
+#ifndef NDEBUG
+ if (*out != NULL)
+ assert(result);
+#endif
+
+ }
return result;
@@ -171,28 +208,84 @@ GRegisteredItem *g_registered_item_resolve(GRegisteredItem *item, const char *ta
/******************************************************************************
* *
-* Paramètres : item = élément d'appel à consulter. *
-* ctx = contexte de suivi de l'analyse courante. *
-* args = liste d'éventuels arguments fournis. *
-* count = taille de cette liste. *
-* final = indique une ultime conversion dans le cycle en cours.*
+* Paramètres : item = élément d'appel à consulter. *
+* ctx = contexte de suivi de l'analyse courante. *
+* scope = portée courante des variables locales. *
+* out = zone d'enregistrement de la réduction opérée. [OUT] *
* *
* Description : Réduit une expression à une forme plus simple. *
* *
-* Retour : Réduction correspondante, expression déjà réduite, ou NULL. *
+* Retour : Bilan de l'opération : false en cas d'erreur irrécupérable. *
* *
* Remarques : - *
* *
******************************************************************************/
-GScanExpression *g_registered_item_reduce(GRegisteredItem *item, GScanContext *ctx, GScanExpression **args, size_t count, bool final)
+bool g_registered_item_reduce(GRegisteredItem *item, GScanContext *ctx, GScanScope *scope, GScanExpression **out)
{
- GScanExpression *result; /* Instance à renvoyer */
+ bool result; /* Bilan à retourner */
GRegisteredItemClass *class; /* Classe à activer */
+ *out = NULL;
+
class = G_REGISTERED_ITEM_GET_CLASS(item);
- result = class->reduce(item, ctx, args, count, final);
+ if (class->reduce == NULL)
+ result = false;
+ else
+ {
+ result = class->reduce(item, ctx, scope, out);
+
+#ifndef NDEBUG
+ if (*out != NULL)
+ assert(result);
+#endif
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = élément d'appel à consulter. *
+* args = liste d'éventuels arguments fournis. *
+* count = taille de cette liste. *
+* ctx = contexte de suivi de l'analyse courante. *
+* scope = portée courante des variables locales. *
+* out = zone d'enregistrement de la résolution opérée. [OUT] *
+* *
+* Description : Effectue un appel à une fonction enregistrée. *
+* *
+* Retour : Bilan de l'opération : false en cas d'erreur irrécupérable. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_registered_item_run_call(GRegisteredItem *item, GScanExpression **args, size_t count, GScanContext *ctx, GScanScope *scope, GObject **out)
+{
+ bool result; /* Bilan à retourner */
+ GRegisteredItemClass *class; /* Classe à activer */
+
+ *out = NULL;
+
+ class = G_REGISTERED_ITEM_GET_CLASS(item);
+
+ if (class->run_call == NULL)
+ result = false;
+ else
+ {
+ result = class->run_call(item, args, count, ctx, scope, out);
+
+#ifndef NDEBUG
+ if (*out != NULL)
+ assert(result);
+#endif
+
+ }
return result;