diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-08-13 22:04:53 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-08-13 22:04:53 (GMT) |
commit | 7cb4e815b691d05d8c0aea9decf56b9dbc41dfa6 (patch) | |
tree | ade598a747daa2e061f4903a81ac74e52e0c38b1 /plugins/pychrysalide/helpers.c | |
parent | dd2853ea8cf97b773ba362da50d06d4abc608a09 (diff) |
Used a Python enumeration for the binary symbol status.
Diffstat (limited to 'plugins/pychrysalide/helpers.c')
-rw-r--r-- | plugins/pychrysalide/helpers.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/plugins/pychrysalide/helpers.c b/plugins/pychrysalide/helpers.c index 6ffb4fe..6e13d3c 100644 --- a/plugins/pychrysalide/helpers.c +++ b/plugins/pychrysalide/helpers.c @@ -939,3 +939,202 @@ bool register_class_for_dynamic_pygobject(GType gtype, PyTypeObject *type, PyTyp return result; } + + + +/* ---------------------------------------------------------------------------------- */ +/* TRANSFERT DES VALEURS CONSTANTES */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : owner = type dont le dictionnaire est à compléter. * +* flags = indique le type d'énumération ciblée. * +* name = désignation humaine du groupe à constituer. * +* values = noms et valeurs associées. * +* doc = documentation à associer au groupe. * +* * +* Description : Officialise un groupe de constantes avec sémentique. * +* * +* Retour : true en cas de succès de l'opération, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool attach_constants_group(PyTypeObject *owner, bool flags, const char *name, PyObject *values, const char *doc) +{ + bool result; /* Bilan à retourner */ + PyObject *enum_mod; /* Module Python enum */ + PyObject *class; /* Classe "Enum*" */ + PyObject *str_obj; /* Conversion en Python */ + int ret; /* Bilan d'une insertion */ + PyObject *args; /* Arguments de la construction*/ + PyObject *kwargs; /* Mots clefs en complément */ + PyObject *new; /* Nouvelle instance en place */ + PyObject *features; /* Module à recompléter */ + PyObject *features_dict; /* Dictionnaire à compléter */ + + result = false; + + /* Recherche de la classe Python */ + + enum_mod = PyImport_ImportModule("enum"); + + if (enum_mod == NULL) + goto no_mod; + + if (flags) + class = PyObject_GetAttrString(enum_mod, "IntFlag"); + else + class = PyObject_GetAttrString(enum_mod, "IntEnum"); + + Py_DECREF(enum_mod); + + if (class == NULL) + goto no_class; + + /* Compléments des paramètres */ + + str_obj = PyUnicode_FromString(doc); + ret = PyDict_SetItemString(values, "__doc__", str_obj); + Py_DECREF(str_obj); + + if (ret != 0) + goto doc_error; + + args = PyTuple_New(2); + + ret = PyTuple_SetItem(args, 0, PyUnicode_FromString(name)); + if (ret != 0) goto args_error; + + Py_INCREF(values); + ret = PyTuple_SetItem(args, 1, values); + if (ret != 0) goto args_error; + + kwargs = PyDict_New(); + + str_obj = PyUnicode_FromString(owner->tp_name); + ret = PyDict_SetItemString(kwargs, "module", str_obj); + Py_DECREF(str_obj); + + if (ret != 0) goto kwargs_error; + + /* Constitution de l'énumération et enregistrement */ + + new = PyObject_Call(class, args, kwargs); + if (new == NULL) goto build_error; + + ret = PyDict_SetItemString(owner->tp_dict, name, new); + if (ret != 0) goto register_0_error; + + features = get_access_to_python_module("pychrysalide.features"); + + features_dict = PyModule_GetDict(features); + + ret = PyDict_SetItemString(features_dict, name, new); + if (ret != 0) goto register_1_error; + + result = true; + + /* Sortie propre */ + + register_1_error: + register_0_error: + + Py_DECREF(new); + + build_error: + kwargs_error: + + Py_DECREF(kwargs); + + args_error: + + Py_DECREF(args); + + doc_error: + + Py_DECREF(class); + + no_class: + no_mod: + + Py_DECREF(values); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : owner = propriétaire du groupe de constantes. * +* name = désignation humaine du groupe à consulter. * +* value = valeur à transmettre à Python. * +* * +* Description : Traduit une valeur constante C en équivalent Python. * +* * +* Retour : Objet Python résultant ou NULL en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *cast_with_constants_group(const PyTypeObject *owner, const char *name, unsigned long value) +{ + PyObject *result; /* Objet Python à retourner */ + char *dot; /* Position du dernier point */ + char *modname; /* Chemin d'accès au module */ + PyObject *module; /* Module à consulter */ + PyObject *type; /* Classe propriétaire */ + PyObject *class; /* Classe "Enum*" */ + PyObject *args; /* Arguments de la construction*/ + + result = NULL; + + /* Recherche de la classe Python */ + + dot = strrchr(owner->tp_name, '.'); + assert(dot != NULL); + + modname = strndup(owner->tp_name, dot - owner->tp_name); + + module = get_access_to_python_module(modname); + + if (module == NULL) + goto no_mod; + + type = PyObject_GetAttrString(module, dot + 1); + + if (type == NULL) + goto no_type; + + class = PyObject_GetAttrString(type, name); + + if (class == NULL) + goto no_class; + + /* Construction */ + + args = Py_BuildValue("(k)", value); + + result = PyObject_CallObject(class, args); + + Py_DECREF(args); + + Py_DECREF(class); + + no_class: + + Py_DECREF(type); + + no_type: + no_mod: + + free(modname); + + return result; + +} |