1 #include "libtest.h"
2 
3 EXTERN void *
pointer_null(void)4 pointer_null(void)
5 {
6   return NULL;
7 }
8 
9 EXTERN int
pointer_is_null(void * ptr)10 pointer_is_null(void *ptr)
11 {
12   return ptr == NULL;
13 }
14 
15 EXTERN int
pointer_pointer_is_null(void ** ptr)16 pointer_pointer_is_null(void **ptr)
17 {
18   return *ptr == NULL;
19 }
20 
21 static void *my_pointer;
22 
23 EXTERN void
pointer_set_my_pointer(void * ptr)24 pointer_set_my_pointer(void *ptr)
25 {
26   my_pointer = ptr;
27 }
28 
29 EXTERN void *
pointer_get_my_pointer(void)30 pointer_get_my_pointer(void)
31 {
32   return my_pointer;
33 }
34 
35 EXTERN void
pointer_get_my_pointer_arg(void ** ret)36 pointer_get_my_pointer_arg(void **ret)
37 {
38   *ret = my_pointer;
39 }
40 
41 EXTERN int
pointer_arg_array_in(char * array[3])42 pointer_arg_array_in(char *array[3])
43 {
44   return !strcmp(array[0], "one") && !strcmp(array[1], "two") && !strcmp(array[2], "three");
45 }
46 
47 EXTERN int
pointer_arg_array_null_in(char * array[3])48 pointer_arg_array_null_in(char *array[3])
49 {
50   return array[0] == NULL && array[1] == NULL && array[2] == NULL;
51 }
52 
53 EXTERN void
pointer_arg_array_out(char * array[3])54 pointer_arg_array_out(char *array[3])
55 {
56   array[0] = "four";
57   array[1] = "five";
58   array[2] = "six";
59 }
60 
61 EXTERN void
pointer_arg_array_null_out(char * array[3])62 pointer_arg_array_null_out(char *array[3])
63 {
64   array[0] = NULL;
65   array[1] = NULL;
66   array[2] = NULL;
67 }
68 
69 EXTERN char **
pointer_ret_array_out(void)70 pointer_ret_array_out(void)
71 {
72   static char *array[3] = { "seven", "eight", "nine" };
73   return array;
74 }
75 
76 EXTERN char **
pointer_ret_array_out_null_terminated(void)77 pointer_ret_array_out_null_terminated(void)
78 {
79   static char *array[4] = { "seven", "eight", "nine", NULL };
80   return array;
81 }
82 
83 EXTERN char **
pointer_ret_array_null_out(void)84 pointer_ret_array_null_out(void)
85 {
86   static char *array[3] = { NULL, NULL, NULL };
87   return array;
88 }
89 
90 EXTERN void *
pointer_pointer_pointer_to_pointer(void ** pointer_pointer)91 pointer_pointer_pointer_to_pointer(void **pointer_pointer)
92 {
93   return *pointer_pointer;
94 }
95 
96 EXTERN void**
pointer_pointer_to_pointer_pointer(void * pointer)97 pointer_pointer_to_pointer_pointer(void *pointer)
98 {
99   static void *pointer_pointer[1];
100   pointer_pointer[0] = pointer;
101   return pointer_pointer;
102 }
103 
104 typedef void *(*closure_t)(void*);
105 static closure_t my_closure;
106 
107 EXTERN void
pointer_set_closure(closure_t closure)108 pointer_set_closure(closure_t closure)
109 {
110   my_closure = closure;
111 }
112 
113 EXTERN void*
pointer_call_closure(void * value)114 pointer_call_closure(void *value)
115 {
116   return my_closure(value);
117 }
118