diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-07-07 06:32:43 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-07-07 06:32:43 (GMT) |
commit | 4c10dfa2a95cea6fc704d68066d0c284cfd79342 (patch) | |
tree | 5827bbc411459800747e21929daecdf99fde7dfd /src/analysis/scan/space.c | |
parent | 3f996be1e5858b54740bf92515795982a16b169a (diff) |
Rewrite core parts of the ROST API.
Diffstat (limited to 'src/analysis/scan/space.c')
-rw-r--r-- | src/analysis/scan/space.c | 143 |
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; |