From 71f3743de14d7a1f402bbb453e27a0623718445b Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Thu, 12 Dec 2019 20:38:59 +0700
Subject: [PATCH] [+] Added wrapping function dap_chain_hash_slow_to_str,
 dap_chain_addr_to_str, dap_chain_addr_from_str, dap_chain_net_id_from_str.
 And structs dap_chain_net_id_t, dap_chain_addr_t, dap_chain_hash_slow_t

---
 include/wrapping_dap_chain_common.h | 190 ++++++++++++++++++++++++++++
 src/wrapping_dap_chain_common.c     |  38 ++++++
 2 files changed, 228 insertions(+)
 create mode 100644 include/wrapping_dap_chain_common.h
 create mode 100644 src/wrapping_dap_chain_common.c

diff --git a/include/wrapping_dap_chain_common.h b/include/wrapping_dap_chain_common.h
new file mode 100644
index 00000000..63bd7845
--- /dev/null
+++ b/include/wrapping_dap_chain_common.h
@@ -0,0 +1,190 @@
+#ifndef _WRAPPING_DAP_CHAIN_COMMON_
+#define _WRAPPING_DAP_CHAIN_COMMON_
+#include <Python.h>
+#include "dap_chain_common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Chain hash slow */
+typedef struct PyDapChainHashSlow{
+    PyObject_HEAD
+    dap_chain_hash_slow_t *hash_slow;
+}PyDapChainHashSlowObject;
+
+PyObject *dap_chain_hash_slow_to_str_py(PyObject *self, PyObject *args);
+
+PyMethodDef DapChainHashSlowMethod[] = {
+    {"toStr", (PyCFunction)dap_chain_hash_slow_to_str_py, METH_VARARGS, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainHashSlowObject_DapChainHashSlowObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.HashSlow",       /* tp_name */
+    sizeof(PyDapChainHashSlowObject),/* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain hash slow object",        /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainHashSlowMethod,                               /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+
+/*=================*/
+
+/* Chain addr */
+typedef struct PyDapChainAddr{
+    PyObject_HEAD
+    dap_chain_addr_t *addr;
+}PyDapChainAddrObject;
+
+PyObject *dap_chain_addr_to_str_py(PyObject *self, PyObject *args);
+PyObject *dap_chain_addr_from_str_py(PyObject *self, PyObject *args);
+
+PyMethodDef DapChainAddrMethods[] = {
+    {"toStr", (PyCFunction)dap_chain_addr_to_str_py, METH_VARARGS, ""},
+    {"fromStr", (PyCFunction)dap_chain_addr_from_str_py, METH_VARARGS, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainAddrObject_DapChainAddrObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.Addr",       /* tp_name */
+    sizeof(PyDapChainAddrObject),/* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain addr object",             /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    DapChainAddrMethods,             /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+
+/*=================*/
+
+/* Chain net id */
+
+typedef struct PyDapChainNetId{
+    PyObject_HEAD
+    dap_chain_net_id_t net_id;
+}PyDapChainNetIdObject;
+
+PyObject *dap_chain_net_id_from_str_py(PyObject *self, PyObject *args);
+
+PyMethodDef DapChainNetIdObject[] = {
+    {"fromStr", (PyCFunction)dap_chain_net_id_from_str_py, METH_VARARGS, ""},
+    {NULL, NULL, 0, NULL}
+};
+
+static PyTypeObject DapChainNetIdObject_DapChainNetIdObjectType = {
+    PyVarObject_HEAD_INIT(NULL, 0)
+    "CellFrame.Chain.NetID",          /* tp_name */
+    sizeof(PyDapChainNetIdObject),   /* tp_basicsize */
+    0,                               /* tp_itemsize */
+    0,                               /* tp_dealloc */
+    0,                               /* tp_print */
+    0,                               /* tp_getattr */
+    0,                               /* tp_setattr */
+    0,                               /* tp_reserved */
+    0,                               /* tp_repr */
+    0,                               /* tp_as_number */
+    0,                               /* tp_as_sequence */
+    0,                               /* tp_as_mapping */
+    0,                               /* tp_hash  */
+    0,                               /* tp_call */
+    0,                               /* tp_str */
+    0,                               /* tp_getattro */
+    0,                               /* tp_setattro */
+    0,                               /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT |
+        Py_TPFLAGS_BASETYPE,         /* tp_flags */
+    "Chain net id object",           /* tp_doc */
+    0,		                         /* tp_traverse */
+    0,		                         /* tp_clear */
+    0,		                         /* tp_richcompare */
+    0,                               /* tp_weaklistoffset */
+    0,		                         /* tp_iter */
+    0,		                         /* tp_iternext */
+    0,                               /* tp_methods */
+    0,                               /* tp_members */
+    0,                               /* tp_getset */
+    0,                               /* tp_base */
+    0,                               /* tp_dict */
+    0,                               /* tp_descr_get */
+    0,                               /* tp_descr_set */
+    0,                               /* tp_dictoffset */
+    0,                               /* tp_init */
+    0,                               /* tp_alloc */
+    PyType_GenericNew,               /* tp_new */
+};
+
+/*=================*/
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif //_WRAPPING_DAP_CHAIN_COMMON_
diff --git a/src/wrapping_dap_chain_common.c b/src/wrapping_dap_chain_common.c
new file mode 100644
index 00000000..c70f73fe
--- /dev/null
+++ b/src/wrapping_dap_chain_common.c
@@ -0,0 +1,38 @@
+#include "wrapping_dap_chain_common.h"
+
+PyObject *dap_chain_hash_slow_to_str_py(PyObject *self, PyObject *args){
+    PyObject *obj_hash_slow;
+    char *str;
+    size_t str_max;
+    if (!PyArg_ParseTuple(args, "O|s|n", &obj_hash_slow, &str, &str_max))
+            return NULL;
+    size_t res = dap_chain_hash_slow_to_str(((PyDapChainHashSlowObject*)obj_hash_slow)->hash_slow, str, str_max);
+    return Py_BuildValue("ns", res, str_max);
+}
+
+PyObject *dap_chain_addr_to_str_py(PyObject *self, PyObject *args){
+    PyObject *obj_chain_addr;
+    if (!PyArg_ParseTuple(args, "O", &obj_chain_addr))
+        return NULL;
+    const dap_chain_addr_t *addr = ((PyDapChainAddrObject*)obj_chain_addr)->addr;
+    char *res = dap_chain_addr_to_str(addr);
+    return Py_BuildValue("s", res);
+}
+
+PyObject *dap_chain_addr_from_str_py(PyObject *self, PyObject *args){
+    const char *str;
+    if (!PyArg_ParseTuple(args, "s", &str))
+        return NULL;
+    PyObject *obj = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType);
+    ((PyDapChainAddrObject*)obj)->addr = dap_chain_addr_from_str(str);
+    return Py_BuildValue("O", obj);
+}
+
+PyObject *dap_chain_net_id_from_str_py(PyObject *self, PyObject *args){
+    const char *str;
+    if (!PyArg_ParseTuple(args, "s", &str))
+        return NULL;
+    PyObject *obj_net_id = _PyObject_New(&DapChainNetIdObject_DapChainNetIdObjectType);
+    ((PyDapChainNetIdObject*)obj_net_id)->net_id = dap_chain_net_id_from_str(str);
+    return Py_BuildValue("O", obj_net_id);
+}
-- 
GitLab