fork download
  1. #include <stdio.h>
  2.  
  3. typedef int (*fnptr_t)(int a, int b);
  4.  
  5. typedef struct named_ptr {
  6. fnptr_t ptr;
  7. const char *name;
  8. } named_ptr;
  9.  
  10. named_ptr make_named_ptr(fnptr_t ptr, const char *name) {
  11. named_ptr p = {ptr, name};
  12. return p;
  13. }
  14. #define MAKE_NAMED_PTR(x) make_named_ptr(x, #x)
  15.  
  16. typedef struct cgi_object_t {
  17. char *path;
  18. int grp, r_vdom, r_global;
  19. named_ptr act;
  20. int flags;
  21. } cgi_object_t;
  22.  
  23. enum dummy {ACC_GRP_ML, VDOM_PER_VDOM, API_FLAG_NO_SCHEMA};
  24. int cgi_ml_schema(int a, int b) { return 0; }
  25. int cgi_ml_policy_svmattacktypes_get(int a, int b) { return 0; }
  26.  
  27. int main(void)
  28. {
  29. cgi_object_t cgi_machine_learning_handlers[] = {
  30. {
  31. .path = "schema",
  32. .grp = ACC_GRP_ML,
  33. .r_vdom = VDOM_PER_VDOM,
  34. .r_global = VDOM_PER_VDOM,
  35. .act = MAKE_NAMED_PTR(cgi_ml_schema),
  36. .flags = API_FLAG_NO_SCHEMA,
  37. },
  38. {
  39. .path = "policy.svmattacktypes",
  40. .grp = ACC_GRP_ML,
  41. .r_vdom = VDOM_PER_VDOM,
  42. .r_global = VDOM_PER_VDOM,
  43. .act = MAKE_NAMED_PTR(cgi_ml_policy_svmattacktypes_get),
  44. .flags = API_FLAG_NO_SCHEMA,
  45. }
  46. };
  47.  
  48. for (size_t i = 0; i < 2; ++i) {
  49. cgi_object_t *m = cgi_machine_learning_handlers + i;
  50. printf("%s is at address %p\n", m->act.name, m->act.ptr);
  51. }
  52.  
  53. return 0;
  54. }
  55.  
Success #stdin #stdout 0s 5536KB
stdin
Standard input is empty
stdout
cgi_ml_schema is at address 0x55cde55ef190
cgi_ml_policy_svmattacktypes_get is at address 0x55cde55ef1a0