diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-08-06 16:54:57 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-08-06 16:54:57 (GMT) |
commit | 4fcc35a52ccb025b6d803d85e017931cd2452960 (patch) | |
tree | e95920f16c273e41f9cae1ea2f02571c221a514e /src/analysis/scan/exprs/relop.c | |
parent | 74d062d4ec55d7ac3914bbf64b8b6c5ab52227df (diff) |
Extend the ROST grammar with a first batch of new features.
Diffstat (limited to 'src/analysis/scan/exprs/relop.c')
-rw-r--r-- | src/analysis/scan/exprs/relop.c | 392 |
1 files changed, 0 insertions, 392 deletions
diff --git a/src/analysis/scan/exprs/relop.c b/src/analysis/scan/exprs/relop.c deleted file mode 100644 index 7dc6864..0000000 --- a/src/analysis/scan/exprs/relop.c +++ /dev/null @@ -1,392 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * relop.c - gestion des opérations relationnelles - * - * Copyright (C) 2022 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * Chrysalide is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Chrysalide is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Foobar. If not, see <http://www.gnu.org/licenses/>. - */ - - -#include "relop.h" - - -#include "relop-int.h" -#include "literal.h" - - - -/* --------------------- INTRODUCTION D'UNE NOUVELLE EXPRESSION --------------------- */ - - -/* Initialise la classe des opérations de relations. */ -static void g_relational_operation_class_init(GRelOperationClass *); - -/* Initialise une instance d'opération de relation. */ -static void g_relational_operation_init(GRelOperation *); - -/* Supprime toutes les références externes. */ -static void g_relational_operation_dispose(GRelOperation *); - -/* Procède à la libération totale de la mémoire. */ -static void g_relational_operation_finalize(GRelOperation *); - - - -/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ - - -/* Réalise une comparaison entre objets selon un critère précis. */ -static bool g_relational_operation_compare_rich(const GRelOperation *, const GRelOperation *, RichCmpOperation, bool *); - -/* Reproduit une expression en place dans une nouvelle instance. */ -static void g_relational_operation_copy(GRelOperation *, const GRelOperation *); - -/* Réduit une expression à une forme plus simple. */ -static bool g_relational_operation_reduce(GRelOperation *, GScanContext *, GScanScope *, GScanExpression **); - - - -/* ---------------------------------------------------------------------------------- */ -/* INTRODUCTION D'UNE NOUVELLE EXPRESSION */ -/* ---------------------------------------------------------------------------------- */ - - -/* Indique le type défini pour une opération de relation entre expressions. */ -G_DEFINE_TYPE(GRelOperation, g_relational_operation, G_TYPE_SCAN_EXPRESSION); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des opérations de relations. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_relational_operation_class_init(GRelOperationClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - GScanExpressionClass *expr; /* Version de classe parente */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_relational_operation_dispose; - object->finalize = (GObjectFinalizeFunc)g_relational_operation_finalize; - - expr = G_SCAN_EXPRESSION_CLASS(klass); - - expr->cmp_rich = (compare_expr_rich_fc)g_relational_operation_compare_rich; - expr->copy = (copy_expr_fc)g_relational_operation_copy; - expr->reduce = (reduce_expr_fc)g_relational_operation_reduce; - -} - - -/****************************************************************************** -* * -* Paramètres : op = instance à initialiser. * -* * -* Description : Initialise une instance d'opération de relation. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_relational_operation_init(GRelOperation *op) -{ - op->left = NULL; - op->right = NULL; - -} - - -/****************************************************************************** -* * -* Paramètres : op = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_relational_operation_dispose(GRelOperation *op) -{ - g_clear_object(&op->left); - g_clear_object(&op->right); - - G_OBJECT_CLASS(g_relational_operation_parent_class)->dispose(G_OBJECT(op)); - -} - - -/****************************************************************************** -* * -* Paramètres : op = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_relational_operation_finalize(GRelOperation *op) -{ - G_OBJECT_CLASS(g_relational_operation_parent_class)->finalize(G_OBJECT(op)); - -} - - -/****************************************************************************** -* * -* Paramètres : type = type d'opération booléenne à représenter. * -* left = premier opérande concerné. * -* right = éventuel second opérande impliqué ou NULL. * -* * -* Description : Organise une opération relationnelle entre expressions. * -* * -* Retour : Fonction mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GScanExpression *g_relational_operation_new(RichCmpOperation type, GScanExpression *left, GScanExpression *right) -{ - GScanExpression *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_RELATIONAL_OPERATION, NULL); - - if (!g_relational_operation_create(G_RELATIONAL_OPERATION(result), type, left, right)) - g_clear_object(&result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : op = instance à initialiser pleinement. * -* type = type d'opération booléenne à représenter. * -* left = premier opérande concerné. * -* right = éventuel second opérande impliqué ou NULL. * -* * -* Description : Met en place une opération relationnelle entre expressions. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_relational_operation_create(GRelOperation *op, RichCmpOperation type, GScanExpression *left, GScanExpression *right) -{ - bool result; /* Bilan à retourner */ - - result = false; - - if (g_scan_expression_get_value_type(left) != g_scan_expression_get_value_type(left)) - goto exit; - - if (!g_scan_expression_create(G_SCAN_EXPRESSION(op), EVT_BOOLEAN)) - goto exit; - - op->rel_type = type; - - op->left = left; - g_object_ref(G_OBJECT(op->left)); - - op->right = right; - g_object_ref(G_OBJECT(op->right)); - - result = true; - - exit: - - return result; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : item = premier objet à consulter pour une comparaison. * -* other = second objet à consulter pour une comparaison. * -* op = opération de comparaison à réaliser. * -* status = bilan des opérations de comparaison. [OUT] * -* * -* Description : Réalise une comparaison entre objets selon un critère précis.* -* * -* Retour : true si la comparaison a pu être effectuée, false sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_relational_operation_compare_rich(const GRelOperation *item, const GRelOperation *other, RichCmpOperation op, bool *status) -{ - bool result; /* Etat à retourner */ - - result = g_type_is_a(G_TYPE_FROM_INSTANCE(other), G_TYPE_RELATIONAL_OPERATION); - if (!result) goto done; - - if (item->rel_type != other->rel_type) - { - *status = compare_rich_integer_values(item->rel_type, other->rel_type, op); - goto done; - } - - result = g_comparable_item_compare_rich(G_COMPARABLE_ITEM(item), G_COMPARABLE_ITEM(other), RCO_EQ, status); - if (!result || STATUS_NOT_EQUAL(*status, op)) goto done; - - result = g_comparable_item_compare_rich(G_COMPARABLE_ITEM(item->left), - G_COMPARABLE_ITEM(other->left), - op, status); - if (!result || STATUS_NOT_EQUAL(*status, op)) goto done; - - result = g_comparable_item_compare_rich(G_COMPARABLE_ITEM(item->right), - G_COMPARABLE_ITEM(other->right), - op, status); - - done: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : dest = emplacement d'enregistrement à constituer. [OUT] * -* src = expression source à copier. * -* * -* Description : Reproduit une expression en place dans une nouvelle instance.* -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_relational_operation_copy(GRelOperation *dest, const GRelOperation *src) -{ - GScanExpressionClass *class; /* Classe parente à solliciter */ - - class = G_SCAN_EXPRESSION_CLASS(g_relational_operation_parent_class); - - class->copy(G_SCAN_EXPRESSION(dest), G_SCAN_EXPRESSION(src)); - - dest->rel_type = src->rel_type; - - dest->left = g_scan_expression_duplicate(src->left); - dest->right = g_scan_expression_duplicate(src->right); - -} - - -/****************************************************************************** -* * -* Paramètres : expr = expression à 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 : Bilan de l'opération : false en cas d'erreur irrécupérable. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_relational_operation_reduce(GRelOperation *expr, GScanContext *ctx, GScanScope *scope, GScanExpression **out) -{ - bool result; /* Bilan à retourner */ - GScanExpression *new_left; /* Expression réduite (gauche) */ - GScanExpression *new_right; /* Expression réduite (droite) */ - bool status; /* Bilan d'une comparaison */ - bool valid; /* Validité de ce bilan obtenu */ - - /* Réduction des éléments considérés */ - - new_left = NULL; - new_right = NULL; - - result = g_scan_expression_reduce(expr->left, ctx, scope, &new_left); - if (!result) goto exit; - - result = g_scan_expression_reduce(expr->right, ctx, scope, &new_right); - if (!result) goto exit; - - /* Construction d'une réduction locale ? */ - - if (G_IS_LITERAL_EXPRESSION(new_left) && G_IS_LITERAL_EXPRESSION(new_right)) - { - valid = g_comparable_item_compare_rich(G_COMPARABLE_ITEM(new_left), - G_COMPARABLE_ITEM(new_right), - expr->rel_type, &status); - - if (valid) - *out = g_literal_expression_new(EVT_BOOLEAN, (bool []) { status }); - - } - - /* Mise à jour de la progression ? */ - - else if ((new_left != NULL && new_left != expr->left) || (new_right != NULL && new_right != expr->right)) - { - if (new_left == NULL) - { - new_left = expr->left; - g_object_ref(G_OBJECT(new_left)); - } - - if (new_right == NULL) - { - new_right = expr->right; - g_object_ref(G_OBJECT(new_right)); - } - - *out = g_relational_operation_new(expr->rel_type, new_left, new_right); - - } - - exit: - - g_clear_object(&new_left); - g_clear_object(&new_right); - - return result; - -} |