diff options
Diffstat (limited to 'plugins/pyoida/analysis/line.c')
-rw-r--r-- | plugins/pyoida/analysis/line.c | 793 |
1 files changed, 0 insertions, 793 deletions
diff --git a/plugins/pyoida/analysis/line.c b/plugins/pyoida/analysis/line.c deleted file mode 100644 index fd697e2..0000000 --- a/plugins/pyoida/analysis/line.c +++ /dev/null @@ -1,793 +0,0 @@ - -/* OpenIDA - Outil d'analyse de fichiers binaires - * line.c - équivalent Python du fichier "analysis/line.h" - * - * Copyright (C) 2010 Cyrille Bagard - * - * This file is part of OpenIDA. - * - * OpenIDA 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. - * - * OpenIDA 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "line.h" - - -#include "exporter-int.h" -#include "../arch/archbase.h" - - - - - - - -/* Classe 'analysis.line' pour Python */ -typedef struct _py_line -{ - py_exporter parent; /* A laisser en premier */ - - GRenderingLine *line; /* Référence GLib */ - -} py_line; - - - - -/* Crée un nouvel objet Python de type 'py_line'. */ -static PyObject *py_line_new(PyTypeObject *, PyObject *, PyObject *); - - - - - - -/* Fournit le type d'objet 'analysis.line' pour Python. */ -static PyTypeObject *get_analysis_line_type(void); - - - -/* Prépare un parcours de lignes. */ -static PyObject *py_line_get_iter(py_line *); - -/* Prépare un parcours de lignes en sens inverse. */ -static PyObject *py_line_get_riter(py_line *); - - - -/* Fournit l'adresse physique ou en mémoire d'une ligne. */ -static PyObject *py_line_get_address(py_line *, void *); - -/* Fournit le commentaire associé à la ligne s'il existe. */ -static PyObject *py_line_get_comment(py_line *, void *); - -/* Définit ou supprime un commentaire pour la ligne indiquée. */ -static int py_line_set_comment(py_line *, PyObject *, void *); - - - - - -/* ---------------------- ITERATEUR POUR LE PARCOURS DE LIGNES ---------------------- */ - - -/* Itérateur pour lignes de rendu */ -typedef struct _py_line_iter -{ - PyObject_HEAD /* A laisser en premier */ - - GRenderingLine *head; /* Liste à parcourir */ - GRenderingLine *cur; /* Point de parcours courant */ - -} py_line_iter; - - -/* Fournit le type d'objet 'analysis.LineIter' pour Python. */ -static PyTypeObject *get_analysis_line_iter_type(void); - -/* Prépare l'itérateur pour un parcours de lignes de rendu. */ -static PyObject *py_line_iter_new(GRenderingLine *); - -/* Libère la mémoire occupée par un itérateur de 'py_line'. */ -static void py_line_iter_dealloc(py_line_iter *); - -/* Fournit l'élément suivant dans un parcours de lignes. */ -static PyObject *py_line_iter_get_next(py_line_iter *); - - - -/* ---------------------- ITERATEUR POUR LE PARCOURS DE LIGNES ---------------------- */ - - -/* Itérateur pour lignes de rendu */ -typedef py_line_iter py_line_riter; - - -/* Fournit le type d'objet 'analysis.LineRevIter' pour Python. */ -static PyTypeObject *get_analysis_line_riter_type(void); - -/* Prépare l'itérateur pour un parcours de lignes de rendu. */ -static PyObject *py_line_riter_new(GRenderingLine *); - -/* Libère la mémoire occupée par un itérateur de 'py_line'. */ -static void py_line_riter_dealloc(py_line_riter *); - -/* Fournit l'élément précédant dans un parcours de lignes. */ -static PyObject *py_line_riter_get_prev(py_line_riter *); - - - - - - - - - - - - - - - - -/****************************************************************************** -* * -* Paramètres : type = type de l'objet à instancier. * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Crée un nouvel objet Python de type 'py_line'. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - py_line *result; /* Instance à retourner */ - - result = (py_line *)type->tp_alloc(type, 0); - - return (PyObject *)result; - -} - - -/****************************************************************************** -* * -* Paramètres : line = objet GLib existant à transposer. * -* * -* Description : Crée un nouvel objet Python de type 'py_line'. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -PyObject *py_line_new_from_existing(GRenderingLine *line) -{ - py_line *result; /* Instance à retourner */ - PyTypeObject *type; /* Type Python à instancier */ - - result = (py_line *)g_object_get_data(G_OBJECT(line), "python_object"); - - if (result == NULL) - { - type = get_analysis_line_type(); - - result = (py_line *)type->tp_alloc(type, 0); - - PY_EXPORTER(result)->glib = G_CONTENT_EXPORTER(line); /* TODO : move me ! */ - - result->line = line; - g_object_ref(line); - - g_object_set_data(G_OBJECT(line), "python_object", result); - - } - else Py_INCREF((PyObject *)result); - - return (PyObject *)result; - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit le type d'objet 'analysis.line' pour Python. * -* * -* Retour : Adresse du type vivant à manipuler. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyTypeObject *get_analysis_line_type(void) -{ - static PyTypeObject *result = NULL; /* Type pour objet à retourner */ - - static PyMethodDef py_line_methods[] = { - { - "__reversed__", (PyCFunction)py_line_get_riter, - METH_NOARGS, - "Return a reverse iterator over the rendering lines." - }, - { NULL } - }; - - static PyGetSetDef py_line_getset[] = { - { - "address", - (getter)py_line_get_address, - (setter)NULL, - "Get the physical or virtual address relative to the line." - }, - { - "comment", - (getter)py_line_get_comment, - (setter)py_line_set_comment, - "Get or set a comment for the rendering line." - }, - { NULL } - }; - - static PyTypeObject py_line_type = { - - PyObject_HEAD_INIT(NULL) - - .tp_name = "pyoida.analysis.Line", - .tp_basicsize = sizeof(py_line), - - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - - .tp_doc = "PyOIDA rendering line", - - .tp_iter = (getiterfunc)py_line_get_iter, - - .tp_methods = py_line_methods, - .tp_getset = py_line_getset, - .tp_new = (newfunc)py_line_new - - }; - - if (result == NULL) - { - py_line_type.tp_base = get_analysis_exporter_type(); - result = &py_line_type; - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Ajoute l'objet 'analysis.line' au module Python. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool add_analysis_line_to_python_module(PyObject *module) -{ - PyTypeObject *py_line_type; /* Type défini pour Python */ - int ret; /* Bilan d'un appel */ - - py_line_type = get_analysis_line_type(); - - if (PyType_Ready(py_line_type) < 0) - return false; - - Py_INCREF(py_line_type); - ret = PyModule_AddObject(module, "Line", (PyObject *)py_line_type); - - return (ret == 0); - -} - - - - - - - - -/****************************************************************************** -* * -* Paramètres : self = instance manipulée à traiter. * -* * -* Description : Prépare un parcours de lignes. * -* * -* Retour : Point de départ d'un parcours. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_get_iter(py_line *self) -{ - return (PyObject *)py_line_iter_new(self->line); - -} - - -/****************************************************************************** -* * -* Paramètres : self = instance manipulée à traiter. * -* * -* Description : Prépare un parcours de lignes en sens inverse. * -* * -* Retour : Point de départ d'un parcours. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_get_riter(py_line *self) -{ - return (PyObject *)py_line_riter_new(self->line); - -} - - - - - -/****************************************************************************** -* * -* Paramètres : self = classe présentant une ligne de rendu. * -* data = adresse non utilisée ici. * -* * -* Description : Fournit l'adresse physique ou en mémoire d'une ligne. * -* * -* Retour : Position physique ou en mémoire associée à la ligne. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_get_address(py_line *self, void *data) -{ - vmpa_t value; /* Adresse à convertir */ - - value = get_rendering_line_address(self->line); - - return py_vmpa_new_from_existing(value); - -} - - -/****************************************************************************** -* * -* Paramètres : self = classe présentant une ligne de rendu. * -* data = adresse non utilisée ici. * -* * -* Description : Fournit le commentaire associé à la ligne s'il existe. * -* * -* Retour : Chaîne de caractères ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_get_comment(py_line *self, void *data) -{ - const char *comment; /* Commentaire à transmettre */ - - comment = get_rendering_line_comment(self->line); - - return Py_BuildValue("s", comment); - -} - - -/****************************************************************************** -* * -* Paramètres : self = classe présentant des options de représentation. * -* value = nouvelle valeur affectée. * -* data = adresse non utilisée ici. * -* * -* Description : Définit ou supprime un commentaire pour la ligne indiquée. * -* * -* Retour : Bilan de la mise à jour. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int py_line_set_comment(py_line *self, PyObject *value, void *data) -{ - char *comment; /* Commentaire à définir */ - - comment = PyString_AsString(value); - /* FIXME : nil pour supprimer ? */ - - set_rendering_line_comment(self->line, comment); - - return 0; - -} - - - - - - - - - - - - - - - -/* ---------------------------------------------------------------------------------- */ -/* ITERATEUR POUR LE PARCOURS DE LIGNES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit le type d'objet 'analysis.LineIter' pour Python. * -* * -* Retour : Adresse du type vivant à manipuler. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyTypeObject *get_analysis_line_iter_type(void) -{ - static PyTypeObject *result = NULL; /* Type pour objet à retourner */ - - static PyTypeObject py_line_iter_type = { - - PyObject_HEAD_INIT(NULL) - - .tp_name = "pyoida.analysis.LineIter", - .tp_basicsize = sizeof(py_line_iter), - - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - - .tp_doc = "PyOIDA iterator for rendering lines", - - .tp_iter = PyObject_SelfIter, - .tp_iternext = (iternextfunc)py_line_iter_get_next - - }; - - if (result == NULL) result = &py_line_iter_type; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Ajoute l'objet 'analysis.LineIter' au module Python. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool add_analysis_line_iter_to_python_module(PyObject *module) -{ - PyTypeObject *py_line_iter_type; /* Type défini pour Python */ - int ret; /* Bilan d'un appel */ - - py_line_iter_type = get_analysis_line_iter_type(); - - if (PyType_Ready(py_line_iter_type) < 0) - return false; - - Py_INCREF(py_line_iter_type); - ret = PyModule_AddObject(module, "Iter", (PyObject *)py_line_iter_type); - - return (ret == 0); - -} - - -/****************************************************************************** -* * -* Paramètres : head = liste à parcourir. * -* * -* Description : Prépare l'itérateur pour un parcours de lignes de rendu. * -* * -* Retour : Instance d'itérateur prête à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_iter_new(GRenderingLine *head) -{ - py_line_iter *result; /* Nouvelle instance à renvoyer*/ - PyTypeObject *type; /* Type d'objet à créer */ - - type = get_analysis_line_iter_type(); - - result = (py_line_iter *)type->tp_alloc(type, 0); - - if (result != NULL) - { - result->head = head; - result->cur = NULL; - } - - return (PyObject *)result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = instance d'objet à supprimer. * -* * -* Description : Libère la mémoire occupée par un itérateur de 'py_line'. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void py_line_iter_dealloc(py_line_iter *self) -{ -#if PY_VERSION_HEX < 0x03000000 - self->ob_type->tp_free((PyObject *)self); -#else - Py_TYPE(self)->tp_free((PyObject *)self); -#endif - -} - - -/****************************************************************************** -* * -* Paramètres : self = instance manipulée à traiter. * -* * -* Description : Fournit l'élément suivant dans un parcours de lignes. * -* * -* Retour : Point suivant du parcours ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_iter_get_next(py_line_iter *self) -{ - PyObject *result; /* Elément à retourner */ - GRenderingLine *next; /* Elément réel suivant */ - - if (self->cur == NULL) next = self->head; - else next = g_rendering_line_get_next_iter(self->head, self->cur, NULL); - - if (next != NULL) - { - self->cur = next; - result = py_line_new_from_existing(next); - Py_INCREF(result); - } - else result = NULL; - - return (PyObject *)result; - -} - -/* ---------------------------------------------------------------------------------- */ -/* ITERATEUR POUR LE PARCOURS DE LIGNES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit le type d'objet 'analysis.LineRevIter' pour Python. * -* * -* Retour : Adresse du type vivant à manipuler. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyTypeObject *get_analysis_line_riter_type(void) -{ - static PyTypeObject *result = NULL; /* Type pour objet à retourner */ - - static PyTypeObject py_line_riter_type = { - - PyObject_HEAD_INIT(NULL) - - .tp_name = "pyoida.analysis.LineRevIter", - .tp_basicsize = sizeof(py_line_riter), - - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - - .tp_doc = "PyOIDA iterator for rendering lines", - - .tp_iter = PyObject_SelfIter, - .tp_iternext = (iternextfunc)py_line_riter_get_prev - - }; - - if (result == NULL) result = &py_line_riter_type; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Ajoute l'objet 'analysis.LineRevIter' au module Python. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool add_analysis_line_riter_to_python_module(PyObject *module) -{ - PyTypeObject *py_line_riter_type; /* Type défini pour Python */ - int ret; /* Bilan d'un appel */ - - py_line_riter_type = get_analysis_line_riter_type(); - - if (PyType_Ready(py_line_riter_type) < 0) - return false; - - Py_INCREF(py_line_riter_type); - ret = PyModule_AddObject(module, "RevIter", (PyObject *)py_line_riter_type); - - return (ret == 0); - -} - - -/****************************************************************************** -* * -* Paramètres : head = liste à parcourir. * -* * -* Description : Prépare l'itérateur pour un parcours de lignes de rendu. * -* * -* Retour : Instance d'itérateur prête à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_riter_new(GRenderingLine *head) -{ - py_line_riter *result; /* Nouvelle instance à renvoyer*/ - PyTypeObject *type; /* Type d'objet à créer */ - - type = get_analysis_line_riter_type(); - - result = (py_line_riter *)type->tp_alloc(type, 0); - - if (result != NULL) - { - result->head = head; - result->cur = NULL; - } - - return (PyObject *)result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = instance d'objet à supprimer. * -* * -* Description : Libère la mémoire occupée par un itérateur de 'py_line'. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void py_line_riter_dealloc(py_line_riter *self) -{ -#if PY_VERSION_HEX < 0x03000000 - self->ob_type->tp_free((PyObject *)self); -#else - Py_TYPE(self)->tp_free((PyObject *)self); -#endif - -} - - -/****************************************************************************** -* * -* Paramètres : self = instance manipulée à traiter. * -* * -* Description : Fournit l'élément précédant dans un parcours de lignes. * -* * -* Retour : Point suivant du parcours ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_line_riter_get_prev(py_line_riter *self) -{ - PyObject *result; /* Elément à retourner */ - GRenderingLine *prev; /* Elément réel précédant */ - - if (self->cur == NULL) prev = g_rendering_line_get_last_iter(self->head, NULL); - else prev = g_rendering_line_get_prev_iter(self->head, self->cur, NULL); - - if (prev != NULL) - { - self->cur = prev; - result = py_line_new_from_existing(prev); - Py_INCREF(result); - } - else result = NULL; - - return (PyObject *)result; - -} |