From 8d4c5ae6dfd812b753109a25d7e84f7e524d4bf0 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 13 Apr 2020 00:25:43 +0200 Subject: Improved support of type prefix for symbols. --- plugins/pychrysalide/format/constants.c | 3 +- plugins/pychrysalide/format/symbol.c | 55 ++++++++++++++++++++++++++-- src/format/symbol-int.h | 3 ++ src/format/symbol.c | 64 ++++++++++++++++++++++++++++++++- src/format/symbol.h | 10 ++++-- tests/format/symbol.py | 8 ++--- 6 files changed, 132 insertions(+), 11 deletions(-) diff --git a/plugins/pychrysalide/format/constants.c b/plugins/pychrysalide/format/constants.c index dfa4615..a0d71f7 100644 --- a/plugins/pychrysalide/format/constants.c +++ b/plugins/pychrysalide/format/constants.c @@ -88,7 +88,8 @@ bool define_binary_symbol_constants(PyTypeObject *type) values = PyDict_New(); result = add_const_to_group(values, "NONE", SFL_NONE); - if (result) result = add_const_to_group(values, "PREFIXED_NAME", SFL_PREFIXED_NAME); + if (result) result = add_const_to_group(values, "HAS_NM_PREFIX", SFL_HAS_NM_PREFIX); + if (result) result = add_const_to_group(values, "MASK", SFL_MASK); if (!result) { diff --git a/plugins/pychrysalide/format/symbol.c b/plugins/pychrysalide/format/symbol.c index 75eb8f4..6f1c1d2 100644 --- a/plugins/pychrysalide/format/symbol.c +++ b/plugins/pychrysalide/format/symbol.c @@ -93,9 +93,6 @@ static PyObject *py_binary_symbol_get_stype(PyObject *, void *); /* Définit le type du symbole. */ static int py_binary_symbol_set_stype(PyObject *, PyObject *, void *); -/* Fournit un étiquette pour viser un symbole. */ -static PyObject *py_binary_symbol_get_label(PyObject *, void *); - /* Fournit la visibilité du symbole. */ static PyObject *py_binary_symbol_get_status(PyObject *, void *); @@ -105,6 +102,12 @@ static int py_binary_symbol_set_status(PyObject *, PyObject *, void *); /* Fournit les particularités du symbole. */ static PyObject *py_binary_symbol_get_flags(PyObject *, void *); +/* Fournit le préfixe compatible avec une sortie "nm". */ +static PyObject *py_binary_symbol_get_nm_prefix(PyObject *, void *); + +/* Fournit un étiquette pour viser un symbole. */ +static PyObject *py_binary_symbol_get_label(PyObject *, void *); + /* Définit un autre nom pour le symbole. */ static int py_binary_symbol_set_label(PyObject *, PyObject *, void *); @@ -747,6 +750,51 @@ static PyObject *py_binary_symbol_get_flags(PyObject *self, void *closure) * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * +* Description : Fournit le préfixe compatible avec une sortie "nm". * +* * +* Retour : Caractère éventuel ou None. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_symbol_get_nm_prefix(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GBinSymbol *symbol; /* Elément à consulter */ + char prefix[2]; /* Eventuel préfixe "nm" */ + bool status; /* Validité de ce préfixe */ + +#define BINARY_SYMBOL_NM_PREFIX_ATTRIB PYTHON_GET_DEF_FULL \ +( \ + nm_prefix, py_binary_symbol, \ + "Single-byte string for an optional *nm* prefix, or None if any." \ +) + + symbol = G_BIN_SYMBOL(pygobject_get(self)); + status = g_binary_symbol_get_nm_prefix(symbol, &prefix[0]); + + if (status) + { + prefix[1] = '\0'; + result = PyUnicode_FromString(prefix); + } + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * * Description : Fournit un étiquette pour viser un symbole. * * * * Retour : Chaîne de caractères renvoyant au symbole. * @@ -852,6 +900,7 @@ PyTypeObject *get_python_binary_symbol_type(void) BINARY_SYMBOL_STYPE_ATTRIB, BINARY_SYMBOL_STATUS_ATTRIB, BINARY_SYMBOL_FLAGS_ATTRIB, + BINARY_SYMBOL_NM_PREFIX_ATTRIB, BINARY_SYMBOL_LABEL_ATTRIB, { NULL } }; diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h index 77ffd39..5e77a4d 100644 --- a/src/format/symbol-int.h +++ b/src/format/symbol-int.h @@ -41,6 +41,9 @@ typedef union _sym_obj_extra { SymbolType stype; /* Type du symbole */ SymbolStatus status; /* Visibilité du symbole */ + + char nm_prefix; /* Eventuel préfixe "nm" */ + SymbolFlag flags; /* Informations complémentaires*/ }; diff --git a/src/format/symbol.c b/src/format/symbol.c index 7d272ce..abf284e 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -549,7 +549,7 @@ SymbolFlag g_binary_symbol_get_flags(const GBinSymbol *symbol) g_bit_lock(&extra->lock, HOLE_LOCK_BIT); - result = extra->flags; + result = (extra->flags & SFL_MASK); g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); @@ -561,6 +561,68 @@ SymbolFlag g_binary_symbol_get_flags(const GBinSymbol *symbol) /****************************************************************************** * * * Paramètres : symbol = symbole à venir consulter. * +* prefix = éventuel préfixe à constituer. [OUT] * +* * +* Description : Fournit le préfixe compatible avec une sortie "nm". * +* * +* Retour : true si un préfixe "nm" est renseigné. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_symbol_get_nm_prefix(const GBinSymbol *symbol, char *prefix) +{ + bool result; /* Validité à retourner */ + sym_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_SYMBOL_EXTRA(symbol); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & SFL_HAS_NM_PREFIX); + + if (result) + *prefix = extra->nm_prefix; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + +/****************************************************************************** +* * +* Paramètres : symbol = symbole à venir consulter. * +* prefix = préfixe "nm" à associer au symbole. * +* * +* Description : Définit le préfixe compatible avec une sortie "nm". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_symbol_set_nm_prefix(const GBinSymbol *symbol, char prefix) +{ + sym_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_SYMBOL_EXTRA(symbol); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + extra->nm_prefix = prefix; + extra->flags |= SFL_HAS_NM_PREFIX; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + +} + + +/****************************************************************************** +* * +* Paramètres : symbol = symbole à venir consulter. * * * * Description : Fournit une étiquette pour viser un symbole. * * * diff --git a/src/format/symbol.h b/src/format/symbol.h index e304d69..577eb83 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -66,9 +66,9 @@ typedef enum _SymbolStatus typedef enum _SymbolFlag { SFL_NONE = (0 << 0), /* Aucune propriété */ - SFL_PREFIXED_NAME = (1 << 0), /* Indication en amont du nom */ + SFL_HAS_NM_PREFIX = (1 << 0), /* Indication de nature */ - SFL_COUNT + SFL_MASK = (1 << 1) - 1, /* Indication de nature */ } SymbolFlag; @@ -130,6 +130,12 @@ bool g_binary_symbol_has_flag(const GBinSymbol *, SymbolFlag); /* Fournit les particularités du symbole. */ SymbolFlag g_binary_symbol_get_flags(const GBinSymbol *); +/* Fournit le préfixe compatible avec une sortie "nm". */ +bool g_binary_symbol_get_nm_prefix(const GBinSymbol *, char *); + +/* Définit le préfixe compatible avec une sortie "nm". */ +void g_binary_symbol_set_nm_prefix(const GBinSymbol *, char); + /* Fournit une étiquette pour viser un symbole. */ char *g_binary_symbol_get_label(const GBinSymbol *); diff --git a/tests/format/symbol.py b/tests/format/symbol.py index fed4133..0b5f0a1 100644 --- a/tests/format/symbol.py +++ b/tests/format/symbol.py @@ -80,16 +80,16 @@ class TestBinarySymbols(ChrysalideTestCase): ret = symbol.unset_flag(BinSymbol.SymbolFlag.NONE) self.assertFalse(ret) - ret = symbol.set_flag(BinSymbol.SymbolFlag.PREFIXED_NAME) + ret = symbol.set_flag(BinSymbol.SymbolFlag.HAS_NM_PREFIX) self.assertTrue(ret) - ret = symbol.has_flag(BinSymbol.SymbolFlag.PREFIXED_NAME) + ret = symbol.has_flag(BinSymbol.SymbolFlag.HAS_NM_PREFIX) self.assertTrue(ret) - ret = symbol.unset_flag(BinSymbol.SymbolFlag.PREFIXED_NAME) + ret = symbol.unset_flag(BinSymbol.SymbolFlag.HAS_NM_PREFIX) self.assertTrue(ret) - ret = symbol.has_flag(BinSymbol.SymbolFlag.PREFIXED_NAME) + ret = symbol.has_flag(BinSymbol.SymbolFlag.HAS_NM_PREFIX) self.assertFalse(ret) -- cgit v0.11.2-87-g4458