From dd9974a5c2770a066d8b4edf47b41034fbd41c72 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 18 Aug 2019 23:35:18 +0200
Subject: Prepared an improved Python documentation.

---
 plugins/pychrysalide/analysis/db/certs.c      |  2 +-
 plugins/pychrysalide/analysis/db/collection.c |  2 +-
 plugins/pychrysalide/analysis/db/item.c       |  2 +-
 plugins/pychrysalide/format/symbol.c          | 10 +++++-----
 plugins/pychrysalide/helpers.c                | 24 +++++++++++++++++++++++-
 plugins/pychrysalide/pychrysa.c               |  4 ++--
 6 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/plugins/pychrysalide/analysis/db/certs.c b/plugins/pychrysalide/analysis/db/certs.c
index 5fd2034..3da3849 100644
--- a/plugins/pychrysalide/analysis/db/certs.c
+++ b/plugins/pychrysalide/analysis/db/certs.c
@@ -263,7 +263,7 @@ PyTypeObject *get_python_certs_type(void)
         },
         { "sign_cert", py_certs_sign_cert,
           METH_VARARGS | METH_STATIC,
-          "sign_cert(csr, cacert, cakey, cert, valid, /)\n--\n\nSign a certificate sign request.."
+          "sign_cert(csr, cacert, cakey, cert, valid, /)\n--\n\nSign a certificate sign request."
         },
         { NULL }
 
