kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }