cython
1from cython.cimports.libc.stdlib import malloc
2from cython.cimports.libc.string import strcpy, strlen
3
4hello_world = cython.declare(cython.p_char, 'hello world')
5n = cython.declare(cython.Py_ssize_t, strlen(hello_world))
6
7@cython.cfunc
8def c_call_returning_a_c_string() -> cython.p_char:
9c_string: cython.p_char = cython.cast(cython.p_char, malloc(
10(n + 1) * cython.sizeof(cython.char)))
11
12if not c_string:
13return cython.NULL # malloc failed
14
15strcpy(c_string, hello_world)
16return c_string
17
18@cython.cfunc
19def get_a_c_string(c_string_ptr: cython.pp_char,
20length: cython.pointer(cython.Py_ssize_t)) -> cython.int:
21c_string_ptr[0] = cython.cast(cython.p_char, malloc(
22(n + 1) * cython.sizeof(cython.char)))
23
24if not c_string_ptr[0]:
25return -1 # malloc failed
26
27strcpy(c_string_ptr[0], hello_world)
28length[0] = n
29return 0
30