diff --git a/plugins/pychrysalide/analysis/db/collection.c b/plugins/pychrysalide/analysis/db/collection.c
index 7f8ac2d..699c272 100644
--- a/plugins/pychrysalide/analysis/db/collection.c
+++ b/plugins/pychrysalide/analysis/db/collection.c
@@ -104,7 +104,7 @@ bool ensure_python_db_collection_is_registered(void)
 
     if (!PyType_HasFeature(type, Py_TPFLAGS_READY))
     {
-        module = get_access_to_python_module("pychrysalide.format");
+        module = get_access_to_python_module("pychrysalide.analysis.db");
 
         dict = PyModule_GetDict(module);
 
diff --git a/plugins/pychrysalide/analysis/db/item.c b/plugins/pychrysalide/analysis/db/item.c
index 23e6933..0544d86 100644
--- a/plugins/pychrysalide/analysis/db/item.c
+++ b/plugins/pychrysalide/analysis/db/item.c
@@ -176,7 +176,7 @@ bool ensure_python_db_item_is_registered(void)
 
     if (!PyType_HasFeature(type, Py_TPFLAGS_READY))
     {
-        module = get_access_to_python_module("pychrysalide.format");
+        module = get_access_to_python_module("pychrysalide.analysis.db");
 
         dict = PyModule_GetDict(module);
 
diff --git a/plugins/pychrysalide/format/symbol.c b/plugins/pychrysalide/format/symbol.c
index 359ee45..a88a260 100644
--- a/plugins/pychrysalide/format/symbol.c
+++ b/plugins/pychrysalide/format/symbol.c
@@ -249,16 +249,16 @@ static int py_binary_symbol_init(PyObject *self, PyObject *args, PyObject *kwds)
     GBinSymbol *symbol;                     /* Version GLib du symble      */
 
 #define BINARY_SYMBOL_DOC                                                       \
-    "BinSymbol represents all kinds of symbols, such as string, routines or"    \
+    "BinSymbol represents all kinds of symbols, such as strings, routines or"   \
     " objects. If something can be linked to a physical or virtual location,"   \
     " it can be a symbol."                                                      \
     "\n"                                                                        \
     "Instances can be created using the following constructor:\n"               \
     "\n"                                                                        \
-    "    BinSymbol(stype, range)"                                               \
+    "    BinSymbol(range, stype)"                                               \
     "\n"                                                                        \
-    "Where stype is a pychrysalide.format.BinSymbol.SymbolType value, and"      \
-    " range a memory space defined by pychrysalide.arch.mrange."                \
+    "Where range is a memory space defined by pychrysalide.arch.mrange and"     \
+    " stype a pychrysalide.format.BinSymbol.SymbolType value."                  \
     "\n"                                                                        \
     "The following special method can be overridden:\n"                         \
     "* _get_label(self): provides a default label for the symbol."
@@ -363,7 +363,7 @@ static PyObject *py_binary_symbol_get_range(PyObject *self, void *closure)
 #define BINARY_SYMBOL_RANGE_ATTRIB PYTHON_GETSET_DEF_FULL   \
 (                                                           \
     range, py_binary_symbol,                                \
-    "Range covered by the symbol."                          \
+    "Memory range covered by the symbol."                   \
 )
 
     symbol = G_BIN_SYMBOL(pygobject_get(self));
diff --git a/plugins/pychrysalide/helpers.c b/plugins/pychrysalide/helpers.c
index 59bcd45..5b7c1e6 100644
--- a/plugins/pychrysalide/helpers.c
+++ b/plugins/pychrysalide/helpers.c
@@ -28,8 +28,10 @@
 #include <malloc.h>
 #include <pygobject.h>
 #include <stdarg.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <strings.h>
 
 
 #include <i18n.h>
@@ -1003,6 +1005,9 @@ bool attach_constants_group(PyTypeObject *owner, bool flags, const char *name, P
     int ret;                                /* Bilan d'une insertion       */
     PyObject *args;                         /* Arguments de la construction*/
     PyObject *kwargs;                       /* Mots clefs en complément    */
+    char *dot;                              /* Point de séparation         */
+    char *module;                           /* Module d'appartenance       */
+    char *qualname;                         /* Désignation pour Pickle     */
     PyObject *new;                          /* Nouvelle instance en place  */
     PyObject *features;                     /* Module à recompléter        */
     PyObject *features_dict;                /* Dictionnaire à compléter    */
@@ -1046,10 +1051,27 @@ bool attach_constants_group(PyTypeObject *owner, bool flags, const char *name, P
 
     kwargs = PyDict_New();
 
-    str_obj = PyUnicode_FromString(owner->tp_name);
+    dot = rindex(owner->tp_name, '.');
+    assert(dot != NULL);
+
+    module = strndup(owner->tp_name, dot - owner->tp_name);
+
+    str_obj = PyUnicode_FromString(module);
     ret = PyDict_SetItemString(kwargs, "module", str_obj);
     Py_DECREF(str_obj);
 
+    free(module);
+
+    asprintf(&qualname, "%s.%s", dot + 1, name);
+
+    if (ret != 0) goto kwargs_error;
+
+    str_obj = PyUnicode_FromString(qualname);
+    ret = PyDict_SetItemString(kwargs, "qualname", str_obj);
+    Py_DECREF(str_obj);
+
+    free(qualname);
+
     if (ret != 0) goto kwargs_error;
 
     /* Constitution de l'énumération et enregistrement */
diff --git a/plugins/pychrysalide/pychrysa.c b/plugins/pychrysalide/pychrysa.c
index 23ec3d7..d97cbf0 100644
--- a/plugins/pychrysalide/pychrysa.c
+++ b/plugins/pychrysalide/pychrysa.c
@@ -390,10 +390,10 @@ static bool add_plugin_module_to_python_module(PyObject *super)
     "PyChrysalide is a module containing Chrysalide's features and designed for Python users.\n"                \
     "\n"                                                                                                        \
     "The whole API is defined in a single library named 'pychrysalide.so' and can be used in two ways:\n"       \
-    "* either from the Chrysalide's GUI, by registering hooks or GLib signals.\n"                               \
+    "* either from the Chrysalide's GUI, by registering hooks or GLib signals,\n"                               \
     "* or from a shell command line, by setting PYTHONPATH to point to the directory containing the library.\n" \
     "\n"                                                                                                        \
-    "In both cases, it is a good start point to have a look at already existing plugins to quickly learn "      \
+    "In both cases, this is a good start point to have a look at already existing plugins to quickly learn "    \
     "how the API works.\n"                                                                                      \
     "\n"                                                                                                        \
     "These plugins are located in the 'plugins/python' directory."
-- 
cgit v0.11.2-87-g4458