6_5_2_2_09_funcptr_field_first_arg.c (875B)
1 typedef unsigned long kit_size_t; 2 3 typedef void* (*AllocFn)(void* ud, void* ptr, kit_size_t old_size, 4 kit_size_t new_size); 5 6 struct Global { 7 AllocFn alloc; 8 void* ud; 9 }; 10 11 struct State { 12 struct Global* g; 13 }; 14 15 static void* test_alloc(void* ud, void* ptr, kit_size_t old_size, 16 kit_size_t new_size) { 17 (void)ptr; 18 return old_size == 3 && new_size == 4 ? ud : (void*)0; 19 } 20 21 static void* call_alloc(struct Global* g) { 22 return (*g->alloc)(g->ud, (void*)0, 3, 4); 23 } 24 25 static void* state_alloc(struct State* s, kit_size_t size, int tag) { 26 struct Global* g = s->g; 27 return (*g->alloc)(g->ud, (void*)0, tag, size); 28 } 29 30 int test_main(void) { 31 struct Global g = {test_alloc, (void*)42}; 32 struct State s = {&g}; 33 void* p = call_alloc(&g); 34 void* q = state_alloc(&s, 4, 3); 35 return p == (void*)42 && q == (void*)42 ? 42 : 0; 36 }