#include <stdio.h>
typedef int (*fnptr_t)(int a, int b);
typedef struct named_ptr {
fnptr_t ptr;
const char *name;
} named_ptr;
named_ptr make_named_ptr(fnptr_t ptr, const char *name) {
named_ptr p = {ptr, name};
return p;
}
#define MAKE_NAMED_PTR(x) make_named_ptr(x, #x)
typedef struct cgi_object_t {
char *path;
int grp, r_vdom, r_global;
named_ptr act;
int flags;
} cgi_object_t;
enum dummy {ACC_GRP_ML, VDOM_PER_VDOM, API_FLAG_NO_SCHEMA};
int cgi_ml_schema(int a, int b) { return 0; }
int cgi_ml_policy_svmattacktypes_get(int a, int b) { return 0; }
int main(void)
{
cgi_object_t cgi_machine_learning_handlers[] = {
{
.path = "schema",
.grp = ACC_GRP_ML,
.r_vdom = VDOM_PER_VDOM,
.r_global = VDOM_PER_VDOM,
.act = MAKE_NAMED_PTR(cgi_ml_schema),
.flags = API_FLAG_NO_SCHEMA,
},
{
.path = "policy.svmattacktypes",
.grp = ACC_GRP_ML,
.r_vdom = VDOM_PER_VDOM,
.r_global = VDOM_PER_VDOM,
.act = MAKE_NAMED_PTR(cgi_ml_policy_svmattacktypes_get),
.flags = API_FLAG_NO_SCHEMA,
}
};
for (size_t i = 0; i < 2; ++i) {
cgi_object_t *m = cgi_machine_learning_handlers + i;
printf("%s is at address %p\n", m
->act.
name, m
->act.
ptr); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIGludCAoKmZucHRyX3QpKGludCBhLCBpbnQgYik7Cgp0eXBlZGVmIHN0cnVjdCBuYW1lZF9wdHIgewoJZm5wdHJfdCBwdHI7Cgljb25zdCBjaGFyICpuYW1lOwp9IG5hbWVkX3B0cjsKCm5hbWVkX3B0ciBtYWtlX25hbWVkX3B0cihmbnB0cl90IHB0ciwgY29uc3QgY2hhciAqbmFtZSkgewoJbmFtZWRfcHRyIHAgPSB7cHRyLCBuYW1lfTsKCXJldHVybiBwOwp9CiNkZWZpbmUgTUFLRV9OQU1FRF9QVFIoeCkgbWFrZV9uYW1lZF9wdHIoeCwgI3gpCgp0eXBlZGVmIHN0cnVjdCBjZ2lfb2JqZWN0X3QgewogICAgY2hhciAqcGF0aDsKICAgIGludCBncnAsIHJfdmRvbSwgcl9nbG9iYWw7CiAgICBuYW1lZF9wdHIgYWN0OwogICAgaW50IGZsYWdzOyAKfSBjZ2lfb2JqZWN0X3Q7CgplbnVtIGR1bW15IHtBQ0NfR1JQX01MLCBWRE9NX1BFUl9WRE9NLCBBUElfRkxBR19OT19TQ0hFTUF9OwppbnQgY2dpX21sX3NjaGVtYShpbnQgYSwgaW50IGIpIHsgcmV0dXJuIDA7IH0KaW50IGNnaV9tbF9wb2xpY3lfc3ZtYXR0YWNrdHlwZXNfZ2V0KGludCBhLCBpbnQgYikgeyByZXR1cm4gMDsgfQoKaW50IG1haW4odm9pZCkgCnsKCWNnaV9vYmplY3RfdCBjZ2lfbWFjaGluZV9sZWFybmluZ19oYW5kbGVyc1tdID0gewoJCXsKCQkgICAgLnBhdGggPSAic2NoZW1hIiwKCQkgICAgLmdycCA9IEFDQ19HUlBfTUwsICAKCQkgICAgLnJfdmRvbSA9IFZET01fUEVSX1ZET00sCgkJICAgIC5yX2dsb2JhbCA9IFZET01fUEVSX1ZET00sCgkJICAgIC5hY3QgPSBNQUtFX05BTUVEX1BUUihjZ2lfbWxfc2NoZW1hKSwKCQkgICAgLmZsYWdzID0gQVBJX0ZMQUdfTk9fU0NIRU1BLCAKCQl9LAoJCXsKCQkgICAgLnBhdGggPSAicG9saWN5LnN2bWF0dGFja3R5cGVzIiwKCQkgICAgLmdycCA9IEFDQ19HUlBfTUwsICAKCQkgICAgLnJfdmRvbSA9IFZET01fUEVSX1ZET00sCgkJICAgIC5yX2dsb2JhbCA9IFZET01fUEVSX1ZET00sCgkJICAgIC5hY3QgPSBNQUtFX05BTUVEX1BUUihjZ2lfbWxfcG9saWN5X3N2bWF0dGFja3R5cGVzX2dldCksCgkJICAgIC5mbGFncyA9IEFQSV9GTEFHX05PX1NDSEVNQSwgCgkJfQoJfTsKCQoJZm9yIChzaXplX3QgaSA9IDA7IGkgPCAyOyArK2kpIHsKCQljZ2lfb2JqZWN0X3QgKm0gPSBjZ2lfbWFjaGluZV9sZWFybmluZ19oYW5kbGVycyArIGk7CgkJcHJpbnRmKCIlcyBpcyBhdCBhZGRyZXNzICVwXG4iLCBtLT5hY3QubmFtZSwgbS0+YWN0LnB0cik7Cgl9CgkKCXJldHVybiAwOwp9Cg==