cython
1from libc.setjmp cimport *
2
3cdef void check_nonzero(jmp_buf ctx, int x) nogil:
4if x == 0:
5longjmp(ctx, 1)
6
7def nonzero(int x):
8"""
9>>> nonzero(-1)
10True
11>>> nonzero(0)
12False
13>>> nonzero(1)
14True
15>>> nonzero(2)
16True
17
18"""
19cdef jmp_buf ctx
20if setjmp(ctx) == 0:
21check_nonzero(ctx, x)
22return True
23else:
24return False
25
26
27from libc.string cimport strcpy
28cdef char[256] error_msg
29cdef jmp_buf error_ctx
30cdef void error(char msg[]) nogil:
31strcpy(error_msg,msg)
32longjmp(error_ctx, 1)
33
34cdef void c_call(int x) nogil:
35if x<=0:
36error(b"expected a positive value")
37
38def execute_c_call(int x):
39"""
40>>> execute_c_call(+2)
41>>> execute_c_call(+1)
42>>> execute_c_call(+0)
43Traceback (most recent call last):
44...
45RuntimeError: expected a positive value
46>>> execute_c_call(-1)
47Traceback (most recent call last):
48...
49RuntimeError: expected a positive value
50"""
51if not setjmp(error_ctx):
52c_call(x)
53else:
54raise RuntimeError(error_msg.decode())
55