From 79b8d70967a3fba85eb01eb511166b50210d124d Mon Sep 17 00:00:00 2001
From: David Hendriks <davidhendriks93@gmail.com>
Date: Wed, 30 Oct 2019 17:08:50 +0000
Subject: [PATCH] makking some c functions and binding them with python

---
 .python-version                    |   1 +
 python-c-api_solution/Makefile     |   9 +++++
 python-c-api_solution/demolib.c    |  25 ++++++++++++
 python-c-api_solution/demolib.h    |   6 +++
 python-c-api_solution/demolib.o    | Bin 0 -> 1824 bytes
 python-c-api_solution/demomodule.c |  63 +++++++++++++++++++++++++++++
 python-c-api_solution/main.c       |  34 ++++++++++++++++
 python-c-api_solution/main.o       | Bin 0 -> 1920 bytes
 python-c-api_solution/setup.py     |  11 +++++
 python-c-api_solution/test_script  | Bin 0 -> 8664 bytes
 python-c-api_solution/todo.org     |  20 +++++++++
 python-c-api_solution/todo.org~    |   2 +
 12 files changed, 171 insertions(+)
 create mode 100644 .python-version
 create mode 100644 python-c-api_solution/Makefile
 create mode 100644 python-c-api_solution/demolib.c
 create mode 100644 python-c-api_solution/demolib.h
 create mode 100644 python-c-api_solution/demolib.o
 create mode 100644 python-c-api_solution/demomodule.c
 create mode 100644 python-c-api_solution/main.c
 create mode 100644 python-c-api_solution/main.o
 create mode 100644 python-c-api_solution/setup.py
 create mode 100755 python-c-api_solution/test_script
 create mode 100644 python-c-api_solution/todo.org
 create mode 100644 python-c-api_solution/todo.org~

diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..61553c0
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+python-c-interface3.6.4
diff --git a/python-c-api_solution/Makefile b/python-c-api_solution/Makefile
new file mode 100644
index 0000000..375d89f
--- /dev/null
+++ b/python-c-api_solution/Makefile
@@ -0,0 +1,9 @@
+#http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
+CC=gcc
+CFLAGS=-I.
+
+test_script: main.o demolib.o
+	$(CC) -o test_script main.o demolib.o
+
+clean: 
+	rm -f *.o
\ No newline at end of file
diff --git a/python-c-api_solution/demolib.c b/python-c-api_solution/demolib.c
new file mode 100644
index 0000000..39d66e9
--- /dev/null
+++ b/python-c-api_solution/demolib.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "demolib.h"
+
+int add_number(int number_1, int number_2) {
+    int result = number_1 + number_2;
+    return result;
+}
+
+// https://stackoverflow.com/questions/8465006/how-do-i-concatenate-two-strings-in-c
+
+char* make_str(const char *s1, const char *s2) {
+    char *result = malloc(strlen(s1) + strlen(s2) + 1);
+    strcpy(result, s1);
+    strcat(result, s2);
+    return result;
+}
+
+int add_number_using_pointer() {
+    
+}
+
+
+
diff --git a/python-c-api_solution/demolib.h b/python-c-api_solution/demolib.h
new file mode 100644
index 0000000..17ce344
--- /dev/null
+++ b/python-c-api_solution/demolib.h
@@ -0,0 +1,6 @@
+// Example header file
+
+// char construct_string(int number);
+
+int add_number(int number_1, int number_2);
+char* make_str(const char *s1, const char *s2);
\ No newline at end of file
diff --git a/python-c-api_solution/demolib.o b/python-c-api_solution/demolib.o
new file mode 100644
index 0000000000000000000000000000000000000000..5896b43ecea3a7fb3097c0b062930226d5bc57dd
GIT binary patch
literal 1824
zcmbu9-)qxQ6vt26xvA?$6_Mct`yevGg%&5u5a|!n1}PTZ0*Z{7wi%T*?PwF|l<7l3
zh<(|gG^il>)F<gbAoQUxzK9Qnc}{X~dyVPKJmuzl&*z?VZgQHNk4iBgktE<I!4sHy
zoB|{kX7jW+O+yTpK~voy?(x`lMm=rZQ%2IjRVF=Uve&1T9kn~&P~GF9>N*3pr=Wfv
zQMT&#(H%@(X{dHjrK#&GBekauF=V8=->0~zQIWq9y4^1uulM>;$mO;Z8(P_E*iPc1
zyd@_$Q;z4QKBOMW$t^i`*XMWx*Su!{klwujsS}shV@nrL@WF2)r$KguE}7N%r$}yP
zQNsXqZ{v7O9PN-Ud|l~ABl~^~;dw^AU4WlwVe8S*&I3g87iLkc6lPIa48vGuX%4^e
z4_`)dRk$Co7s#$N&V8>3$Zp|?;|SUV1Yw+d7{+sR_|rKYs;1Sfzb(rZFsfC(;aFv}
z1(tDO>TSCPdZAd#W{P?#pWjh-_1#RisOW$zb+ds{^?I{HUghw}6T`-BJiE`7I!wKo
zocWfW!=DR0CdAhSz9R7V0$&w)g7F9{4Q^>R;hgs$<o1ze8)a0x<!g=4T4vplZL?#8
zTs3S1<Z`<Wa;0fmW&>HHX`6E4nYP)sjmiPYUbtD)_gjW#@_qkT6Ig)W`QRIwMn?A8
zm+3Y5?ODea`VZ362!FE1jzov?OQ@7fXOwKs7r28;Ja~e>vGt$?_rHe$RP(&~Da@ss
zNgSf_{i(iae1ERnxX9;X+%M4)=E2w!%NO4z3jfV=-Z16D`^SAccVYcMVGZHWMg6C*
z3(x2Mr~3)+jR;<{8?7<D%yNVIR5#dr%0FdA`MD!T7JU9I$U^fOeC1`$F2VdiTZG7Z

literal 0
HcmV?d00001

diff --git a/python-c-api_solution/demomodule.c b/python-c-api_solution/demomodule.c
new file mode 100644
index 0000000..1657aca
--- /dev/null
+++ b/python-c-api_solution/demomodule.c
@@ -0,0 +1,63 @@
+// demomodule.c
+#include <Python.h>
+#include "demolib.h"
+
+
+// https://stackoverflow.com/questions/51505391/how-to-parse-void-to-pyobject
+
+
+static PyObject *DemoLib_AddNumber(PyObject *self, PyObject *args) {
+    int *number_1;
+    int *number_2;
+    if (!PyArg_ParseTuple(args, "ii", &number_1, &number_2)) {
+        return NULL;
+    }
+    
+    int result;
+    result = add_number(number_1, number_2);
+
+    return Py_BuildValue("i", result);
+}
+
+static PyObject *DemoLib_MakeStr(PyObject *self, PyObject *args) {
+    char *character_1;
+    char *character_2;
+    if (!PyArg_ParseTuple(args, "ss", &character_1, &character_2)) {
+        return NULL;
+    }
+    
+    char* result;
+    result = make_str(character_1, character_2);
+
+    return Py_BuildValue("s", result);
+}
+
+// module's function table
+static PyMethodDef DemoLib_FunctionsTable[] = {
+    {
+        "add_number", // name exposed to Python
+        DemoLib_AddNumber, // C wrapper function
+        METH_VARARGS, // received variable args (but really just 1)
+        "adds two numbers" // documentation
+    }, {
+        "make_str", // name exposed to Python
+        DemoLib_MakeStr, // C wrapper function
+        METH_VARARGS, // received variable args (but really just 1)
+        "adds two strings" // documentation
+    }, {
+        NULL, NULL, 0, NULL
+    }
+};
+
+// modules definition
+static struct PyModuleDef DemoLib_Module = {
+    PyModuleDef_HEAD_INIT,
+    "demo",     // name of module exposed to Python
+    "Demo Python wrapper for custom C extension library.", // module documentation
+    -1,
+    DemoLib_FunctionsTable
+};
+
+PyMODINIT_FUNC PyInit_demo(void) {
+    return PyModule_Create(&DemoLib_Module);
+}
\ No newline at end of file
diff --git a/python-c-api_solution/main.c b/python-c-api_solution/main.c
new file mode 100644
index 0000000..3e05435
--- /dev/null
+++ b/python-c-api_solution/main.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include "demolib.h"
+
+
+int main(void) {
+    // Testing stuff for add_number function
+    int getal_1=2;
+    int getal_2=3;
+
+    int result;
+    result = add_number(getal_1, getal_2);
+    printf("%d\n", result);
+    //
+
+
+    // testing stuff for concatenate string function
+    char* str_1 = "a";
+    char* str_2 = "b";
+
+    char* s = make_str(str_1, str_2);
+    // do things with s
+    printf("%s\n", s);
+
+    free(s); // deallocate the string
+    // 
+
+    // testing stuff to 
+    
+
+
+
+
+    return(0);
+}
\ No newline at end of file
diff --git a/python-c-api_solution/main.o b/python-c-api_solution/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..e29df7dd325a7b1a79365f68f3ad84979b8f9351
GIT binary patch
literal 1920
zcmbu8&ubGw6vy9YYpXS>Q9KCs5D`Ve4hd9@1xtRg$sU4*+Td~7BpX`lZe(`@)q@p8
zVGRZUoE{5;L607ahaP&U(1QoP^&r;wc4yk@W^>VRn7sEs^WK};ncYpTQA;Tb2q~}#
zr;(rlr3uLo-4bLV4NX1xuD|(_A8LCk#6xXgMKfsb5462tHy9pLZlE0uw1eQ2zV(R0
zZTbr*^sRH`>w$K7>i*ORO&o}VU7dHpj3Y!xC$Z#*?LL3J)tLqpS^)KGbs=}B+3Guf
zKlgymv;174A4Y{&g(Az(v%=ko<I-1YeU$QY8I+BzGMk<{{{au+Ix-rh_w-ku$-YZf
zGn1*em_Z;}baoT)>o{pvO*~lu6@N)mu~U*%2v2QfN`<KrMnHw+4XZFYl24geq<x0Z
zjx2*CJCY4>a|~x=`28__aSX4H;b5C<4r_-7jCy0KQf?Sawb~PH#aJm<8kzxSr(-yM
zyJflX++B10E+(&AhUa74_dV#kmIXJkKZ#EIB97n3k@5sl^itDl3%)=QMfqtQf|m)R
zM1B+jG`J%;SyDSPVIMkM(Z`ecjKnu3eo5jv&Z)2H9U|tvuzj-y44*f$tHN`wXD0Kl
z4Ify?^i5zb&jaT6qM+TgZOg$qr{`O&{<t~k`DS|^6R6BuHM*{8TYTC7HaYA--%R{X
zEFmL__b-Z~T;Y?Q#X)yb!f{6YliJ~M8ZE6OzJzO>-{zdBa|-a~#5?Oy4_Wsxpq~F)
zU%*=GdFJjg7VC@sA_^5>{~=Oh;(d*>0KRgE_9si!3tPcS;mdh{<UsP{xleh0eE*_p
zQK}_3{yfXblJ0MZAE>w|x<9HF^@7uWM%G4F<Qsj>Eq&V;66%S??+y`c^QJlllH$*Q
R8RwGfzj0_vwdBU@{{p3z!QlV^

literal 0
HcmV?d00001

diff --git a/python-c-api_solution/setup.py b/python-c-api_solution/setup.py
new file mode 100644
index 0000000..0354312
--- /dev/null
+++ b/python-c-api_solution/setup.py
@@ -0,0 +1,11 @@
+from setuptools import Extension, setup
+
+module = Extension("demo",
+                  sources=[
+                    'demolib.c',
+                    'demomodule.c'
+                  ])
+setup(name='demo',
+     version='1.0',
+     description='Python wrapper for custom C extension',
+     ext_modules=[module])
\ No newline at end of file
diff --git a/python-c-api_solution/test_script b/python-c-api_solution/test_script
new file mode 100755
index 0000000000000000000000000000000000000000..f97b74885b85f148dd55b72354cc0b1763672653
GIT binary patch
literal 8664
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
E8&X0gx&QzG

literal 0
HcmV?d00001

diff --git a/python-c-api_solution/todo.org b/python-c-api_solution/todo.org
new file mode 100644
index 0000000..8911529
--- /dev/null
+++ b/python-c-api_solution/todo.org
@@ -0,0 +1,20 @@
+
+* DONE Construct function in c that returns combines 2 strings
+  CLOSED: [2019-10-30 Wed 16:59]
+* DONE Wrap this in python
+  CLOSED: [2019-10-30 Wed 16:59]
+
+* DONE construct a function in c that adds 2 numbers
+  CLOSED: [2019-10-30 Wed 16:59]
+* DONE Wrap this in python
+  CLOSED: [2019-10-30 Wed 16:59]
+* TODO Construct a function in c that uses a function pointer to combine two numbers
+* TODO wrap this in python
+
+
+
+
+
+
+
+* TODO Construct a simple program that recieves a function pointer AND a value, and passes that value to that function pointer
diff --git a/python-c-api_solution/todo.org~ b/python-c-api_solution/todo.org~
new file mode 100644
index 0000000..86fcc94
--- /dev/null
+++ b/python-c-api_solution/todo.org~
@@ -0,0 +1,2 @@
+* TODO construct simple program in c that prints a value
+* TODO Interface this function with python
-- 
GitLab