diff options
Diffstat (limited to 'plugins/pychrysalide/common')
| -rw-r--r-- | plugins/pychrysalide/common/bits.c | 56 | 
1 files changed, 56 insertions, 0 deletions
| diff --git a/plugins/pychrysalide/common/bits.c b/plugins/pychrysalide/common/bits.c index 9275996..a127251 100644 --- a/plugins/pychrysalide/common/bits.c +++ b/plugins/pychrysalide/common/bits.c @@ -98,6 +98,9 @@ static PyObject *py_bitfield_test_zeros_with(PyObject *, PyObject *);  /* Teste l'état à 1 de bits selon un masque de bits. */  static PyObject *py_bitfield_test_ones_with(PyObject *, PyObject *); +/* Recherche un prochain bit défini dans un champ de bits. */ +static PyObject *py_bitfield_find_next_set(PyObject *, PyObject *); +  /* Indique la taille d'un champ de bits donné. */  static PyObject *py_bitfield_get_size(PyObject *, void *); @@ -891,6 +894,58 @@ static PyObject *py_bitfield_test_ones_with(PyObject *self, PyObject *args)  /******************************************************************************  *                                                                             * +*  Paramètres  : self = champ de bits à consulter.                            * +*                args = arguments fournis pour la conduite de l'opération.    * +*                                                                             * +*  Description : Recherche un prochain bit défini dans un champ de bits.      * +*                                                                             * +*  Retour      : Position d'un bit à 1 ou taille du champ si plus aucun.      * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static PyObject *py_bitfield_find_next_set(PyObject *self, PyObject *args) +{ +    PyObject *result;                       /* Bilan à faire remonter      */ +    unsigned long prev;                     /* Indice d'un bit à écarter   */ +    int ret;                                /* Bilan de lecture des args.  */ +    py_bitfield_t *bf;                      /* Instance à manipuler        */ +    size_t found;                           /* Indice de bit trouvé        */ + +#define BITFIELD_FIND_NEXT_SET_METHOD PYTHON_METHOD_DEF     \ +(                                                           \ +    find_next_set, "$self, /, prev=None",                   \ +    METH_VARARGS, py_bitfield,                              \ +    "Find the index of the next set bit in the bit field.\n"\ +    "\n"                                                    \ +    "If provided, the *prev* argument is the position of"   \ +    " a previously found bit, which gets discarded for the" \ +    " current call.\n"                                      \ +    "\n"                                                    \ +    "The result is a integer value: a valid index inside"   \ +    " the bit field, or the bit field size if no set bit"   \ +    " is found."                                            \ +) + +    prev = (unsigned long)-1; + +    ret = PyArg_ParseTuple(args, "|k", &prev); +    if (!ret) return NULL; + +    bf = (py_bitfield_t *)self; + +    found = find_next_set_in_bit_field(bf->native, prev == (unsigned long)-1 ? NULL : (size_t []) { prev }); + +    result = PyLong_FromSize_t(found); + +    return result; + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : self    = classe représentant une instruction.               *  *                closure = adresse non utilisée ici.                          *  *                                                                             * @@ -998,6 +1053,7 @@ PyTypeObject *get_python_bitfield_type(void)          BITFIELD_TEST_ALL_METHOD,          BITFIELD_TEST_ZEROS_WITH_METHOD,          BITFIELD_TEST_ONES_WITH_METHOD, +        BITFIELD_FIND_NEXT_SET_METHOD,          { NULL }      }; | 
