diff options
Diffstat (limited to 'src/analysis/scan/item.c')
-rw-r--r-- | src/analysis/scan/item.c | 131 |
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; |