summaryrefslogtreecommitdiff
path: root/src/analysis/scan/space.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/space.c')
-rw-r--r--src/analysis/scan/space.c143
1 files changed, 113 insertions, 30 deletions
diff --git a/src/analysis/scan/space.c b/src/analysis/scan/space.c
index 34b67fe..dc9a237 100644
--- a/src/analysis/scan/space.c
+++ b/src/analysis/scan/space.c
@@ -52,11 +52,14 @@ static void g_scan_namespace_finalize(GScanNamespace *);
/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */
-/* Lance une résolution d'élément à appeler. */
-GRegisteredItem *g_scan_namespace_resolve(GScanNamespace *, const char *, GScanContext *, GScanExpression **, size_t, bool, bool);
+/* Indique le nom associé à une expression d'évaluation. */
+static char *g_scan_namespace_get_name(const GScanNamespace *);
+
+/* Lance une résolution d'élément à solliciter. */
+static bool g_scan_namespace_resolve(GScanNamespace *, const char *, GScanContext *, GScanScope *, GRegisteredItem **);
/* Réduit une expression à une forme plus simple. */
-GScanExpression *g_scan_namespace_reduce(GScanNamespace *, GScanContext *, GScanExpression **, size_t, bool);
+static GScanExpression *g_scan_namespace_reduce(GScanNamespace *, GScanContext *, GScanExpression **, size_t, bool);
@@ -93,6 +96,7 @@ static void g_scan_namespace_class_init(GScanNamespaceClass *klass)
registered = G_REGISTERED_ITEM_CLASS(klass);
+ registered->get_name = (get_registered_item_name_fc)g_scan_namespace_get_name;
registered->resolve = (resolve_registered_item_fc)g_scan_namespace_resolve;
registered->reduce = (reduce_registered_item_fc)g_scan_namespace_reduce;
@@ -113,6 +117,8 @@ static void g_scan_namespace_class_init(GScanNamespaceClass *klass)
static void g_scan_namespace_init(GScanNamespace *space)
{
+ space->name = NULL;
+
space->children = NULL;
space->names = NULL;
space->count = 0;
@@ -160,6 +166,9 @@ static void g_scan_namespace_finalize(GScanNamespace *space)
{
size_t i; /* Boucle de parcours */
+ if (space->name != NULL)
+ free(space->name);
+
if (space->children != NULL)
free(space->children);
@@ -176,7 +185,7 @@ static void g_scan_namespace_finalize(GScanNamespace *space)
/******************************************************************************
* *
-* Paramètres : - *
+* Paramètres : name = désignation du futur espace de noms. *
* *
* Description : Construit un nouvel espace de noms pour scan. *
* *
@@ -186,12 +195,42 @@ static void g_scan_namespace_finalize(GScanNamespace *space)
* *
******************************************************************************/
-GScanNamespace *g_scan_namespace_new(void)
+GScanNamespace *g_scan_namespace_new(const char *name)
{
GScanNamespace *result; /* Instance à retourner */
result = g_object_new(G_TYPE_SCAN_NAMESPACE, NULL);
+ if (!g_scan_namespace_create(result, name))
+ g_clear_object(&result);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : space = instance d'espace de noms à initialiser. *
+* name = désignation du futur espace de noms. *
+* *
+* Description : Met en place un nouvel espace de noms pour scan. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_scan_namespace_create(GScanNamespace *space, const char *name)
+{
+ bool result; /* Bilan à retourner */
+
+ result = true;
+
+ if (name != NULL)
+ space->name = strdup(name);
+
return result;
}
@@ -200,8 +239,7 @@ GScanNamespace *g_scan_namespace_new(void)
/******************************************************************************
* *
* Paramètres : space = espace de noms à compléter. *
-* type = type d'élément à intégrer. *
-* name = nom du futur espace ou NULL pour une racine. *
+* child = élément d'évaluation à intégrer. *
* *
* Description : Intègre un nouvel élément dans l'esapce de noms. *
* *
@@ -211,19 +249,39 @@ GScanNamespace *g_scan_namespace_new(void)
* *
******************************************************************************/
-bool g_scan_namespace_register(GScanNamespace *space, GRegisteredItem *child, const char *name)
+bool g_scan_namespace_register_item(GScanNamespace *space, GRegisteredItem *child)
{
bool result; /* Bilan à retourner */
+ char *name; /* Nom de l'élément à ajouter */
+ size_t i; /* Boucle de parcours */
- result = true;
+ name = g_registered_item_get_name(child);
+
+ /* Validation de l'unicité du nom */
+
+ for (i = 0; i < space->count; i++)
+ if (strcmp(name, space->names[i]) == 0)
+ break;
- space->count++;
+ result = (i == space->count);
- space->children = realloc(space->children, space->count * sizeof(GRegisteredItem *));
- space->children[space->count - 1] = child;
+ /* Inscription de l'élément ? */
- space->names = realloc(space->names, space->count * sizeof(char *));
- space->names[space->count - 1] = strdup(name);
+ if (!result)
+ free(name);
+
+ else
+ {
+ space->count++;
+
+ space->children = realloc(space->children, space->count * sizeof(GRegisteredItem *));
+ space->children[space->count - 1] = child;
+ g_object_ref(G_OBJECT(child));
+
+ space->names = realloc(space->names, space->count * sizeof(char *));
+ space->names[space->count - 1] = strdup(name);
+
+ }
return result;
@@ -238,34 +296,59 @@ bool g_scan_namespace_register(GScanNamespace *space, GRegisteredItem *child, co
/******************************************************************************
* *
-* Paramètres : space = élément d'appel à consulter. *
+* Paramètres : space = élément d'appel à consulter. *
+* *
+* Description : Indique le nom associé à une expression d'évaluation. *
+* *
+* Retour : Désignation humaine de l'expression d'évaluation. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *g_scan_namespace_get_name(const GScanNamespace *space)
+{
+ char *result; /* Désignation à retourner */
+
+ if (space->name != NULL)
+ result = strdup(space->name);
+
+ else
+ result = NULL;
+
+ 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_scan_namespace_resolve(GScanNamespace *space, const char *target, GScanContext *ctx, GScanExpression **args, size_t count, bool last, bool final)
+static bool g_scan_namespace_resolve(GScanNamespace *item, const char *target, GScanContext *ctx, GScanScope *scope, GRegisteredItem **out)
{
- GRegisteredItem *result; /* Instance à renvoyer */
+ bool result; /* Bilan à retourner */
size_t i; /* Boucle de parcours */
- result = NULL;
+ result = true;
- for (i = 0; i < space->count; i++)
- if (strcmp(target, space->names[i]) == 0)
+ for (i = 0; i < item->count; i++)
+ if (strcmp(target, item->names[i]) == 0)
{
- result = space->children[i];
- g_object_ref(G_OBJECT(result));
+ *out = item->children[i];
+ g_object_ref(G_OBJECT(*out));
break;
}
@@ -290,11 +373,11 @@ GRegisteredItem *g_scan_namespace_resolve(GScanNamespace *space, const char *tar
* *
******************************************************************************/
-GScanExpression *g_scan_namespace_reduce(GScanNamespace *space, GScanContext *ctx, GScanExpression **args, size_t count, bool final)
+static GScanExpression *g_scan_namespace_reduce(GScanNamespace *space, GScanContext *ctx, GScanExpression **args, size_t count, bool final)
{
GScanExpression *result; /* Instance à renvoyer */
- assert(false);
+ assert(false); /* REMME */
result = NULL;