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; | 
